docs: Schritt 2 der Secret-Rotation auf selbst gehostetes Supabase korrigiert
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:
parent
230a4034e8
commit
f1eeca6ab6
10
CHANGELOG.md
10
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
|
||||
|
||||
@ -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
4
package-lock.json
generated
@ -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",
|
||||
|
||||
@ -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": {
|
||||
|
||||
Loading…
Reference in New Issue
Block a user