🟢 Beginner

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:

  1. Caddy zistí, že nemá certifikát.
  2. Cez ACME protokol (HTTP-01 alebo TLS-ALPN-01 challenge) požiada Let's Encrypt.
  3. Uloží certifikát do /data/caddy/certificates/ (alebo $XDG_DATA_HOME/caddy).
  4. 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 --force je nebezpečný — preruší aktuálne spojenia. Na produkcii vždy iba caddy 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 off ti 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

  • Dokkudokku-caddy plugin nahrádza default nginx. Automatický TLS, jednoduchšia konfigurácia per-app.
  • Tailscale — Caddy v Tailscale sieti môže používať tls internal + bind na 100.64.0.0/10 adresu pre intra-mesh HTTPS bez verejných certifikátov.
  • Kubernetescaddy-ingress-controller namiesto nginx-ingress. Vyžaduje hooks pre acme storage.
  • Cloudflare — pri proxy mode "Orange Cloud" treba DNS challenge (HTTP-01 nefunguje cez Cloudflare proxy).
  • Prometheuscaddy-prometheus modul exposuje /metrics endpoint 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.