Die Anleitung setzt jetzt voraus, was ohnehin da ist: ein Server mit laufendem Docker und ein Reverse Proxy, der schon steht - auch auf einem anderen Rechner. Docker-Installation und Betriebssystemhaertung sind raus, dafuer ist der Proxy-Abschnitt der ausfuehrlichste geworden. Damit ein externer Proxy die Anwendung ueberhaupt erreicht, war eine Aenderung noetig: Die Bindeadresse stand fest auf 127.0.0.1. Jetzt gibt es APP_BIND, Standard bleibt die Loopback-Adresse. Der Weg dorthin ist nach Vorzug sortiert - privates Netz, dann WireGuard, dann als Notloesung oeffentliche Adresse mit Firewallregel. Zwischen Proxy und Anwendung laeuft unverschluesseltes HTTP; das gehoert nicht ins offene Netz. Deshalb steht in der Kontrolle eine Gegenprobe, die fehlschlagen MUSS: Antwortet der Anwendungsport von aussen, ist die Firewallregel falsch. Fertige Konfigurationen fuer Caddy, nginx und Traefik, jeweils mit den Werten, die sonst uebersehen werden: - Zeitgrenze 10 Minuten - sonst brechen Belegmappe, Rechnungslegung und Vollexport mitten im Erzeugen ab. Die Standardwerte von nginx liegen bei 60 Sekunden. - Antwort nicht puffern - der Vollexport kommt als Strom. Puffert der Proxy, wartet der Browser, bis alles im Speicher des Proxys liegt, und laeuft dabei in die Zeitgrenze. - Und der Hinweis, dass der Proxy KEINE eigene CSP setzen darf: Sie enthaelt eine Nonce, die pro Anfrage neu ist. Eine feste CSP blockiert die eigenen Skripte - die Seite laedt dann, laesst sich aber nicht bedienen. Der A-Record zeigt auf den Proxy-Server, nicht auf den Anwendungsserver. Stand vorher falsch da. Etappe: 8 Phase: Haertung
76 lines
3.1 KiB
Bash
76 lines
3.1 KiB
Bash
# =============================================================================
|
|
# Betreuungs-Cockpit - Beispielkonfiguration
|
|
# Kopiere diese Datei nach .env und fuelle die Werte aus.
|
|
# Alle Geheimnisse erzeugst du mit: npm run schluessel
|
|
# =============================================================================
|
|
|
|
# --- Datenbank --------------------------------------------------------------
|
|
# Lokal (Docker Compose): Host ist der Servicename "db".
|
|
POSTGRES_USER=cockpit
|
|
POSTGRES_PASSWORD=bitte-aendern
|
|
POSTGRES_DB=betreuungs_cockpit
|
|
DATABASE_URL="postgresql://cockpit:bitte-aendern@localhost:5432/betreuungs_cockpit?schema=public"
|
|
|
|
# --- Auth.js ----------------------------------------------------------------
|
|
# 32 zufaellige Bytes, base64. Erzeugen: npm run schluessel
|
|
AUTH_SECRET=
|
|
# Oeffentliche Basis-URL der Anwendung (ohne abschliessenden Slash).
|
|
AUTH_URL=http://localhost:3000
|
|
# Hinter einem Reverse Proxy auf true setzen.
|
|
AUTH_TRUST_HOST=true
|
|
|
|
# --- Erreichbarkeit ---------------------------------------------------------
|
|
# Auf welcher Adresse und welchem Port horcht die Anwendung?
|
|
#
|
|
# Proxy auf DEMSELBEN Server: 127.0.0.1 (Standard, nichts zu tun)
|
|
# Proxy auf einem ANDEREN: die Adresse des privaten Netzes bzw. des
|
|
# WireGuard-Tunnels, z.B. 10.0.0.5
|
|
#
|
|
# 0.0.0.0 nur, wenn eine Firewall den Port ausschliesslich fuer die IP des
|
|
# Proxy-Servers oeffnet. Die Anwendung beendet kein TLS.
|
|
APP_BIND=127.0.0.1
|
|
APP_PORT=3000
|
|
|
|
# --- Anwendungsseitige Feldverschluesselung ---------------------------------
|
|
# AES-256-GCM. 32 Bytes, base64. OHNE DIESEN SCHLUESSEL SIND DIE VERSCHLUESSELTEN
|
|
# FELDER UNWIEDERBRINGLICH VERLOREN - unbedingt getrennt vom Backup sichern!
|
|
# Schluesselrotation: neuen Schluessel als ENC_KEY_V2 ergaenzen und
|
|
# ENC_KEY_AKTIV=2 setzen. Alte Schluessel bleiben zum Entschluesseln stehen.
|
|
ENC_KEY_V1=
|
|
ENC_KEY_AKTIV=1
|
|
|
|
# Separater Schluessel fuer Blind-Indizes (HMAC-SHA256).
|
|
# Erlaubt die Suche nach z.B. einer IBAN, ohne sie im Klartext zu speichern.
|
|
INDEX_KEY=
|
|
|
|
# --- Sicherheit -------------------------------------------------------------
|
|
# Leerlauf bis zur automatischen Abmeldung (Sekunden). 30 Minuten.
|
|
SESSION_MAX_AGE=1800
|
|
# Wie lange eine erneute Anmeldung fuer sensible Aktionen gilt (Sekunden).
|
|
REAUTH_MAX_AGE=300
|
|
# Login-Sperre: max. Fehlversuche pro Zeitfenster (Sekunden).
|
|
LOGIN_MAX_VERSUCHE=5
|
|
LOGIN_FENSTER_SEKUNDEN=900
|
|
LOGIN_SPERRE_SEKUNDEN=900
|
|
|
|
# --- Objektspeicher (S3-kompatibel, EU!) ------------------------------------
|
|
# Wird ab Etappe 3 verwendet. Beispiel: Hetzner Object Storage, Falkenstein.
|
|
# ACHTUNG: Mit dem Anbieter muss ein AV-Vertrag nach Art. 28 DSGVO bestehen.
|
|
S3_ENDPOINT=https://fsn1.your-objectstorage.com
|
|
S3_REGION=eu-central
|
|
S3_BUCKET=betreuungs-cockpit
|
|
S3_ACCESS_KEY_ID=
|
|
S3_SECRET_ACCESS_KEY=
|
|
|
|
# --- E-Mail-Erinnerungen (optional, ab Etappe 2) ----------------------------
|
|
SMTP_HOST=
|
|
SMTP_PORT=587
|
|
SMTP_USER=
|
|
SMTP_PASSWORD=
|
|
SMTP_FROM="Betreuungs-Cockpit <cockpit@example.de>"
|
|
|
|
# --- Erstanmeldung ----------------------------------------------------------
|
|
# Wird nur vom Seed benutzt, um den ersten Betreuer-Zugang anzulegen.
|
|
SEED_ADMIN_EMAIL=fw@wildeflorian.de
|
|
SEED_ADMIN_PASSWORT=bitte-beim-ersten-login-aendern
|