diff --git a/CHANGELOG.md b/CHANGELOG.md index ac8eaa0..648004e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,16 @@ All notable changes to this project are documented in this file. +## [1.117.1] - 2026-09-06 + +### Fixed +- `docs/secret-rotation.md`, Schritt 2: Die Anleitung ging von *Supabase Cloud* mit + Dashboard und "Reset database password"-Knopf aus. Tatsächlich läuft Supabase + **selbst gehostet per Docker auf einem eigenen LXC** (siehe `scripts/supabase-setup.sh`) — + es gibt kein Cloud-Dashboard. Korrigiert samt Ports (6543 Pooler, 5432 direkt, + 8000 API, 8001 Studio) und dem tatsächlichen Weg über `POSTGRES_PASSWORD` plus + `ALTER USER`, inklusive Backup-Schritt. + ## [1.117.0] - 2026-09-06 ### Security diff --git a/docs/secret-rotation.md b/docs/secret-rotation.md index 29c1556..07c2912 100644 --- a/docs/secret-rotation.md +++ b/docs/secret-rotation.md @@ -74,19 +74,82 @@ Erwartet: **44 Zeichen** (32 Byte in Base64). Der alte Wert hatte 20 — also de ## Schritt 2 — Datenbank-Passwort rotieren -Das passiert bei Supabase, nicht auf dem Server: +> **Korrektur:** Eine frühere Fassung dieser Anleitung ging von *Supabase Cloud* aus, mit +> einem Dashboard und einem "Reset database password"-Knopf. Das trifft hier **nicht** zu. +> Deine Supabase-Instanz läuft **selbst gehostet per Docker auf einem eigenen LXC** +> (siehe `scripts/supabase-setup.sh`). Es gibt kein Cloud-Dashboard. -1. Supabase-Projekt öffnen → **Settings** → **Database** -2. **Reset database password** — neues Passwort erzeugen lassen -3. Passwort in deinen Passwort-Manager, **nicht** in eine Datei kopieren -4. Supabase zeigt dir die fertigen Connection-Strings für `DATABASE_URL` (Pooler, Port 6543) - und `DIRECT_URL` (direkt, Port 5432) +### Wo läuft die Datenbank? -Auf dem Container einsetzen — dieser Weg zeigt die Eingabe nicht an: +Der Host steht in deiner `.env` auf dem App-Container. So bekommst du ihn heraus, ohne +das Passwort zu zeigen: ```bash cd /root/My-Weekly-ToDo-List +grep '^DATABASE_URL=' .env | sed -E 's|.*@([^:/]+):([0-9]+).*|Host: \1 Port: \2|' +grep '^DIRECT_URL=' .env | sed -E 's|.*@([^:/]+):([0-9]+).*|Host: \1 Port: \2|' +``` +Die Ports sind aus der Konfiguration bekannt: + +| Port | Wofür | +|---|---| +| **6543** | Verbindungspooler (Supavisor/pgbouncer) — das ist `DATABASE_URL` | +| **5432** | Postgres direkt — das ist `DIRECT_URL`, für Migrationen | +| **8000** | Supabase API-Gateway | +| **8001** | Supabase Studio, das Web-Dashboard | + +Das Studio erreichst du also unter `http://:8001`. +**Aber:** Studio hat keinen Knopf zum Ändern des Postgres-Passworts — das geht nur +auf dem Supabase-LXC selbst. + +### Lohnt sich das überhaupt? + +**Ehrliche Einschätzung: Dieser Schritt hat die niedrigste Priorität von allen dreien.** + +- Die Datenbank hört auf einer **privaten LAN-Adresse**, nicht am offenen Internet. +- Wer das Passwort aus dem Git ziehen will, braucht ohnehin schon Zugriff auf dein + privates Repository — und wäre damit bereits in deinem Netz. +- Das Rotieren ist bei selbst gehostetem Supabase **fehleranfällig**, weil dasselbe + Passwort an mehreren Stellen steckt (siehe unten). Ein halb durchgeführter Wechsel + legt die Datenbank lahm. + +`NEXTAUTH_SECRET` (Schritt 1) und `SMTP_PASSWORD` (Schritt 3) sind die wichtigen — +das eine schützt die Sitzungen, das andere ist von außen missbrauchbar. Beide sind +erledigt. **Schritt 2 kannst du in Ruhe planen oder ganz auslassen.** + +### Falls du es doch machst + +Das Postgres-Passwort steckt bei einem Supabase-Docker-Stack an **mehreren** Stellen. +Es reicht nicht, es in Postgres zu ändern — die Supabase-Container kämen dann nicht +mehr an ihre eigene Datenbank. + +Auf dem **Supabase-LXC**: + +```bash +cd ~/supabase/docker # Pfad ggf. anpassen + +# 1. Sicherung, bevor irgendetwas angefasst wird +docker compose exec -T db pg_dumpall -U postgres > ~/supabase-backup-$(date +%F).sql +ls -lh ~/supabase-backup-*.sql + +# 2. Neues Passwort erzeugen und direkt in die Supabase-Konfiguration schreiben +sed -i "s|^POSTGRES_PASSWORD=.*|POSTGRES_PASSWORD=$(openssl rand -base64 24 | tr -d '/+=')|" .env + +# 3. Dasselbe Passwort in Postgres setzen +docker compose exec -T db psql -U postgres -c \ + "ALTER USER postgres WITH PASSWORD '$(grep '^POSTGRES_PASSWORD=' .env | cut -d= -f2-)';" + +# 4. Stack neu starten, damit alle Dienste das neue Passwort bekommen +docker compose down && docker compose up -d +docker compose ps +``` + +Danach auf dem **App-Container** die beiden URLs anpassen — das neue Passwort aus +`supabase/docker/.env` einsetzen: + +```bash +cd /root/My-Weekly-ToDo-List read -rsp "Neue DATABASE_URL einfügen: " V && printf '\n' && \ sed -i "s|^DATABASE_URL=.*|DATABASE_URL=\"$V\"|" .env && unset V @@ -94,14 +157,14 @@ read -rsp "Neue DIRECT_URL einfügen: " V && printf '\n' && \ sed -i "s|^DIRECT_URL=.*|DIRECT_URL=\"$V\"|" .env && unset V ``` -`read -rs` unterdrückt die Anzeige beim Tippen, `unset` räumt die Variable weg. - -Verbindung prüfen, ohne Zugangsdaten auszugeben: +Verbindung prüfen: ```bash npx prisma db execute --stdin <<< "SELECT 1;" && echo "Datenbank erreichbar" ``` +Wenn etwas schiefgeht: Der Dump aus Schritt 1 ist die Rückfahrkarte. + --- ## Schritt 3 — SMTP-Passwort rotieren diff --git a/package-lock.json b/package-lock.json index 3887164..e13b5d0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "my-weekly-todo-list", - "version": "1.117.0", + "version": "1.117.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "my-weekly-todo-list", - "version": "1.117.0", + "version": "1.117.1", "license": "MIT", "dependencies": { "@auth/prisma-adapter": "^2.11.1", diff --git a/package.json b/package.json index 5ac8420..abbfd53 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "my-weekly-todo-list", - "version": "1.117.0", + "version": "1.117.1", "description": "A web-based weekly task management application that organizes to-dos and calendar events in a single, intuitive weekly view", "main": "index.js", "scripts": {