fix: changed ADMIN_SESSION_COOKIE_SECURE=true with pre-commit script

This commit is contained in:
Matthias Lotz 2025-11-24 20:15:46 +01:00
parent b912670cab
commit 80aca79b32
4 changed files with 17 additions and 8 deletions

View File

@ -24,7 +24,7 @@ Die API verwendet **zwei verschiedene Authentifizierungs-Mechanismen** für unte
```env ```env
ADMIN_SESSION_SECRET=$(openssl rand -hex 32) ADMIN_SESSION_SECRET=$(openssl rand -hex 32)
``` ```
> Standardmäßig setzt der Server in Production HTTPS-Only Cookies (`Secure`). Falls deine Installation **ohne HTTPS** hinter einem internen Netzwerk läuft, kannst du das Verhalten über `ADMIN_SESSION_COOKIE_SECURE=false` explizit deaktivieren. Verwende dies nur in vertrauenswürdigen Umgebungen! > Standardmäßig setzt der Server in Production HTTPS-Only Cookies (`Secure`). Falls deine Installation **ohne HTTPS** hinter einem internen Netzwerk läuft, kannst du das Verhalten über `ADMIN_SESSION_COOKIE_SECURE=false` explizit deaktivieren. Verwende dies nur in vertrauenswürdigen Umgebungen und setze den Wert vorzugsweise per lokaler Compose-Override-Datei oder geheimen ENV-Variablen, damit das Repo weiterhin den sicheren Default `true` behält.
2. **Backend starten** Migration legt Tabelle `admin_users` an. 2. **Backend starten** Migration legt Tabelle `admin_users` an.
3. **Setup-Status prüfen**: 3. **Setup-Status prüfen**:
```bash ```bash

View File

@ -432,14 +432,15 @@ git push origin feature/my-feature
### Git Hook (optional Absicherung) ### Git Hook (optional Absicherung)
Für Deployments ohne HTTPS muss `docker/prod/docker-compose.yml` die Zeile `- ADMIN_SESSION_COOKIE_SECURE=false` enthalten. Standard-Deployments sollten `ADMIN_SESSION_COOKIE_SECURE=true` behalten, damit das Session-Cookie nur über HTTPS übertragen wird.
Ein vorgefertigtes Pre-Commit-Hook stellt sicher, dass diese Zeile vorhanden ist bzw. automatisch korrigiert wird: Das bereitgestellte Pre-Commit-Hook stellt sicher, dass der Wert in `docker/prod/docker-compose.yml` automatisch auf `true` zurückgesetzt wird, falls er versehentlich verändert wurde (z.B. nach einem Test auf HTTP-only Hardware):
```bash ```bash
ln -s ../../scripts/git-hooks/pre-commit .git/hooks/pre-commit ln -s ../../scripts/git-hooks/pre-commit .git/hooks/pre-commit
``` ```
Nach der Installation aktualisiert der Hook die Datei bei Bedarf und staged sie direkt. Entfernen kannst du ihn jederzeit über `rm .git/hooks/pre-commit`. Nach der Installation aktualisiert der Hook die Datei bei Bedarf und staged sie direkt.
Für lokale HTTP-Lab-Deployments nutze eine separate (gitignorierte) `docker-compose.override.yml`, um `ADMIN_SESSION_COOKIE_SECURE=false` nur zur Laufzeit zu setzen. Entfernen kannst du den Hook jederzeit über `rm .git/hooks/pre-commit`.
## Nützliche Befehle ## Nützliche Befehle

View File

@ -38,8 +38,16 @@ services:
- NODE_ENV=production - NODE_ENV=production
- ADMIN_SESSION_SECRET=MvFhivVIPIXvSGvWGfGOiQCkUJrmUsjWQTNGUgnSmtpsGHQlKruTBEBZgbVvOHHr - ADMIN_SESSION_SECRET=MvFhivVIPIXvSGvWGfGOiQCkUJrmUsjWQTNGUgnSmtpsGHQlKruTBEBZgbVvOHHr
- ADMIN_SESSION_DIR=/usr/src/app/src/data/sessions - ADMIN_SESSION_DIR=/usr/src/app/src/data/sessions
- ADMIN_SESSION_COOKIE_SECURE=false # ⚠️ Für HTTP-only Labs per Override auf "false" setzen (nicht im Repo committen)
- ADMIN_SESSION_COOKIE_SECURE=true
sqliteweb:
image: tomdesinto/sqliteweb
ports:
- 8080:8080
volumes:
- image_data:/usr/src/app/src/data/:ro
command: /usr/src/app/src/data/db/image_uploader.db
networks: networks:
npm-nw: npm-nw:

View File

@ -4,7 +4,7 @@ set -euo pipefail
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
TARGET_FILE="$ROOT_DIR/docker/prod/docker-compose.yml" TARGET_FILE="$ROOT_DIR/docker/prod/docker-compose.yml"
ANCHOR_LINE=" - ADMIN_SESSION_DIR=/usr/src/app/src/data/sessions" ANCHOR_LINE=" - ADMIN_SESSION_DIR=/usr/src/app/src/data/sessions"
EXPECTED_LINE=" - ADMIN_SESSION_COOKIE_SECURE=false" EXPECTED_LINE=" - ADMIN_SESSION_COOKIE_SECURE=true"
if [[ ! -f "$TARGET_FILE" ]]; then if [[ ! -f "$TARGET_FILE" ]]; then
exit 0 exit 0
@ -28,7 +28,7 @@ changed = False
if 'ADMIN_SESSION_COOKIE_SECURE' in text: if 'ADMIN_SESSION_COOKIE_SECURE' in text:
pattern = re.compile(r'(\-\s*ADMIN_SESSION_COOKIE_SECURE\s*=\s*)([^\n\r]+)') pattern = re.compile(r'(\-\s*ADMIN_SESSION_COOKIE_SECURE\s*=\s*)([^\n\r]+)')
new_text, count = pattern.subn(r'\1false', text, count=1) new_text, count = pattern.subn(r'\1true', text, count=1)
if count: if count:
changed = new_text != text changed = new_text != text
else: else:
@ -39,7 +39,7 @@ else:
changed = True changed = True
if expected not in new_text: if expected not in new_text:
print('ERROR: Failed to ensure ADMIN_SESSION_COOKIE_SECURE=false in docker-compose.yml', file=sys.stderr) print('ERROR: Failed to ensure ADMIN_SESSION_COOKIE_SECURE=true in docker-compose.yml', file=sys.stderr)
sys.exit(3) sys.exit(3)
if changed: if changed: