Der zweite Stack unter docker/ war ein Duplikat aus Februar, das nie mitgepflegt wurde - und genau deshalb schwer zu finden und leicht falsch zu bedienen. Statt ihn zu loeschen (Caddy ist fuer Betreiber ohne eigenen Reverse-Proxy zurecht gewuenscht) ist er jetzt in den Hauptstack integriert: - caddy als optionaler Dienst mit `profiles: ["caddy"]` in docker-compose.yml. Ohne `--profile caddy` wird er nicht einmal angelegt - empirisch geprueft mit einem separaten Testprojekt: `up -d` startete nur den ungeschuetzten Dienst. Der laufende Stack bleibt damit unveraendert. - Caddyfile in den Projektstamm verschoben, proxy-Ziel auf den Dienstnamen `opencrm` angepasst, Zertifikate unter ./data/caddy wie alle anderen Daten. - DOMAIN, CADDY_DIR und CADDY_CONFIG_DIR in die .env.example aufgenommen. - docker/ entfernt (Dockerfile, entrypoint.sh, docker-compose.yml, .env.example, README.md). Das dortige Dockerfile basierte noch auf Alpine - genau die Variante, von der das Projekt wegen Prisma-/TLS-Problemen bewusst auf node:20-slim gewechselt ist. Das gepflegte backend/Dockerfile baut Frontend und Backend ebenso. - README: Abschnitt "Docker (Produktion)" ersetzt durch "Betrieb mit eigenem SSL", inkl. Hinweisen zu Let's-Encrypt-Limits, DNS-Voraussetzung, HTTPS_ENABLED und dem weiterhin offenen App-Port. Projektbaum und .dockerignore nachgezogen. Geprueft: docker-compose config gueltig, caddy validate gueltig, laufende Container unberuehrt. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
43 lines
1.3 KiB
Caddyfile
43 lines
1.3 KiB
Caddyfile
# OpenCRM Caddyfile
|
||
# ===================
|
||
# Wird NUR gebraucht, wenn du den optionalen Caddy-Dienst startest:
|
||
# docker-compose --profile caddy up -d
|
||
# Caddy holt und erneuert dann das SSL-Zertifikat automatisch fuer ${DOMAIN}.
|
||
# Betreibst du bereits einen eigenen Reverse-Proxy (nginx, NPM, Traefik),
|
||
# brauchst du diese Datei nicht - dann laeuft alles ueber deinen Proxy.
|
||
|
||
{$DOMAIN:localhost} {
|
||
# Reverse proxy to OpenCRM app
|
||
reverse_proxy opencrm: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
|
||
}
|
||
}
|