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.
|
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
|
## [1.117.0] - 2026-09-06
|
||||||
|
|
||||||
### Security
|
### Security
|
||||||
|
|||||||
@ -74,19 +74,82 @@ Erwartet: **44 Zeichen** (32 Byte in Base64). Der alte Wert hatte 20 — also de
|
|||||||
|
|
||||||
## Schritt 2 — Datenbank-Passwort rotieren
|
## 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**
|
### Wo läuft die Datenbank?
|
||||||
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)
|
|
||||||
|
|
||||||
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
|
```bash
|
||||||
cd /root/My-Weekly-ToDo-List
|
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' && \
|
read -rsp "Neue DATABASE_URL einfügen: " V && printf '\n' && \
|
||||||
sed -i "s|^DATABASE_URL=.*|DATABASE_URL=\"$V\"|" .env && unset V
|
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
|
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:
|
||||||
|
|
||||||
Verbindung prüfen, ohne Zugangsdaten auszugeben:
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
npx prisma db execute --stdin <<< "SELECT 1;" && echo "Datenbank erreichbar"
|
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
|
## Schritt 3 — SMTP-Passwort rotieren
|
||||||
|
|||||||
4
package-lock.json
generated
4
package-lock.json
generated
@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "my-weekly-todo-list",
|
"name": "my-weekly-todo-list",
|
||||||
"version": "1.117.0",
|
"version": "1.117.1",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "my-weekly-todo-list",
|
"name": "my-weekly-todo-list",
|
||||||
"version": "1.117.0",
|
"version": "1.117.1",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@auth/prisma-adapter": "^2.11.1",
|
"@auth/prisma-adapter": "^2.11.1",
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "my-weekly-todo-list",
|
"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",
|
"description": "A web-based weekly task management application that organizes to-dos and calendar events in a single, intuitive weekly view",
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user