Caddy — moderný reverse proxy s automatickým TLS
Caddy je open-source webserver a reverse proxy napísaný v jazyku Go, ktorý sa odlišuje od nginx/Apache jednou výraznou vlastnosťou: TLS funguje out-of-the-box bez konfigurácie. Stačí v Caddyfile napísať doménu a Caddy si sám vyžiada certifikát od Let's Encrypt (alebo ZeroSSL), renewne ho a presmeruje HTTP → HTTPS.
V roku 2026 je Caddy najpopulárnejšia voľba pre side-projects, malé/stredné produkčné nasadenia a všetko, kde nginx config začína bolieť.
1. Prečo Caddy namiesto nginx
| Vec | nginx | Caddy |
|---|---|---|
| TLS | Manuálny certbot + cron-renew | Automatický, žiadna konfigurácia |
| Konfigurácia | Direktívne, custom DSL | Direktívne, čistejšie syntax |
| HTTP/3 | Vyžaduje modul + custom build | Defaultne zapnuté |
| Live reload | nginx -s reload |
caddy reload (atomický) |
| Plugin ecosystem | Statické moduly v build-e | Dynamické s xcaddy build |
| Default security headers | Manuálne | Sane defaults (HSTS, secure cookies) |
Nginx je rýchlejší pri veľmi vysokej záťaži (> 100k req/s) a má lepšie load-balancing features. Caddy je rýchlejší na napísanie a má lepšie defaults pre 99% prípadov.
2. Caddyfile za 60 sekúnd
myapp.example.com {
reverse_proxy localhost:3000
}
api.example.com {
reverse_proxy backend1:8080 backend2:8080 {
lb_policy round_robin
health_uri /healthz
health_interval 10s
}
header {
Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"
X-Content-Type-Options "nosniff"
X-Frame-Options "DENY"
}
}
static.example.com {
root * /var/www/static
file_server
encode gzip zstd
}
Žiadne server {} bloky, žiadne listen 443 ssl http2 http3, žiadne ssl_certificate /etc/letsencrypt/.... Caddy si všetko vyrieši sám.
Reload: caddy reload --config /etc/caddy/Caddyfile — atomický, bez výpadku existujúcich spojení.
3. Automatické HTTPS — ako to vlastne funguje
Pri prvom requeste na novú doménu:
- Caddy zistí, že nemá certifikát.
- Cez ACME protokol (HTTP-01 alebo TLS-ALPN-01 challenge) požiada Let's Encrypt.
- Uloží certifikát do
/data/caddy/certificates/(alebo$XDG_DATA_HOME/caddy). - Auto-renew 30 dní pred expirovaním — žiaden cron.
Pre DNS challenge (potrebné pri wildcard certifikátoch alebo za Cloudflare proxy) treba dns provider plugin:
xcaddy build --with github.com/caddy-dns/cloudflare
A v Caddyfile:
*.example.com {
tls {
dns cloudflare {env.CLOUDFLARE_API_TOKEN}
}
reverse_proxy localhost:3000
}
4. Pluginový ekosystém
Caddy moduly sa zapínajú v compile-time cez xcaddy build:
- caddy-dns/* — DNS providers pre Let's Encrypt DNS-01 (cloudflare, route53, gandi…).
- caddy-ratelimit — rate limiting (per-IP, per-token).
- caddy-security — JWT, OAuth, SAML auth, forward-auth.
- caddy-cache-handler — HTTP cache (alternatíva k Varnish).
- caddy-prometheus — metriky export.
- caddy-l4 — Layer 4 (TCP/UDP) reverse proxy s SNI routovaním.
- caddy-trojan — Trojan/VLESS proxy.
xcaddy build \
--with github.com/caddyserver/caddy-ratelimit \
--with github.com/caddy-dns/cloudflare \
--output /usr/local/bin/caddy
5. Bežné patterns
TLS pre lokálny development:
local.example.test {
tls internal
reverse_proxy localhost:3000
}
Caddy spraví self-signed certifikát a sám sa vloží do system trust store.
Header forward pre downstream app:
app.example.com {
reverse_proxy localhost:3000 {
header_up X-Real-IP {remote_host}
header_up X-Forwarded-Proto {scheme}
}
}
Forward-auth (SSO):
admin.example.com {
forward_auth localhost:8080 {
uri /auth/verify
copy_headers X-User-Email X-User-Role
}
reverse_proxy localhost:3000
}
Static file server s long-cache:
cdn.example.com {
root * /var/www/assets
file_server
@longcache path *.js *.css *.png *.svg *.woff2
header @longcache Cache-Control "public, max-age=2592000, immutable"
}
6. Operational gotcha
caddy reload --forceje nebezpečný — preruší aktuálne spojenia. Na produkcii vždy ibacaddy reload(graceful).- ACME rate limity Let's Encrypt — 50 cert/týždeň per registered domain. Pri masívnom škálovaní treba alebo wildcard certifikát alebo iný CA (ZeroSSL ako fallback).
- Default
auto_https offti vypne aj redirect HTTP → HTTPS — používaj selektívne. - JSON config vs Caddyfile — Caddyfile je high-level abstrakcia, JSON je native config. Pre veľmi pokročilé prípady (dynamický config cez API) sa neoplatí ostať pri Caddyfile.
- HTTP/3 udp port 443 musí byť otvorený na firewalle (osobitne od TCP 443).
7. Caddy v kombinácii s ostatnými nástrojmi
- Dokku —
dokku-caddyplugin nahrádza default nginx. Automatický TLS, jednoduchšia konfigurácia per-app. - Tailscale — Caddy v Tailscale sieti môže používať
tls internal+bindna 100.64.0.0/10 adresu pre intra-mesh HTTPS bez verejných certifikátov. - Kubernetes —
caddy-ingress-controllernamiesto nginx-ingress. Vyžaduje hooks pre acme storage. - Cloudflare — pri proxy mode "Orange Cloud" treba DNS challenge (HTTP-01 nefunguje cez Cloudflare proxy).
- Prometheus —
caddy-prometheusmodul exposuje/metricsendpoint s request/response latency histograms.
Súvisiace témy
- Reverse-Proxy — všeobecné pojmy (load balancing, X-Forwarded-*).
- TLS-SSL — krypto stack pod automatickým HTTPS.
- Dokku — častý kompánión pre PaaS-style deploy s Caddy ako front.
- Nginx — etablovaná alternatíva s odlišnými trade-offmi.
- Zero-Trust-Security — forward-auth pattern v Caddy.