🧭

NixOS を自動でデプロイする (comin)

に公開

書いてあること

  • Comin とは?
  • 基本的な使い方
  • 他の方法との比較
  • 引っかかったところ
    • fetch したコミットを適用してくれない
  • まとめ

Comin とは?

https://github.com/nlewo/comin

comin は、 NixOS の pull 型自動デプロイツールです。

NixOS の設定を GitHub などで管理している場合、設定を変更するたびに各サーバーに SSH して nixos-rebuild switch を実行する必要があります。サーバーが増えると、この手作業がかなり手間になってきます。

comin を使えば、リモートリポジトリの変更を自動的にポーリングして取得し、変更があればデプロイを実行してくれます。リポジトリに push するだけでサーバー側が自動的に設定を更新してくれるため、複数サーバーの管理が格段に楽になります。

基本的な使い方

設定を記述

flake.nix に github:nlewo/comin を入力として追加します。

# flake.nix
{
+ inputs.comin.url = "github:nlewo/comin";
  outputs = { self, nixpkgs, comin, ... }@inputs: {
    nixosConfigurations = {
      myserver = nixpkgs.lib.nixosSystem {
        modules = [
+          ./system/comin.nix
          # ... 他のモジュール
        ];
      };
    };
  };
}

system/comin.nix を作成して comin サービスを設定します。

# system/comin.nix
{
  imports = [ inputs.comin.nixosModules.default ];
  
  services.comin = {
    enable = true;
    remotes = [{
      name = "origin";
      url = "https://github.com/your/infra.git";
      branches.main.name = "main";
      poller.period = 60; # 60秒ごとにポーリング
    }];
  };
}

設定を適用

git add -A -N # git にファイルをトラックさせ、flake から見えるようにする
sudo nixos-rebuild switch --flake .#myserver

# サービスが正常に起動しているか確認
systemctl status comin

デプロイが失敗したときのログ確認

デプロイが失敗したときは、ログを確認します。 journalctl で確認することができます。

# comin サービスのログをリアルタイムで確認
journalctl -u comin -f

# または、最近のログを確認
journalctl -u comin -n 100

他の方法との比較

プッシュ型のデプロイツールと異なり、サーバー側から能動的にリポジトリをチェックするため、ポートを開放したりする必要がなく、設定が簡単です。セキュリティ面でも安心です。
また CD の設定に各ホストの適用スクリプトを書く必要がないので、ホストが増えても管理が簡単です。

一方で、エラー通知や即時適用などは難しいので、細かい制御が必要な場合は、deploy-rs などの push 型 CD ツールや、GitHub Action から SSH する方法も選択肢になります。

引っかかったところ

fetch したコミットを適用してくれない

新しいコミットを push したのにデプロイされないという状況に遭遇したことがあります。ログも "New commit has been fetched" と言うだけで特に何も書かれていません。

調べてみると、force push していたことが原因でした。comin は main ブランチに force push されたコミットを拒否するというデザインになっています。

https://github.com/nlewo/comin/blob/main/docs/design.md

The comin goal is to

  • refuse commits push-forced to main branches

履歴が一致しないとデプロイしないため、一度でも force push で履歴を書き換えると以降のコミットはデプロイされなくなります。

これは意図的な設計で、安全のための仕様です。ただし、うっかり force push してしまうとデプロイが行われなくなってしまいます。

解決方法: main に force push してしまった場合、以下のコマンドで comin の状態をリセットして再起動します。

sudo rm -rf /var/lib/comin
sudo systemctl restart comin

まとめ

comin を使うことで、NixOS の設定管理が格段に楽になります。GitHub に push するだけで、複数サーバーの設定を自動更新できるのは非常に便利です。

細かい設定やその他の機能については、comin の公式ドキュメントを参照してください: https://github.com/nlewo/comin

Discussion