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>
40 lines
1.1 KiB
Caddyfile
40 lines
1.1 KiB
Caddyfile
# OpenCRM Caddyfile
|
||
# ===================
|
||
# Replace {$DOMAIN} with your actual domain or use environment variable
|
||
# For local development without SSL, use localhost:80
|
||
|
||
{$DOMAIN:localhost} {
|
||
# Reverse proxy to OpenCRM app
|
||
reverse_proxy app:3001
|
||
|
||
# Logging
|
||
log {
|
||
output stdout
|
||
format console
|
||
}
|
||
|
||
# Security headers
|
||
header {
|
||
# Clickjacking protection
|
||
X-Frame-Options "SAMEORIGIN"
|
||
# XSS protection
|
||
X-Content-Type-Options "nosniff"
|
||
X-XSS-Protection "1; mode=block"
|
||
# Referrer policy
|
||
Referrer-Policy "strict-origin-when-cross-origin"
|
||
}
|
||
|
||
# Gzip compression – NUR fuer statische Assets, NICHT fuer /api/*.
|
||
# Komprimierte API-Antworten ermoeglichen die BREACH-Attacke
|
||
# (CVE-2013-3587): aus der Antwortgroesse liessen sich unter bestimmten
|
||
# Bedingungen Geheimnisse aus JSON-Responses ableiten. Statische Dateien
|
||
# sind davon nicht betroffen und bleiben komprimiert.
|
||
@nicht_api not path /api/*
|
||
encode @nicht_api gzip
|
||
|
||
# Handle file uploads (increase body limit)
|
||
request_body {
|
||
max_size 50MB
|
||
}
|
||
}
|