caddy
Caddy používám jako hlavní vstupní bránu (web server a reverse proxy) pro všechny služby běžící na ctrlf.cz. Jeho hlavní předností je automatická správa HTTPS certifikátů (přes Let's Encrypt), jednoduchá syntaxe a vysoký výkon.
Caddy automaticky žádá o certifikáty pro všechny definované domény, obnovuje je a přesměrovává HTTP provoz na HTTPS, aniž by to bylo nutné explicitně konfigurovat u každé domény zvlášť.
Reverse Proxy
Většina služeb je konfigurována v režimu reverse proxy. To znamená, že Caddy přijme požadavek z internetu (např. na pocket-id.ctrlf.cz) a přepošle jej na konkrétní port na localhostu (např. localhost:1411), kde běží samotná aplikace (často v Dockeru).
Uživatel tak komunikuje pouze s Caddy přes standardní port 443 a o interních portech služeb neví.
Pokročilé směrování (Route & Handle)
U složitějších aplikací, jako je například dashboard (dash.ctrlf.cz) nebo video streamy, je potřeba specificky směrovat různé typy požadavků.
- Websockety: Pro aplikace vyžadující real-time komunikaci (např. dash.ctrlf.cz) je nutné explicitně povolit upgrade spojení na Websocket přidáním hlaviček Connection a Upgrade.
- Více backendů: U služby video.ctrlf.cz Caddy rozděluje provoz podle cesty (path). API volání a streamy (/api/*, /hls/*) jdou na backendový port 7104, zatímco statický frontend a ostatní cesty jdou na port 7103.
Autentizace a zabezpečení
Forward Auth (TinyAuth)
Pro služby, které nemají vlastní přihlašování nebo je potřeba je extra zabezpečit, používám centralizovanou autentizaci pomocí snippetu (tinyauth_forwarder).
Tento snippet využívá direktivu forward_auth, která každý požadavek nejprve pošle na ověřovací službu (běžící na portu 7147). Pokud uživatel není přihlášen, je přesměrován na login. Pokud přihlášen je, Caddy předá požadavek do cílové aplikace i s hlavičkami identifikujícími uživatele (X-Auth-User).
Toto je aplikováno například na dockge.ctrlf.cz.
Omezení na lokální síť (@local)
Některé služby (arr-stack: Radarr, Sonarr, Prowlarr atd.) jsou sice definované na veřejné doméně, ale přístup k nim je omezen pouze pro zařízení uvnitř lokální sítě (např. přes VPN/Tailscale).
Definice @local kontroluje remote_ip (rozsah 10.0.0.0/24).
- Handle @local: Pokud IP odpovídá, provede se reverse proxy na aplikaci.
- Handle (zbytek): Pokud IP neodpovídá, Caddy vrátí chybu 401 Unauthorized.
PHP aplikace (Nextcloud)
Pro hostování PHP aplikací, jako je Nextcloud, Caddy neslouží jen jako proxy, ale komunikuje přímo s PHP procesem pomocí protokolu FastCGI.
- php_fastcgi: Směruje požadavky na php-fpm socket.
- Zabezpečení: Pomocí pojmenovaného matcheru @forbidden jsou explicitně blokovány přístupy k citlivým souborům a adresářům (např. .htaccess, /data, /config), které by neměly být veřejně dostupné.
- Hlavičky: Jsou nastaveny HSTS a CORS hlavičky pro správné fungování mobilních klientů a webových integrací.