# --------------------------------------------------------------------------- # MAESTRO + Caddy リバースプロキシ (Cloudflare DNS-01 でワイルドカード証明書) # # ベースの docker-compose.yml に重ねて使う。単体では動かない。 # # cp .env.caddy.example .env.caddy # 編集して Cloudflare トークンを入れる # docker cp maestro:/app/config.yaml ./config.yaml # 先に必ずやること (下記) # docker compose -f docker-compose.yml -f docker-compose.caddy.yml up -d --build # # 重ねない (`docker compose up` のまま) 既定の構成は一切変わらない。 # 手順書: docs/operations/caddy-cloudflare-tls.html # # 必要な Docker Compose: v2.24 以上。これはベースファイルの env_file 記法 # (path: / required:) が要求する条件で、下の `!reset` 自体はそれより前の版から # 使える。 # --------------------------------------------------------------------------- services: maestro: # 前段に Caddy を置くので、MAESTRO 自身のポートはホストに出さない。 # # profiles ではこれができない。ports は {ip, target, published, protocol} # を一意キーとして「追記」されるだけで、別サービスの公開を取り消す手段が # 無いため。`!reset` は重ねたファイルから元の値を消すための Compose の # 仕組み。(`!override []` でも同じ結果になる) ports: !reset [] volumes: # config.yaml をホスト側に置く。これを重ねると maestro サービスの構成が # 変わるのでコンテナが作り直され、イメージ内の config.yaml は初期状態に # 戻る。プロキシ構成では auth.secure_cookie を書くのが必須なので、 # 書いた先が消えないようここで永続化する。 # # 【重要】起動する前に、ホスト側の ./config.yaml を用意すること。 # 無いまま起動すると Docker が config.yaml という名前の「ディレクトリ」を # 作る。MAESTRO はそれを読もうとして失敗するが、この失敗では止まらず、 # 認証設定を持たない状態で読み込まれる。パスワードを持つローカル管理者が # いる環境と新規インストールは起動を拒否するが、OAuth だけの環境は # 認証なしで起動してしまう。既に動いている環境なら重ねる前に # docker cp maestro:/app/config.yaml ./config.yaml # で取り出す。新規なら `config_version: 2` の 1 行だけのファイルでよい。 # # 【OAuth を使っている場合はとくに注意】退避せずに起動すると認証設定ごと # 消える。OAuth だけの環境では自動復旧が働かず、認証がかかっていない状態で # 立ち上がる (エージェントは Bash を持つので実質的に遠隔からの任意コード # 実行になる)。上のディレクトリ誤作成も同じ結末に行き着く。 # # :ro を付けないこと。設定画面からの保存が書き込むため。コンテナ内の # MAESTRO は node (UID 1000) で動くので、その UID から書ける所有者に # しておくこと。 # # ベースの docker-compose.yml で /app/config.yaml に別のホストパスを # 渡している場合、この行が勝ってそちらの指定は黙って捨てられる。 # パスを揃えるか、この行を自分のパスに書き換えること。 - ./config.yaml:/app/config.yaml caddy: build: context: ./deploy/caddy dockerfile: Dockerfile image: maestro-caddy:latest container_name: maestro-caddy restart: unless-stopped depends_on: - maestro ports: - "80:80" # HTTP→HTTPS リダイレクト用。DNS-01 なので発行には不要 - "443:443" - "443:443/udp" # HTTP/3 # Cloudflare のトークンとホスト名はここだけに置く。ベースの .env は # maestro サービスの env_file なので、そちらに書くとエージェントが # 動くコンテナの環境変数に入ってしまう (Bash ツールから読める)。 env_file: - .env.caddy volumes: - ./deploy/caddy/Caddyfile:/etc/caddy/Caddyfile:ro # 取得済みの証明書と ACME アカウント鍵。消すと再発行になり、 # Let's Encrypt の発行回数制限に当たりうるので必ず永続化する。 - caddy-data:/data - caddy-config:/config volumes: caddy-data: driver: local caddy-config: driver: local