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 で再起動してログを見る。