Skip to content
Martin Skalicky edited this page Aug 4, 2026 · 2 revisions

Caddy

Reverse proxy, která vyřídí HTTPS sama a bez konfigurace. Pro homelab je to nejrozumnější volba a stránka o ní je krátká, protože není o čem psát.

Minimální konfigurace

Caddyfile:

nas.example.cz {
    reverse_proxy 127.0.0.1:5000
}

To je celé. Caddy si při startu vyžádá certifikát od Let's Encrypt, nastaví přesměrování z HTTP na HTTPS, poskládá správný řetěz certifikátů, nastaví hlavičky X-Forwarded-* a zapne WebSockety.

Srovnej to s ekvivalentem v nginxu. To je ten důvod.

Víc služeb

nas.example.cz {
    reverse_proxy 127.0.0.1:5000
}

foto.example.cz {
    reverse_proxy 127.0.0.1:2283
    request_body {
        max_size 50GB
    }
}

home.example.cz {
    reverse_proxy 127.0.0.1:8123
}

git.example.cz {
    reverse_proxy 127.0.0.1:3000
}

Docker Compose

services:
  caddy:
    image: caddy:2
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
      - "443:443/udp"     # HTTP/3
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile:ro
      - caddy_data:/data
      - caddy_config:/config
    networks: [web]

volumes:
  caddy_data:
  caddy_config:

Svazek caddy_data musí být trvalý. Jsou v něm certifikáty. Když ho ztratíš při každém restartu, budeš si o certifikáty žádat pořád dokola a Let's Encrypt tě po pár dnech omezí. Viz certifikáty.

V Compose se na ostatní služby odkazuješ jménem kontejneru:

foto.example.cz {
    reverse_proxy immich:2283
}

Souvislosti v sítích v Dockeru.

Užitečné věci

Přesměrování:

example.cz {
    redir https://www.example.cz{uri} permanent
}

Statické soubory:

example.cz {
    root * /var/www/example
    file_server
    encode gzip zstd
}

Bezpečnostní hlavičky:

nas.example.cz {
    reverse_proxy 127.0.0.1:5000
    header {
        Strict-Transport-Security "max-age=31536000"
        X-Content-Type-Options nosniff
        X-Frame-Options SAMEORIGIN
        -Server
    }
}

To -Server hlavičku odstraní.

Omezení podle IP:

proxmox.example.cz {
    @nepovolene not remote_ip 192.168.1.0/24 10.10.0.0/24
    respond @nepovolene "Nope" 403
    reverse_proxy 127.0.0.1:8006
}

Základní přihlášení:

tajne.example.cz {
    basic_auth {
        martin $2a$14$hashhashhash
    }
    reverse_proxy 127.0.0.1:9000
}

Hash vygeneruješ přes caddy hash-password.

Vnitřní služba s vlastním certifikátem:

router.doma {
    tls internal
    reverse_proxy 192.168.1.1
}

tls internal vytvoří vlastní certifikační autoritu. Pro vnitřní služby, kde nemáš veřejnou doménu.

Wildcard certifikát

Pro *.example.cz potřebuješ DNS-01 ověření, které vyžaduje sestavení Caddy s pluginem pro tvého DNS poskytovatele:

FROM caddy:2-builder AS builder
RUN xcaddy build --with github.com/caddy-dns/cloudflare

FROM caddy:2
COPY --from=builder /usr/bin/caddy /usr/bin/caddy
*.example.cz {
    tls {
        dns cloudflare {env.CF_API_TOKEN}
    }
    @nas host nas.example.cz
    handle @nas {
        reverse_proxy 127.0.0.1:5000
    }
    @foto host foto.example.cz
    handle @foto {
        reverse_proxy 127.0.0.1:2283
    }
}

Podrobněji o rozdílu mezi HTTP-01 a DNS-01 v certifikátech.

Diagnostika

caddy validate --config /etc/caddy/Caddyfile
caddy fmt --overwrite /etc/caddy/Caddyfile
systemctl reload caddy
journalctl -u caddy -f
docker compose logs -f caddy
Problém Příčina
Certifikát se nevydá port 80 není dostupný zvenku, nebo DNS nesměřuje sem
502 služba za proxy neběží, nebo špatné jméno kontejneru
Po restartu nový certifikát svazek /data není trvalý
Wildcard nefunguje chybí DNS plugin, HTTP-01 wildcard neumí

Kdy Caddy nestačí

Když potřebuješ jemné ladění výkonu, exotické moduly, nebo když už máš nginx konfiguraci, kterou nechceš přepisovat. Pro všechno ostatní v homelabu je Caddy méně práce a méně chyb.

Clone this wiki locally