Der S3-Treiber setzte bei jedem PutObject fest ServerSideEncryption: 'AES256'. Das mitgelieferte MinIO laeuft ohne KMS und lehnt das mit "NotImplemented" ab - es liess sich kein einziges Dokument ablegen. Wer der INSTALLATION.md folgte, landete zwangslaeufig dort; es war kein Konfigurationsfehler des Betreibers, sondern der Auslieferungszustand. Gebraucht wird die Zeile ohnehin nicht mehr. Seit v1.11.0 verschluesselt die Anwendung jede Datei selbst, bevor sie den Server verlaesst. Eine zweite Lage durch den Anbieter schuetzt vor nichts, was der eigene Umschlag nicht schon abdeckt. Jetzt steuert S3_SSE, ob der Kopf mitgeht. Leer bedeutet aus - auch eine Zeile mit Leerzeichen, sonst schickte eine leergelassene .env-Zeile einen leeren Kopf und der Anbieter antwortete mit einem Fehler, den niemand versteht. Im Kommentar von v1.11.0 stand, die serverseitige Verschluesselung "kostet nichts". Das war falsch: Auf MinIO ohne KMS kostete sie die gesamte Funktion. Der Satz ist korrigiert. Aufgefallen ist das erst im Betrieb, und der Grund ist derselbe wie beim Ausloeser: In der Entwicklung laeuft der Dateitreiber, der S3-Pfad wurde von keinem Test ausgefuehrt. Deshalb pruefen die neuen Tests den Befehl ab, bevor er das Netz sieht - was hineingeschrieben wird, ist jetzt belegt, nicht angenommen. Gegen drei Mutationen geprueft: SSE wieder fest verdrahtet, leere Angabe nicht abgefangen, Inhalt unverschluesselt - jede wird rot. Refs #42
136 lines
5.6 KiB
Bash
136 lines
5.6 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).
|
|
# Hinter einem Proxy die Adresse, die im Browser in der Adresszeile steht -
|
|
# nicht die interne. Passkeys pruefen dagegen.
|
|
AUTH_URL=http://localhost:3000
|
|
|
|
# Darf der Host-Kopf der Anfrage die Adresse bestimmen?
|
|
#
|
|
# Solange AUTH_URL gesetzt ist: nein, und die Zeile bleibt weg. Die Adresse
|
|
# ist dann bekannt und muss nicht aus einer Kopfzeile abgeleitet werden, die
|
|
# von aussen kommt. Ein "X-Forwarded-Host: fremde.example" schlaegt sonst in
|
|
# erzeugte Adressen durch.
|
|
# AUTH_TRUST_HOST=true
|
|
|
|
# --- Erreichbarkeit: HIER MUSST DU DICH ENTSCHEIDEN -------------------------
|
|
#
|
|
# Auf welcher Adresse soll die Anwendung erreichbar sein? Das haengt davon
|
|
# ab, WO dein Reverse Proxy laeuft. Waehl genau eine Zeile aus:
|
|
#
|
|
# Proxy auf DEMSELBEN Server
|
|
# APP_BIND=127.0.0.1
|
|
# Von aussen kommt niemand heran, nur der Proxy nebenan. Sicherste
|
|
# Variante - aber ein Proxy auf einem anderen Rechner erreicht die
|
|
# Anwendung damit NICHT.
|
|
#
|
|
# Proxy auf einem ANDEREN Server, privates Netz oder WireGuard vorhanden
|
|
# APP_BIND=10.0.0.5 <- die Adresse DIESES Servers in dem Netz
|
|
# Erste Wahl, wenn der Proxy woanders steht.
|
|
#
|
|
# Proxy auf einem ANDEREN Server, kein privates Netz
|
|
# APP_BIND=0.0.0.0
|
|
# Nur zusammen mit einer Firewallregel, die den Port ausschliesslich
|
|
# fuer die IP des Proxy-Servers oeffnet:
|
|
# ufw allow from <IP-des-Proxys> to any port 3000 proto tcp
|
|
# ufw deny 3000/tcp
|
|
#
|
|
# Zwischen Proxy und Anwendung laeuft unverschluesseltes HTTP - die
|
|
# Anwendung beendet kein TLS. Dieser Weg darf nie durchs offene Netz gehen.
|
|
# Einzelheiten: docs/INSTALLATION.md, Schritt 7.
|
|
APP_BIND=127.0.0.1
|
|
APP_PORT=3000
|
|
|
|
# Die Konsole des mitgelieferten Objektspeichers. Nur noetig, wenn auf dem
|
|
# Server schon etwas auf 9001 laeuft.
|
|
MINIO_KONSOLE_PORT=9001
|
|
|
|
# --- 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
|
|
|
|
# Geheimnis fuer die Ersteinrichtung. OHNE DIESEN WERT LAESST SICH DER ERSTE
|
|
# ZUGANG NICHT ANLEGEN - das ist Absicht.
|
|
#
|
|
# Zwischen dem ersten Start und dem Anlegen des Zugangs stand die
|
|
# Einrichtungsseite sonst offen: Wer sie in diesem Fenster findet, wird
|
|
# Administrator. Erzeugen: npm run schluessel
|
|
ERSTEINRICHTUNG_GEHEIMNIS=
|
|
|
|
# Steht ein Reverse Proxy davor?
|
|
#
|
|
# Nur mit "true" wird "X-Forwarded-For" geglaubt - und dann von HINTEN
|
|
# gelesen, weil der vordere Teil der Liste vom Aufrufer selbst kommt.
|
|
# Ohne diese Zeile zaehlt die Anmeldesperre nur nach E-Mail-Adresse.
|
|
#
|
|
# Der dokumentierte Betrieb (Reverse Proxy davor) braucht sie also:
|
|
VERTRAUE_PROXY=true
|
|
# Bei mehreren gestaffelten Proxys deren Anzahl. Sonst weglassen.
|
|
# VERTRAUE_PROXY_STUFEN=1
|
|
|
|
# --- 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=
|
|
|
|
# Serverseitige Verschluesselung durch den Anbieter.
|
|
#
|
|
# Bleibt leer, und das ist die richtige Voreinstellung: Die Anwendung
|
|
# verschluesselt jede Datei selbst, bevor sie den Server verlaesst. Eine
|
|
# zweite Lage durch den Anbieter schuetzt vor nichts, was der eigene
|
|
# Umschlag nicht schon abdeckt.
|
|
#
|
|
# Das mitgelieferte MinIO kann sie ohnehin nicht - es laeuft ohne KMS und
|
|
# lehnt jede Ablage mit "NotImplemented" ab, sobald hier etwas steht.
|
|
#
|
|
# Nur setzen, wenn ein externer Anbieter sie ausdruecklich verlangt:
|
|
# S3_SSE=AES256
|
|
|
|
# --- 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
|