deploy-flake - nix flake를 원격 시스템에 배포하기 위한 실험적 도구
이 도구는 serokell/deploy-rs에서 극도로 영감을 받았으며 (어떤 면에서는 재해석한 것이기도 합니다), 만약 사용자의 원격 시스템이 중요하다면 사용해야 할 성숙한 배포 도구입니다.
두 도구 모두 Rust로 작성되었고, nix flake를 다루며, ssh를 통해 접근하는 nixos 시스템에 nix flake에 정의된 시스템 구성을 배포할 수 있게 해줍니다.
deploy-flake와 deploy-rs의 차이점
deploy-flake는 현재 몇 가지 단점과 TODO가 있습니다:
저는 이러한 모든 기능을 기능 손실 없이 구현할 방법이 있다고 생각합니다. 단지 구현의 문제입니다. (기여를 환영합니다! 그리고 저는 계속해서 개선해 나갈 것입니다...)
제가 deploy-rs보다 장점이라고 생각하는 deploy-flake의 특징은 다음과 같습니다:
-
deploy-flake는 빌드를 대상 시스템에서 실행하므로, darwin 시스템에서 nixos 구성을 배포할 때 원격 빌드 서버가 필요하지 않습니다.
-
로컬 컴퓨터에서 빌드하여 실행해야 하는 단일 바이너리만 있으면 되며, 다른 플랫폼에 대한 크로스 컴파일이 필요하지 않습니다 (아직은 아니지만, 원격으로 실행되는 모든 바이너리는 다른 cargo 프로젝트에 존재할 것이므로 개별적으로 고정(pin)하는 것이 가능합니다).
-
더 나은 시스템 활성화 과정: flake 구성은 먼저 nixos-rebuild test를 통해 적용되며, 이것이 성공했을 경우에만 nixos-rebuild boot의 동등한 방식으로 부팅 항목에 추가됩니다.
-
선택적 시스템 클로저 자체 점검 스크립트: 만약 시스템 클로저에 자체 테스트 프로그램을 작성하기 위해 system.extraSystemBuilderCmds를 사용한다면, deploy-flake는 --pre-activate-script=relative-pathname 옵션을 통해 이를 선택적으로 호출할 수 있으며, 해당 프로그램이 0이 아닌 상태 코드를 반환하면 장치에 배포를 시작하지 않습니다. 시스템 구성이 preroll-safety를 사용한다면, 이 스크립트는 기본적으로 감지되어 자체 점검에 자동으로 사용됩니다.
-
테스트 프로세스를 백그라운드에서 실행하는 더 나은 방식: 이는 systemd-run을 사용하여 활성화를 systemd 유닛으로 생성하므로, 제어 프로세스가 어느 시점에서 연결이 끊어져도 배포가 계속될 수 있도록 합니다.
-
병렬 처리(Parallelism): 한 번의 호출로 여러 호스트에 하나의 flake를 병렬로 배포할 수 있습니다.
설정하기 (Setting up)
deploy-flake를 flake 정의와 함께 실행하려면, 다음 입력을 flake.nix에 추가하세요:
inputs = {
# ...
deploy-flake = {
...
그리고 플랫폼의 출력을 위해 다음을 추가하세요(이 절에는 flake-utils를 사용하는 것이 좋을 것입니다):
outputs =
{
#...
, deploy-flake
...
사용법 (Usage)
flake.nix에 설정한 후에는 다음과 같이 deploy-flake를 호출할 수 있습니다:
$ nix run ./#deploy-flake -- destination-host1 nixos://destination-host2/webserver
이는 flake의 스냅샷을 호스트 destination-host1과 destination-host2에 복사하고, 빌드 및 활성화하며, 성공할 경우 부팅되도록 구성을 설정합니다. 이 모든 과정이 병렬로 이루어집니다.
실패 처리 (Dealing with failure)
배포가 실패할 수 있는 몇 가지 이유가 있습니다. 가장 일반적이고 중요한 두 가지에 대해 설명하겠습니다.
배포 시작 전 시스템 상태가 건강하지 않은 경우 (System is not healthy before the deploy starts)
deploy-flake는 시스템 구성 변경을 적용하기 전에 실행 중인 시스템이 running 상태에 있어야 한다고 가정합니다 (이는 systemctl status로 확인 가능). 이는 약간 손상된 시스템에 배포하는 것이, 이전에 작동하던 유닛들을 시작하거나 재시작하려고 시도하여 더 큰 피해를 입히는 경우로부터 사용자를 보호하기 위함입니다.
deploy-flake가 System is not healthy. 메시지와 함께 중단되면, 실행 중인 시스템에는 아직 변경 사항이 발생하지 않았습니다. 현재 오류 상태에 있는 유닛 목록을 볼 수 있으며 (원격 시스템에서 systemctl list-units --failed를 실행하여 동일한 목록을 검색할 수 있습니다), 필요한 조치를 취해 유닛들을 다시 작동하게 하십시오 (재시작하거나, 중지시키거나, systemctl reset-failed를 사용하거나 시스템을 재부팅합니다). 그런 다음 배포를 다시 시도하십시오.
새 시스템 구성 적용 실패
더 위험하고 성가신 종류의 실패는 실행 중인 시스템을 변경하는 단계(즉, nixos-rebuild test 단계)에서 발생합니다. 어떤 이유로든 유닛들이 재시작에 실패할 수 있으며, 만약 그렇게 되면 대상 시스템에서 잠길 수도 있습니다 (예: ssh나 네트워크가 다시 작동하지 않을 경우).
갇히게 되더라도 반가운 소식은