Skip to content
ssldays

Guide

Reload Caddy after SSL certificate renewal

After ACME or manual renewal updates Caddy storage, run validate and reload so the public listener serves new serials strangers verify on port 443.

Updated May 30, 2026 803 words

reload caddy ssl certificate discipline closes the gap between successful renewal logs and the serial strangers still see when workers never picked up new material.

Caddy can write fresh certificates to its data directory while long-lived connections and in-memory TLS state continue serving the previous chain until reload. Automatic HTTPS makes this easy to miss: obtain success lines appear in journald without an explicit hook reminding operators to signal the process.

This guide standardizes validate-then-reload steps, post-reload openssl acceptance tests, and automation patterns. If renewal itself failed, fix ACME first via Caddy automatic HTTPS renewal failed before chasing reload symptoms.

Compare also with Nginx reload after Certbot renew when Caddy sits behind another terminator that also needs signaling.

What to check

Confirm renewal actually changed on-disk assets or admin API certificate metadata. Compare file mtimes or admin listings against the serial from an external openssl handshake.

Verify configuration still validates: a syntax error blocks reload while cron or a sidecar already logged obtain success. Check whether multiple Caddy instances exist behind a load balancer; each peer needs reload after shared storage updates.

Identify pinned manual tls paths: renewal may have updated automatic storage while the site block still serves old PEMs until paths and reload align.

Capture whether Kubernetes rolled pods instead of in-place reload—both can work, but only if every endpoint received the new Secret or volume snapshot.

Step-by-step

Baseline serial

HOST=www.example.com
echo | openssl s_client -connect "${HOST}:443" -servername "${HOST}" 2>/dev/null \
  | openssl x509 -noout -serial -dates

Validate configuration

caddy validate --config /etc/caddy/Caddyfile

For JSON configs, point --config at the active file path your unit uses.

Reload Caddy

caddy reload --config /etc/caddy/Caddyfile
# systemd alternative when wrapped:
systemctl reload caddy

Watch logs during reload:

journalctl -u caddy -n 50 --no-pager

Confirm presentation changed

echo | openssl s_client -connect "${HOST}:443" -servername "${HOST}" 2>/dev/null \
  | openssl x509 -noout -serial -dates

Serial should differ from the baseline unless you reinstalled the same issuance intentionally.

Hook automation (optional)

Add post-renew scripts in your orchestration layer that call validate and reload, then curl or openssl from an external vantage. Tie hooks to the same config path production uses.

How to read the output

caddy validate exit code zero means reload may proceed. Non-zero output names the line blocking reload; fix before signaling.

journalctl after reload should show config applied without TLS load errors. Permission errors on keys indicate user mismatch even when reload succeeded partially.

Openssl serial after reload is the definition of done. Matching pre-reload serial with updated mtimes on disk proves reload gap or wrong instance behind the load balancer.

systemctl reload versus caddy reload should target the same process tree; mixed packaging occasionally installs duplicate binaries.

Common mistakes

Assuming automatic HTTPS reloads itself without an explicit signal in all deployment modes. Reloading only one node in a pool while traffic still hits peers with old memory state.

Running reload before renewed PEMs land on shared storage replicated slowly across AZs. Validating against localhost admin names while customers hit marketing hostnames on different site blocks.

Using full restart during peak traffic without testing impact on long polling or WebSocket sessions when graceful reload would suffice.

Forgetting reload after certbot on the host while Caddy still references manual paths copied earlier in the quarter.

Ansible playbooks that copy PEMs but notify only on template changes may skip reload when certbot updates symlink targets without touching destination strings in variables. Add explicit handlers tied to renewal success signals.

Blue-green Caddy deployments need reload on both colors before traffic shifts, or keep passive nodes offline until their listeners show matching serials. Load balancers that round-robin early expose half-old TLS states that confuse synthetic monitoring.

Define reload caddy ssl certificate success in service level objectives as serial change within five minutes of obtain logs, not merely absence of process restarts. Objective language aligns platform and application teams on measurable acceptance.

Corporate proxies on operator laptops can mask successful reload verification when curl trusts a custom root. Run external openssl from automation runners in the same network path customers use.

On-call runbooks should list the config path production systemd uses, not only the path in documentation repos. Symbolic links and drop-in overrides frequently surprise responders during pager events.

Game days that simulate obtain success without a reload step train teams to recognize presentation gaps quickly. Inject reload omissions deliberately in tabletop scenarios.

Executive dashboards counting successful renewals without reload verification inflate confidence. Pair renewal counters with external serial monitors so leadership sees both halves of the pipeline.

When to use automation

Treat reload verification as part of renewal success criteria, not optional cleanup. SSLdays external checks detect when reload caddy ssl certificate steps were skipped because serials stay flat despite calendar renewal.

Monitor live TLS at 30, 14, 7, and 1 days and after every change window. Pair with RDAP domain expiration for names tied to corporate approval workflows. Email alerts ship on all plans; Slack and Discord webhooks on paid tiers integrate with hourly checks.

Run /check within minutes of each reload, then keep hostnames on /register so drift between obtain and presentment triggers before user-visible expiry.

Frequently asked questions

Do deploy hooks replace manual reload?

Only if your pipeline actually calls reload on every production instance. Test hooks with dry-run renewals quarterly.

Kubernetes without exec access?

Rolling pods after Secret updates works if every replica mounts the new material. Ensure readiness probes hit HTTPS when applicable.

Can reload break HTTP/3?

Test QUIC endpoints after reload if enabled; most sites recover gracefully but validate critical apps.

What if validate passes but openssl serial unchanged?

Traffic may hit another layer, wrong site block paths, or unreloaded peer. Map DNS to backends and repeat reload on each Caddy instance serving that name.

Monitor this hostname on a schedule

Live certificate checks and renewal reminders — not guesswork from PEM files.