シークレット
Composia は age 暗号化を使用して期待状態リポジトリ内の暗号化シークレットファイルを管理します。暗号化と復号はコントローラー上で行われます。エージェントは age 秘密鍵に一切アクセスしません。
設定
シークレットには age 鍵ペアが必要です。コントローラー設定で設定します:
controller:
secrets:
provider: age
identity_file: "/app/configs/age-identity.key"| キー | 型 | 必須 | 説明 |
|---|---|---|---|
provider | string | はい | age である必要があります。 |
identity_file | string | はい | age 秘密鍵ファイルへのパス。 |
recipient_file | string | いいえ | age 受信者(公開鍵)を含むファイルへのパス。省略した場合、受信者は秘密鍵から導出されます。 |
armor | bool | いいえ | ASCII アーマー出力を使用します。デフォルトは true。 |
鍵ペアの生成:
age-keygen -o age-identity.keyオプション: 公開鍵を受信者として抽出:
age-keygen -y age-identity.key > age-recipients.txtシークレットの保存方法
リポジトリ内のシークレットファイルは慣例として .enc 拡張子を持ちます。age 暗号化された暗号文として保存されます:
my-app/
├── docker-compose.yaml
├── composia-meta.yaml
└── .secret.env.enc (age で暗号化)コントローラーは書き込み時に平文を暗号化し、読み取り時に復号します。リポジトリには暗号文のみが含まれます。シークレットがリポジトリ内、タスクログ内、またはエージェントへの転送中に平文で現れることはありません。
シークレットがエージェントに届く仕組み
デプロイまたは更新タスクのレンダリングステップ中に、コントローラーは:
- リポジトリ内のサービスディレクトリから暗号化ファイルを読み取ります。
- age 秘密鍵を使用して各ファイルを復号します。
.enc接尾辞を削除し、復号した内容を実行時ファイル名で注入します。たとえば.secret.env.encは.secret.envになります。
バンドルはエージェントレポート接続を通じてエージェントにストリーミングされます。エージェントはバンドルをディスクに書き込み、docker compose up を続行します。復号されたシークレット環境は、エージェントが秘密鍵を見ることなく Compose サービスから利用可能になります。
composia-meta.yaml のファイル参照には .env.enc のようなリポジトリ名を使用し、Composia が実行時の利用前に .env へ変換します。Compose ファイル、Caddyfile、スクリプト内では実行時名 .env を直接使用します。
CLI の使用
暗号化シークレットファイルの書き込み:
composia service my-app edit .secret.env.encシークレットファイルの読み取りと復号:
composia repo get my-app/.secret.env.encシークレットのインプレース編集(エディタが開きます):
composia repo update --file ./local-plain.env my-app/.secret.env.encすべてのシークレット書き込み操作には、同時変更との競合を防ぐためのベースリビジョンチェックが含まれます。
ファイルパスのルール
シークレットファイルのパスは:
- サービスディレクトリからの相対パス(絶対パスではない)である必要があります。
../のようなパス横断シーケンスを含んではいけません。- サービスディレクトリ内のファイルを指す必要があります。
コントローラーはサービスを見つけ、サービスディレクトリからの相対パスとしてファイルパスを解決し、リポジトリファイルに対して操作を行います。
エラー条件
- シークレット未設定:
.encへの Repo アクセスはFailedPreconditionを返します。 - ファイルが見つからない:
GetRepoFileはNotFoundを返します。 - ベースリビジョン競合:
UpdateRepoFileは CAS でリポジトリ HEAD を保護します。