# Caddy AutoGen Caddy AutoGen bygger Caddy-routes "on the fly" från körande containers i ZimaOS/CasaOS. Arkitektur: - `discovery-agent` läser Docker metadata via `socket-proxy`. - Endast explicit opt-in exponeras (`LABEL_CADDY_ENABLE=true`). - Caddy config laddas dynamiskt via Caddy Admin API (`POST /load`). - TLS sker med Let's Encrypt DNS-01 via Cloudflare. ## Säkerhetsmodell - Fail-closed default: om `REQUIRE_CLOUDFLARE=true` och token saknas laddas ingen ny extern config. - Ingen auto-exponering av alla portar. - Endast HTTP(S)-upstreams stöds i v1. - Docker socket exponeras inte direkt till agenten, endast via `socket-proxy` med begränsade endpoint-flaggor. ## Miljövariabler (appnivå) - `BASE_DOMAIN` (krävs), t.ex. `home.example.com` - `CLOUDFLARE_API_TOKEN` (krävs i fail-closed läge) - `WILDCARD_DOMAIN` (valfri), t.ex. `home.example.com` - `REQUIRE_CLOUDFLARE` (default `true`) - `ALLOW_INTERNAL_TLS_FALLBACK` (default `false`) - `POLL_SECONDS` (default `15`) Cloudflare-token bör vara scoped till minsta möjliga rättigheter: - `Zone.Zone:Read` - `Zone.DNS:Edit` ## Miljövariabler på målcontainers (opt-in) Sätt dessa på varje container som ska exponeras: - `LABEL_CADDY_ENABLE=true` - `LABEL_CADDY_TARGET_PORT=` Valfria: - `LABEL_CADDY_HOST=` - `LABEL_CADDY_SCHEME=http|https` - `LABEL_CADDY_PATH=/` - `LABEL_CADDY_HEALTH_URI=/health` ### Exempel (Frigate) För Frigate med portar `5000`, `8554`, `8555`: - Sätt `LABEL_CADDY_ENABLE=true` - Sätt `LABEL_CADDY_TARGET_PORT=5000` Då skapas endpoint bara för web UI-porten (`5000`), inte för RTSP/WebRTC-portarna. Konkreta env-vars att sätta på Frigate-containern: ```text LABEL_CADDY_ENABLE=true LABEL_CADDY_TARGET_PORT=5000 LABEL_CADDY_HOST=frigate LABEL_CADDY_SCHEME=http LABEL_CADDY_PATH=/ ``` ## Lokal DNS för split-horizon Rekommenderad stack: **AdGuard Home**. - Skapa lokala records/rewrite för `*.BASE_DOMAIN` och `BASE_DOMAIN` mot ZimaOS-serverns LAN-IP. - Behåll samma publika zon i Cloudflare för DNS-01-validering. Alternativ som fungerar bra i ZimaOS: - Technitium DNS (mer avancerad DNS-kontroll) - Pi-hole (+ ev. Unbound) ## Säkerhetsavvikelser Följande högriskdetaljer är medvetna designval: - Använder Docker API via `socket-proxy` (inte direkt socket i discovery-agent). - Caddy måste exponera 80/443 för ingress. Riskreduktion: - socket-proxy endpoint-whitelist (`CONTAINERS`, `EVENTS`, `INFO`, `NETWORKS`, `PING`, `VERSION`) - `POST=0` - `no-new-privileges` - read-only där möjligt ## Integrationstester Kör lokala integrationstester för discovery-agenten: ```bash ./Apps/caddy-autogen/tests/run_integration_tests.sh ``` Testerna mockar Docker API-svar och Caddy `/load`-anrop och verifierar: - opt-in-regler (endast markerade containers exponeras), - säker portselektionslogik (inga media/UDP-portar routas av misstag), - fail-closed beteende när Cloudflare-token saknas.