Infra Ops Hub

Caddy の SSL 自動更新で詰まるポイント

最終更新: 2026-04-24 · 所要 5 分

結論

  • Caddyfile に書いたドメインが実際に 80/443 に到達できていない
  • Cloudflare 前段では HTTP-01 が通らないので DNS-01 へ
  • reload ではなく restart が必要なケースがある

どういう場面で必要か

Caddy を auto HTTPS で立てたが、証明書取得に失敗して HTTP 200 ではなく 502 を返している時。

実務で見るポイント

  • caddy validate で設定ファイル正当性を確認
  • journalctl -u caddy -f で acme client ログを流し見
  • Cloudflare 前段の場合は tls { dns cloudflare {env.CF_API_TOKEN} } を追加
  • Caddyfile の global options で email を設定し ACME アカウント通知
  • systemctl reload caddy で設定再読込、駄目なら restart

よくある失敗

  • Caddyfile で wildcard を使おうとして HTTP-01 で失敗(wildcard は DNS-01 必須)
  • ファイアウォールで 443 は開いてるが 80 を閉じて HTTP-01 失敗
  • Docker 内 Caddy で volume mapping 不足のため ACME credentials が永続化されない
  • Cloudflare Full (Strict) モードで 2 重 SSL になっている

チェックリスト

  • [ ] caddy validate 成功
  • [ ] 80 / 443 がインターネットから到達
  • [ ] /data/caddy(または相当のディレクトリ)が永続化
  • [ ] Cloudflare 経由なら SSL/TLS モードを Full (Strict) に
  • [ ] /tools/ssl-check で validTo を確認

よくある質問

Caddy が Let's Encrypt ではなく ZeroSSL を使う

デフォルトで両方試しますが、先に成功した方を使います。tls { ca https://acme-v02.api.letsencrypt.org/directory } を指定すれば固定可能。

コンテナを作り直すと証明書が再発行される

/data/caddy を volume にしていないためです。volume mount を追加すれば解消。

Docker Compose + Caddy + WordPress の例はありますか?

/tools/docker-compose のプリセットに Caddy + WordPress があります。

証明書が古いままの対処は?

caddy reload で強制再読込、または caddy run-journald で再起動してログを見る。

関連ツール・比較・ガイド

SSL / Domain

このテーマの関連ページ