이 머신은 NixOS를 실행합니다. 모든 시스템 구성은 anixpkgs 저장소에 있으며, ~/sources/anixpkgs (표준)에 클론되어 있고, 다른 경로 (예: /data/andrew/dev/claude/sources/anixpkgs)에도 있을 수 있습니다. 현재 트리는 flake 구성을 통해 배포됩니다. anix-upgrade는 이전 트리를 위해 채널 기반 경로를 유지합니다.
워크플로우
- 편집 —
pkgs/아래의 관련 Nix 모듈 또는 Python/shell 스크립트를 수정합니다. - 새 파일 스테이징 —
git-cc(anix-upgrade에서 사용)는 추적된 파일만 복사합니다 (git ls-files). 새 파일은 먼저git add해야 하며, 그렇지 않으면 빌드에서 조용히 빠집니다. - 배포 — 로컬
anix-upgrade-uiAPI를 통해 (권장) 스트리밍이 완료될 때까지 실행합니다:머신의upgrade_host="$(hostname).local" curl -si "http://${upgrade_host}/anix-upgrade/api/v1/run" -X POST \ -H 'Content-Type: application/json' \ -d '{"source": "/path/to/anixpkgs", "local": true}' # 202 → {"run_id": "<uuid>", "started": true}; 409 → 이미 실행 중 curl -N "http://${upgrade_host}/anix-upgrade/api/v1/stream/<run_id>" # [UPGRADE SUCCESSFUL] 또는 [UPGRADE FAILED (exit N)], 그리고 [DONE]으로 종료.local호스트네임을 사용하세요.localhost가 아닙니다. nginx는 이 라우트를 머신별 가상 호스트에서만 노출합니다. CLI 대체 (API에 연결할 수 없는 경우에만):anix-upgrade --local -s /path/to/anixpkgs. - 테스트 — 이 머신에서 결과를 커밋하기 전에 테스트합니다.
변경 사항이 서비스 패키지나 NixOS 모듈을 건드릴 때는 "local": true가 필수입니다. 그렇지 않으면 anix-upgrade가 dependencies.nix에서 local-build = false로 남겨두어 모듈의 cfg.package 기본값이 게시된 태그 바이너리로 해석되어 변경 사항이 조용히 적용되지 않습니다.
중요한 주의사항
- NixOS 모듈은 올바른 위치에 import되어야 합니다 (예:
pc-base.niximports 목록). 파일을 추가하는 것만으로는 충분하지 않습니다. - 새 옵션은
pkgs/nixos/components/opts.nix에 선언하고pc-base.nix에서 할당한 후base-dev-pkgs.nix와 같은 컴포넌트에서 사용해야 합니다. - MCP 서버는 사용자별로
claude mcp add -s user ...로 등록됩니다.claude-setup스크립트 (base-dev-pkgs.nix에 있음)가 이를 처리하며, 서버를 추가한 후 다시 실행해야 합니다.
다른 머신에 배포 / API 참조
동일한 API가 anix-upgrade-ui를 호스팅하는 모든 머신에서 실행됩니다: http://<hostname>.local/anix-upgrade/api/v1/ (인증 불필요). run 본문 필드 (모두 선택 사항): version, commit, branch, source (로컬 경로), local, boot — anix-upgrade 플래그와 동일한 의미. -si를 사용하여 응답 헤더를 표시하세요 (일부 프록시는 -s JSON 본문을 제거합니다).
원격 머신의 경우 먼저 푸시하고 commit (전체 해시)을 전달하세요. branch가 아닙니다. 브랜치 tarball은 CDN에 캐시되어 --tarball-ttl 0을 사용해도 몇 분 동안 오래된 상태일 수 있습니다. 반면 커밋 해시는 콘텐츠 주소 기반 fetchGit을 사용하여 CDN을 우회합니다:
curl -si -X POST http://<hostname>.local/anix-upgrade/api/v1/run \
-H 'Content-Type: application/json' \
-d "{\"commit\": \"$(git rev-parse HEAD)\", \"local\": true}"
실행 모니터링 (run_id는 새 실행이 시작되면 404를 반환하므로 다시 트리거하기 전에 로그를 가져오세요):
curl -s .../api/v1/status/<run_id> | jq . # 상태: running|success|failed
curl -N .../api/v1/stream/<run_id> # SSE: 마지막 512KB 재생 후 실시간
curl -o upgrade.log .../api/v1/log/<run_id> # 전체 로그
실행은 http://<hostname>.local/anix-upgrade/의 브라우저 UI에 via API 배지와 함께 나타납니다. 머신당 한 번에 하나의 실행만 가능합니다 (API와 수동 UI가 서로 차단합니다).