Caddy-Stack (docker/) auf Stand gebracht statt entfernt

Der Stack bleibt bewusst erhalten: Er richtet sich an Betreiber OHNE eigenen
Reverse-Proxy, weil Caddy das Zertifikat selbst holt und erneuert. Er war
allerdings seit Februar stehengeblieben und reichte zehn Variablen nicht an
den Container durch - teils sicherheitsrelevant.

Behoben:
- HTTPS_ENABLED ergaenzt (Default true, Caddy terminiert TLS). Fehlte bisher
  komplett, dadurch waere der Refresh-Cookie OHNE Secure-Attribut gesetzt
  worden und trust proxy falsch gewesen.
- JWT_EXPIRES_IN Default von 7d auf 15m korrigiert - der Wert galt dem
  ACCESS-Token und stammte aus der Zeit vor dem Access-/Refresh-Pattern. Ein
  Access-Token mit einer Woche Lebensdauer im Browser-Speicher macht das
  XSS-Fenster unnoetig gross.
- JWT_REFRESH_EXPIRES_IN, CORS_ORIGINS, LISTEN_ADDR, SSRF_BLOCK_PRIVATE_IPS
  ergaenzt. JWT_REFRESH_EXPIRES_IN stand bereits in docker/.env.example,
  wurde aber nie durchgereicht - dieselbe Fehlerklasse wie beim Audit-Siegel.
- Caddyfile: gzip fuer /api/* deaktiviert (BREACH, CVE-2013-3587). Die
  Konfiguration komprimierte bisher alles, obwohl die README das fuer die
  API ausdruecklich ausschliesst. Statische Assets bleiben komprimiert.
  Mit `caddy validate` geprueft.
- docker/.env.example um die neuen Variablen erweitert, dazu ein Hinweis auf
  Sonderzeichen im DB-Passwort (dieser Stack setzt die DATABASE_URL direkt
  zusammen, anders als der Entrypoint im Projektstamm).
- README benennt jetzt, wann welcher Stack der richtige ist.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-19 19:36:03 +02:00
co-authored by Claude Opus 5
parent 0ae6b13d6c
commit ee83b09ed8
4 changed files with 59 additions and 8 deletions
+17 -1
View File
@@ -38,8 +38,24 @@ services:
PORT: 3001
DATABASE_URL: mysql://${DB_USER:-opencrm}:${DB_PASSWORD:-opencrm123}@db:3306/${DB_NAME:-opencrm}
JWT_SECRET: ${JWT_SECRET:?JWT_SECRET is required}
JWT_EXPIRES_IN: ${JWT_EXPIRES_IN:-7d}
# Access-Token kurzlebig (lebt nur im Browser-Speicher → XSS-Fenster
# klein halten), Refresh-Token lang im httpOnly-Cookie.
# Frueher stand hier 7d fuer den ACCESS-Token das war ein Ueberbleibsel
# aus der Zeit vor dem Access-/Refresh-Pattern.
JWT_EXPIRES_IN: ${JWT_EXPIRES_IN:-15m}
JWT_REFRESH_EXPIRES_IN: ${JWT_REFRESH_EXPIRES_IN:-7d}
ENCRYPTION_KEY: ${ENCRYPTION_KEY:?ENCRYPTION_KEY is required}
# Caddy terminiert TLS und steht als EIN Proxy davor. Das Flag setzt das
# Secure-Attribut am Refresh-Cookie, trust proxy = 1 Hop und
# upgrade-insecure-requests in der CSP. Nur auf false setzen, wenn der
# Stack bewusst ohne TLS laeuft (reiner Test ueber http://).
HTTPS_ENABLED: ${HTTPS_ENABLED:-true}
# Nur noetig, wenn das Frontend unter einer anderen Origin laeuft.
CORS_ORIGINS: ${CORS_ORIGINS:-}
# In der Container-Umgebung muss der Dienst fuer Caddy erreichbar sein.
LISTEN_ADDR: ${LISTEN_ADDR:-0.0.0.0}
# Cloud-Deploy: private IP-Ranges fuer Provider-/SMTP-Tests blocken.
SSRF_BLOCK_PRIVATE_IPS: ${SSRF_BLOCK_PRIVATE_IPS:-false}
# Siegel für das Audit-Log (optional, fail-safe ohne Wert)
AUDIT_HMAC_KEY: ${AUDIT_HMAC_KEY:-}
AUDIT_HMAC_KEY_OLD: ${AUDIT_HMAC_KEY_OLD:-}