markdown
Caddy.md
markdown
# 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](Nginx). 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 ```yamlservices: 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](Certifikaty-a-Lets-Encrypt). 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](Site-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. Kořenový certifikát musíš rozvézt na zařízení, jinak budou hlásit varování dál — na místním stroji stačí `caddy trust`, jinde je to ruční práce. Souvislosti a omezení ve [vlastní certifikační autoritě](Vlastni-certifikacni-autorita). ## Wildcard certifikát Pro `*.example.cz` potřebuješ DNS-01 ověření, které vyžaduje sestavení Caddy s pluginem pro tvého DNS poskytovatele: ```dockerfileFROM caddy:2-builder AS builderRUN xcaddy build --with github.com/caddy-dns/cloudflare FROM caddy:2COPY --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](Certifikaty-a-Lets-Encrypt). ## Diagnostika ```bashcaddy validate --config /etc/caddy/Caddyfilecaddy fmt --overwrite /etc/caddy/Caddyfilesystemctl reload caddyjournalctl -u caddy -fdocker 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.