Caddy AutoGen
Caddy AutoGen bygger Caddy-routes "on the fly" från körande containers i ZimaOS/CasaOS.
Arkitektur:
discovery-agentläser Docker metadata viasocket-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.
- Ett enkelt status-UI finns på port
31820(LAN/private ranges only).
Status-UI (v1)
Status-UI visar:
- senaste config apply-status,
- Cloudflare reachability + token-validitet,
- genererade hosts/routes,
- om Let's Encrypt-cert verkar finnas för varje host.
URL (default):
http://<zima-lan-ip>:31820/
Obs:
- "Hosts" i UI betyder genererade Caddy-routes, inte att appen skapar A/CNAME-records i Cloudflare-zonen.
- Certstatus bygger på Caddys lokala certificate storage och är en praktisk v1-signal.
Säkerhetsmodell
- Fail-closed default: om
REQUIRE_CLOUDFLARE=trueoch 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-proxymed begränsade endpoint-flaggor. - Status-UI är LAN-begränsat (
remote_ip private_ranges).
Miljövariabler (appnivå)
BASE_DOMAIN(krävs), t.ex.home.example.comCLOUDFLARE_API_TOKEN(krävs i fail-closed läge)WILDCARD_DOMAIN(valfri), t.ex.home.example.comREQUIRE_CLOUDFLARE(defaulttrue)ALLOW_INTERNAL_TLS_FALLBACK(defaultfalse)POLL_SECONDS(default15)STATUS_BIND(default0.0.0.0:8089, intern agent endpoint)STATUS_UI_PORT(default31820)CF_VERIFY_URL(default Cloudflare token verify endpoint)
Cloudflare-token bör vara scoped till minsta möjliga rättigheter:
Zone.Zone:ReadZone.DNS:Edit
Miljövariabler på målcontainers (opt-in)
Sätt dessa på varje container som ska exponeras:
LABEL_CADDY_ENABLE=trueLABEL_CADDY_TARGET_PORT=<container_tcp_port>
Valfria:
LABEL_CADDY_HOST=<subdomain-or-fqdn>LABEL_CADDY_SCHEME=http|httpsLABEL_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:
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_DOMAINochBASE_DOMAINmot 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=0no-new-privileges- read-only där möjligt
Integrationstester
Kör lokala integrationstester för discovery-agenten:
./Apps/caddy-autogen/tests/run_integration_tests.sh
Testerna mockar Docker API-svar och Cloudflare verify 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,
- status-UI-block i genererad Caddy-konfiguration,
- cert-matchning mot lokal Caddy certificate storage.
För verifiering i riktig ZimaOS-miljö, se HOW_TO_VERIFY.md i samma mapp.