feat(ops): scripts de recuperación tras reinicialización de DB

scripts/apply_all_migrations.sh: aplica todas las migraciones de
supabase/migrations/ en orden de timestamp, una por una, con
ON_ERROR_STOP=1 (sin esto psql sigue tras un error SQL y devuelve exit
0 igual — set -e nunca lo vería).

scripts/setup_all.sh: orquesta la recuperación completa — migraciones,
catálogo de encuestas (supabase/seed.sql, paso agregado: sin él
surveys/questions quedan vacías y seed_prueba_50.sql no tiene nada que
referenciar), usuario platform_admin vía ADMIN_EMAIL/ADMIN_PASSWORD, y
datos de prueba (docs/dashboard/seed_prueba_50.sql).

No ejecutado — solo los archivos, a la espera de uso manual en el VPS.
This commit is contained in:
markosbenitez
2026-06-27 23:51:51 -03:00
parent a0db888f2e
commit 6d9cf918f9
2 changed files with 65 additions and 0 deletions

20
scripts/apply_all_migrations.sh Executable file
View File

@@ -0,0 +1,20 @@
#!/bin/bash
# Aplica todas las migraciones de supabase/migrations/ en orden de timestamp.
# Uso: scripts/apply_all_migrations.sh
set -e
MIGRATIONS_DIR="$(dirname "$0")/../supabase/migrations"
for f in $(ls "$MIGRATIONS_DIR"/*.sql | sort); do
echo "Applying: $f"
# -v ON_ERROR_STOP=1: sin esto, psql sigue ejecutando statements después de un
# error SQL y termina con exit code 0 igual — set -e nunca vería el fallo.
if docker exec -i supabase-db psql -v ON_ERROR_STOP=1 -U postgres -d postgres < "$f"; then
echo "Done: $f"
else
echo "ERROR applying: $f" >&2
exit 1
fi
done
echo "All migrations applied."

45
scripts/setup_all.sh Executable file
View File

@@ -0,0 +1,45 @@
#!/bin/bash
# Recuperación completa de la DB tras una reinicialización (deploy que vació
# supabase-db). Orden:
# 1. Todas las migraciones (scripts/apply_all_migrations.sh)
# 2. Catálogo de encuestas (supabase/seed.sql) — sin esto, las migraciones
# dejan organizations/surveys/questions vacías y nada de lo que sigue
# tiene contra qué referenciar (setup_first_admin.sql sí funcionaría,
# pero seed_prueba_50.sql fallaría: rpc_submit_response necesita
# questions.id reales, que solo existen después de este paso).
# 3. Usuario platform_admin (scripts/setup_first_admin.sql)
# 4. Datos de prueba (docs/dashboard/seed_prueba_50.sql)
#
# Uso:
# ADMIN_EMAIL='admin@inquality.com.py' ADMIN_PASSWORD='...' scripts/setup_all.sh
set -e
SCRIPT_DIR="$(dirname "$0")"
ROOT_DIR="$SCRIPT_DIR/.."
if [ -z "$ADMIN_EMAIL" ] || [ -z "$ADMIN_PASSWORD" ]; then
echo "ERROR: ADMIN_EMAIL y ADMIN_PASSWORD son obligatorios (variables de entorno)." >&2
exit 1
fi
echo "== 1/4: Aplicando todas las migraciones =="
"$SCRIPT_DIR/apply_all_migrations.sh"
echo "== 2/4: Sembrando catálogo de encuestas (supabase/seed.sql) =="
# ADVERTENCIA propia del archivo: "SOLO ENTORNOS DE DESARROLLO — nunca ejecutar
# en producción". Esa advertencia es para NO re-correrlo contra una DB con
# datos reales (DELETE+INSERT de questions con UUIDs nuevos puede chocar con
# answers existentes via FK). En este escenario de recuperación la DB está
# vacía (reinicializada por el deploy) — no hay answers/responses que puedan
# quedar huérfanas. Si la DB NO está realmente vacía, frenar antes de este paso.
docker exec -i supabase-db psql -v ON_ERROR_STOP=1 -U postgres -d postgres < "$ROOT_DIR/supabase/seed.sql"
echo "== 3/4: Creando usuario platform_admin =="
docker exec -i supabase-db psql -v ON_ERROR_STOP=1 -U postgres -d postgres \
-v email="$ADMIN_EMAIL" -v password="$ADMIN_PASSWORD" \
< "$ROOT_DIR/scripts/setup_first_admin.sql"
echo "== 4/4: Sembrando datos de prueba (seed_prueba_50.sql) =="
docker exec -i supabase-db psql -v ON_ERROR_STOP=1 -U postgres -d postgres < "$ROOT_DIR/docs/dashboard/seed_prueba_50.sql"
echo "Setup completo."