docs: Schritt 2 der Secret-Rotation auf selbst gehostetes Supabase korrigiert
Some checks are pending
Playwright Tests / test (push) Waiting to run
Test and SonarQube / quality (push) Waiting to run

Die Anleitung beschrieb Supabase Cloud mit Dashboard-Knopf. Tatsaechlich laeuft
Supabase per Docker auf einem eigenen LXC (scripts/supabase-setup.sh), ohne
Cloud-Dashboard. Der Weg geht ueber POSTGRES_PASSWORD in supabase/docker/.env
plus ALTER USER, mit pg_dumpall als Rueckfahrkarte -- das Passwort steckt an
mehreren Stellen, ein halber Wechsel legt die Datenbank lahm.

Ergaenzt um die Ports und eine ehrliche Einordnung: Die Datenbank hoert auf
einer privaten LAN-Adresse, dieser Schritt hat von den dreien die niedrigste
Prioritaet.

v1.117.1

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
mARTin-B78 2026-09-06 23:15:14 +02:00
parent 230a4034e8
commit f1eeca6ab6
4 changed files with 86 additions and 13 deletions

View File

@ -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

View File

@ -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://<Host aus dem Befehl oben>: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

4
package-lock.json generated
View File

@ -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",

View File

@ -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": {