# MAESTRO を HTTPS で公開するための Caddy 設定 # # Cloudflare の DNS-01 チャレンジでワイルドカード証明書を取り、TLS を Caddy 側で # 終端して MAESTRO へ平文で中継する。MAESTRO 本体の TLS は切っておくこと # (二重終端になる)。詳細は docs/operations/caddy-cloudflare-tls.html。 # # 値は .env.caddy から環境変数として渡る。書式は {$NAME} が Caddy の設定読み込み # 時の置換、{env.NAME} が実行時の参照。API トークンは設定ファイルに展開させない # ため後者を使う。 # ワイルドカード証明書の対象。MAESTRO_BASE_DOMAIN=example.com なら # *.example.com の証明書を 1 枚取り、その下のホスト名をここで捌く。 # maestro.home.example.com を使うなら MAESTRO_BASE_DOMAIN=home.example.com。 # (ワイルドカードが覆うのは 1 ラベル分だけ) *.{$MAESTRO_BASE_DOMAIN} { tls { # Cloudflare の API トークン。必要な権限は対象ゾーンに絞った # Zone.Zone:Read と Zone.DNS:Edit の 2 つ。 dns cloudflare {env.CLOUDFLARE_API_TOKEN} # 発行時の TXT レコード確認に使う名前解決先。手元の DNS が # 同じ名前を別の答えで返す構成 (split-horizon) だと、この指定が # 無いと発行が通らないことがある。 resolvers 1.1.1.1 1.0.0.1 } # --- MAESTRO 本体 ------------------------------------------------------- # コンテナ内の待ち受けは 9876 固定 (docker-compose.yml の environment で # PORT=9876 を渡しているため、.env では変えられない)。 @maestro host {$MAESTRO_HOSTNAME} handle @maestro { reverse_proxy maestro:9876 } # --- AAO ゲートウェイ (使っている人だけ) -------------------------------- # ゲートウェイは MAESTRO 本体とは別のポートで待ち受ける (既定 4000)。 # 同じプロセスで動かしていても口は別なので、通すならここも要る。 # GATEWAY_HOSTNAME を設定しない場合、この matcher は予約済みの .invalid # ドメインに当たるので実際のリクエストとは一致しない = 無効のまま。 # # 既定値つきの置換が効くのは「未設定のとき」だけ。.env.caddy に # `GATEWAY_HOSTNAME=` と等号だけ書くと空文字が入り、Caddy は # module value cannot be null で起動しない。同様に # `GATEWAY_UPSTREAM_PORT=` は maestro:80 への中継になる (無警告)。 # 使わないキーは行ごとコメントアウトしたままにすること。 # # GATEWAY_HOSTNAME は MAESTRO_BASE_DOMAIN の 1 つ下の階層にすること。 # 別ドメインや 2 階層下だと証明書もこの site block も覆わないので、 # そのホスト名は無反応になる (Caddy は何も言わない)。 @gateway host {$GATEWAY_HOSTNAME:gateway.invalid} handle @gateway { reverse_proxy maestro:{$GATEWAY_UPSTREAM_PORT:4000} } # --- 上のどれにも当たらないホスト名 ------------------------------------- # ワイルドカード証明書は同じ階層のホスト名すべてに当たるので、 # 明示していない名前は中に通さない。 handle { abort } } # 証明書の期限通知を受け取りたい場合は、このファイルの先頭 (site block より前) # に次の global options block を足す: # # { # email you@example.com # } # # 空の値は書けない (引数なしと解釈されて起動に失敗する) ため、環境変数では # なく直接書くか、使わないなら block ごと省くこと。 # # 初回の試し撃ちには Let's Encrypt の検証用エンドポイントを使うとよい。 # 同じ global options block に次の 1 行を足すと、発行の失敗が本番の回数制限に # 当たらなくなる (証明書はブラウザに信頼されないので、通ったら消して再起動): # # acme_ca https://acme-staging-v02.api.letsencrypt.org/directory