echos-ocr/scripts/migrate-database.sh

77 lines
2.9 KiB
Bash
Raw Normal View History

#!/usr/bin/env bash
set -euo pipefail
# ─── Database Migration: Homelab PostgreSQL → Supabase ────────
#
# Prerequisites:
# - pg_dump and pg_restore installed locally
# - Network access to both the homelab PG and Supabase PG
# - Supabase project created with direct connection string
#
# Usage:
# HOMELAB_DB_URL="postgresql://echos_ocr:PASSWORD@192.168.68.102:5432/echos_ocr" \
# SUPABASE_DB_URL="postgresql://postgres.REF:PASSWORD@db.REF.supabase.co:5432/postgres" \
# bash scripts/migrate-database.sh
if [ -z "${HOMELAB_DB_URL:-}" ]; then
echo "Error: HOMELAB_DB_URL is not set"
echo "Example: postgresql://echos_ocr:PASSWORD@192.168.68.102:5432/echos_ocr"
exit 1
fi
if [ -z "${SUPABASE_DB_URL:-}" ]; then
echo "Error: SUPABASE_DB_URL is not set (use the DIRECT connection, port 5432, not pooled)"
echo "Example: postgresql://postgres.REF:PASSWORD@db.REF.supabase.co:5432/postgres"
exit 1
fi
DUMP_FILE="echos_ocr_backup_$(date +%Y%m%d_%H%M%S).dump"
echo "=== Step 1: Dumping homelab database ==="
pg_dump "${HOMELAB_DB_URL}" -Fc -f "${DUMP_FILE}"
echo "Dump created: ${DUMP_FILE} ($(du -h "${DUMP_FILE}" | cut -f1))"
echo ""
echo "=== Step 2: Restoring to Supabase ==="
pg_restore "${SUPABASE_DB_URL}" --no-owner --no-privileges --clean --if-exists "${DUMP_FILE}" 2>&1 || true
echo "Restore complete (some warnings about existing objects are normal)"
echo ""
echo "=== Step 3: Pushing schema with Prisma ==="
echo "Running 'npx prisma db push' to ensure schema alignment..."
DATABASE_URL="${SUPABASE_DB_URL}" npx prisma db push --skip-generate 2>&1
echo "Schema push complete"
echo ""
echo "=== Step 4: Verifying row counts ==="
psql "${SUPABASE_DB_URL}" -c "
SELECT 'User' as table_name, count(*) FROM \"User\"
UNION ALL SELECT 'Organization', count(*) FROM \"Organization\"
UNION ALL SELECT 'OrgMember', count(*) FROM \"OrgMember\"
UNION ALL SELECT 'ResponseCard', count(*) FROM \"ResponseCard\"
UNION ALL SELECT 'ProcessingJob', count(*) FROM \"ProcessingJob\"
UNION ALL SELECT 'ActivityLog', count(*) FROM \"ActivityLog\"
UNION ALL SELECT 'Notification', count(*) FROM \"Notification\"
UNION ALL SELECT 'Integration', count(*) FROM \"Integration\"
ORDER BY table_name;
"
echo ""
echo "=== Compare with homelab counts ==="
psql "${HOMELAB_DB_URL}" -c "
SELECT 'User' as table_name, count(*) FROM \"User\"
UNION ALL SELECT 'Organization', count(*) FROM \"Organization\"
UNION ALL SELECT 'OrgMember', count(*) FROM \"OrgMember\"
UNION ALL SELECT 'ResponseCard', count(*) FROM \"ResponseCard\"
UNION ALL SELECT 'ProcessingJob', count(*) FROM \"ProcessingJob\"
UNION ALL SELECT 'ActivityLog', count(*) FROM \"ActivityLog\"
UNION ALL SELECT 'Notification', count(*) FROM \"Notification\"
UNION ALL SELECT 'Integration', count(*) FROM \"Integration\"
ORDER BY table_name;
"
echo ""
echo "=== Migration complete ==="
echo "Backup file retained at: ${DUMP_FILE}"
echo "Verify the counts above match between homelab and Supabase."