Files
zima-apps/Apps/caddy-autogen

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=<container_tcp_port>

Valfria:

  • LABEL_CADDY_HOST=<subdomain-or-fqdn>
  • 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:

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:

./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.

För verifiering i riktig ZimaOS-miljö, se HOW_TO_VERIFY.md i samma mapp.