#!/usr/bin/env bash # Holt den Datenbestand von Supabase und spielt ihn in den db-Container. # # ═══ Der Ablauf, und warum er so aussieht ═══ # # Das **Schema** kommt nicht aus dem Abzug, sondern aus den Migrationen: # scripts/migrate.mjs baut es im Container von Grund auf. Nachgewiesen ist, # dass dabei Spalte für Spalte, Index für Index, Policy für Policy dasselbe # herauskommt wie in der Produktion. Der Weg über die Migrationen hat zwei # Vorteile gegenüber einem Schema-Abzug: die Buchführung stimmt danach von # selbst, und was Supabase an eigenen Rechten und Eigentümern hineingeschrieben # hat, kommt gar nicht erst mit. # # Übernommen werden nur die **Daten**, mit --disable-triggers: sonst stolpert # jede Fremdschlüsselprüfung über die Ladereihenfolge. (RLS steht dem nicht im # Weg — keine der 19 Tabellen hat FORCE ROW LEVEL SECURITY, der Eigentümer # schreibt also durch.) # # Auf dem Host wird **nur Docker** gebraucht: psql und pg_dump kommen aus dem # Dienst `psql`, Node aus dem Dienst `migrate` — beide im Profil `tools`, das # bei einem gewöhnlichen `docker compose up` nicht mitläuft. # # Aufruf im Deploy-Verzeichnis: # # SUPABASE_DB_URL='postgresql://…@…supabase.com:5432/postgres' \ # ./scripts/umzug-von-supabase.sh # # Der Abzug bleibt als Datei liegen und wird nicht gelöscht: geht das # Einspielen schief, ist der Bestand sonst nur noch bei Supabase. set -euo pipefail : "${SUPABASE_DB_URL:?SUPABASE_DB_URL fehlt — der direkte Zugang zur alten Datenbank (Supabase: Port 5432)}" ABZUG="${ABZUG:-supabase-daten-$(date +%Y%m%d-%H%M%S).sql}" echo "── 1/5 Datenbank starten und abwarten" docker compose up -d db docker compose ps db echo echo "── 2/5 Schema aus den Migrationen aufbauen" docker compose run --rm migrate echo echo "── 3/5 Daten von Supabase abziehen → ${ABZUG}" # Läuft im psql-Abbild, damit pg_dump nicht auf dem Host installiert sein muss. # --entrypoint überschreibt den psql-Aufruf des Dienstes. docker compose run --rm --no-deps --entrypoint pg_dump psql \ "${SUPABASE_DB_URL}" \ --data-only \ --disable-triggers \ --schema=public \ --no-owner \ --no-privileges \ > "${ABZUG}" echo " $(wc -l < "${ABZUG}") Zeilen, $(du -h "${ABZUG}" | cut -f1)" echo echo "── 4/5 Einspielen" docker compose run --rm -T psql < "${ABZUG}" echo echo "── 5/5 Gegenprobe — Zeilenzahlen hier und dort" echo " neue Datenbank:" docker compose run --rm -T psql -qAt -c " select ' '||table_name||': '||(xpath('/row/c/text()', query_to_xml('select count(*) as c from public.'||quote_ident(table_name), false, true, '')))[1]::text from information_schema.tables where table_schema='public' and table_type='BASE TABLE' order by table_name" echo echo "Fertig. Nächster Schritt: DATABASE_URL in .env auf den Container zeigen" echo "lassen (siehe DEPLOYMENT.md), dann docker compose up -d --build" echo echo "Der Abzug bleibt unter ${ABZUG} liegen — erst löschen, wenn die Anwendung" echo "gegen die neue Datenbank nachweislich läuft."