App Node.js para copiar toda la base de datos desde Supabase (pooler) hacia un Postgres local en 192.168.100.129. Detecta automáticamente diferencias de esquema, crea columnas/tablas faltantes y sincroniza secuencias.
- Origen:
postgres://postgres.kjtbjqxguogelslfgvju@aws-0-sa-east-1.pooler.supabase.com:6543/postgres(Supabase) - Destino detectado:
postgres://postgres:postgres@192.168.100.129:5432/inscripciones- DBs disponibles en el host:
api, biblioteca, cronograma, dramatiza, event_payments, inscripciones, norte, pdf_metadata, postgres, teatro, teatroapp - Se eligió
inscripcionespor ser la más compatible (18 tablas enpubliccoinciden con Supabase).
- DBs disponibles en el host:
- Última copia verificada: ✅ 18/18 tablas idénticas (746 filas).
npm installEl archivo .env ya contiene DATABASE_URL (origen). Solo asegurate que tenga destino:
# Origen (ya configurado)
DATABASE_URL=postgres://postgres.kjtbjqxguogelslfgvju:xxx@aws-0-sa-east-1.pooler.supabase.com:6543/postgres?sslmode=require
# Destino – 192.168.100.129
DEST_DATABASE_URL=postgres://postgres:postgres@192.168.100.129:5432/inscripciones?sslmode=disable
# Alternativa por partes:
# DEST_DB_HOST=192.168.100.129
# DEST_DB_PORT=5432
# DEST_DB_USER=postgres
# DEST_DB_PASSWORD=postgres
# DEST_DB_NAME=inscripciones
BATCH_SIZE=1000Si querés copiar a otra DB (ej.
dramatiza), cambiáDEST_DATABASE_URL.
# Verificar conexiones
npm run test:connection
# Inspeccionar origen (tablas y conteos)
npm run inspect
# Copia normal (trunca destino y reinserta, crea columnas/tablas faltantes)
npm run copy
# o
node src/index.js
# Dry-run (no escribe)
node src/index.js --dry-run
# Recrear esquema completo (DROP + CREATE) – útil si hay drift grande
npm run copy:fresh
# o
node src/index.js --fresh
# Copiar TODOS los schemas (public + auth, storage, etc) – requiere extensiones
node src/index.js --all
# Usar pg_dump nativo (requiere postgresql-client)
# sudo apt install postgresql-client
npm run copy:pgdump
# o
node src/index.js --pgdump- Conecta a origen y destino (
src/db.js:3). - Lista tablas (
publicpor defecto,--allpara todo). SET session_replication_role = replicapara deshabilitar FKs.TRUNCATEmasivoCASCADEuna sola vez (evita wipes por orden).- Para cada tabla:
- Sincroniza columnas faltantes (
syncMissingColumnsensrc/index.js:145) –ALTER TABLE ADD COLUMN+CREATE SEQUENCEsi hace falta. - Crea tablas faltantes (
email_envios,email_listas) extrayendonextvaly creando secuencias. - Copia en batches (default 1000) ordenado por PK o
ctid, conJSON.stringifyparajsonb(src/index.js:220).
- Sincroniza columnas faltantes (
- Sincroniza secuencias
setval(src/index.js:264). - Verifica conteos origen vs destino.
src/testConnection.js– prueba ambas conexiones y lista tablas.src/inspect.js– detalla columnas y conteos del origen.src/dump.js– generadump_YYYY-MM-DD.sqlcon INSERTs sin binario.node src/dump.js mi_backup.sql
src/pgDump.js– usapg_dump/psqlnativo si están instalados.
crontab -e
# Cada día a las 3am
0 3 * * * cd /home/mario/desarrollos/nodejs/db_bkp && /home/mario/.nvm/versions/node/v24.19.0/bin/node src/index.js >> logs/backup.log 2>&1- Se detectó drift:
asistente_planes.cuotas(jsonb) yplanes_pago.cuotasno existían en destino → se agregaron automáticamente. email_envios/email_listasno existían → se crearon con secuencias.acreditaciones,encuentro_inscripciones,planes_pagotenían columnas faltantes → agregadas.- Si usás
--fresh, se haceDROP TABLE CASCADE+CREATE TABLEfiel al origen (DDL generado engetTableDDL).
# Probar otra DB
DEST_DATABASE_URL=postgres://postgres:postgres@192.168.100.129:5432/dramatiza?sslmode=disable npm run test:connection.
├── .env
├── .env.example
├── package.json
├── src/
│ ├── config.js # Lee .env, valida URLs
│ ├── db.js # createClient, getTables, etc.
│ ├── index.js # Copia principal
│ ├── testConnection.js
│ ├── inspect.js
│ ├── dump.js
│ └── pgDump.js
└── README.md