CreaRack-SL

Plan de Migración PostgreSQL 16 → 18

Plan de Migración PostgreSQL 16 → 18

Estado: ✅ Completado (04-04-2026) Downtime estimado: ~15 minutos Riesgo: Bajo (backup previo + volumen viejo preservado)


Pre-requisitos

  • Backup diario pg_dump verificado (cron ya activo en producción)
  • Acceso SSH a root@crearack.com
  • Ventana de mantenimiento acordada

Pasos

1. Backup manual previo (seguridad extra)

ssh root@crearack.com
docker exec crearack-pro-zcmvsl-db-1 pg_dump -U crearack_user -d crearack_pro -F c -f /tmp/pre_migration_backup.dump
docker cp crearack-pro-zcmvsl-db-1:/tmp/pre_migration_backup.dump /root/pre_migration_backup.dump

2. Parar servicios (inicio downtime)

docker stop crearack-pro-zcmvsl-web-1 crearack-pro-zcmvsl-worker-1

3. Dump completo con PG 16

docker exec crearack-pro-zcmvsl-db-1 pg_dump -U crearack_user -d crearack_pro -F c -f /tmp/full_dump.dump
docker cp crearack-pro-zcmvsl-db-1:/tmp/full_dump.dump /root/full_dump.dump

4. Parar y renombrar volumen DB

docker stop crearack-pro-zcmvsl-db-1
docker volume create pg_data_prod_pg16_backup
# No se puede renombrar volúmenes Docker, pero preservamos el viejo

5. Actualizar compose.prod.yml

Cambiar en compose.prod.yml:

image: postgres:18-alpine

6. Crear nuevo contenedor con PG 18

# Dokploy redesplegará, o manualmente:
docker compose -f compose.prod.yml up -d db
# Esto crea un volumen nuevo con PG 18 inicializado

7. Restaurar datos

docker cp /root/full_dump.dump crearack-pro-zcmvsl-db-1:/tmp/full_dump.dump
docker exec crearack-pro-zcmvsl-db-1 pg_restore -U crearack_user -d crearack_pro --clean --if-exists -F c /tmp/full_dump.dump

8. Re-aplicar RLS policies

docker exec crearack-pro-zcmvsl-web-1 python manage.py migrate

9. Arrancar servicios (fin downtime)

docker start crearack-pro-zcmvsl-web-1 crearack-pro-zcmvsl-worker-1

10. Verificar

curl https://crearack.com/alive
docker exec crearack-pro-zcmvsl-db-1 psql -U crearack_user -d crearack_pro -c "SELECT version();"
# Debe mostrar PostgreSQL 18.x

Rollback (si algo falla)

  1. Revertir compose.prod.yml a postgres:16-alpine
  2. El volumen original pg_data_prod sigue intacto con datos PG 16
  3. Redesplegar → DB arranca con datos originales

Post-migración

  • Actualizar compose.yml (dev) a postgres:18-alpine y recrear volumen local
  • Actualizar CLAUDE.md con versión PostgreSQL 18
  • Eliminar backup /root/full_dump.dump tras 1 semana de estabilidad

Véase también

  • [[decision—20260315—postgres-18-pgbouncer]] — Postgres 18 + pgbouncer
  • [[crearack-tech—backend—database-architecture]] — arquitectura de base de datos
  • [[crearack-tech—admin—cache-and-database]] — operativa de cache Valkey y DB Postgres
  • [[crearack-tech—guides—database-admin-guide]] — guía de administración de DB
  • [[incident—20260220—pgbouncer-dokploy-networking]] — incidente pgbouncer+Dokploy networking