workspace/projects/gamilit/docs/95-guias-desarrollo/GUIA-ACTUALIZACION-PRODUCCION.md
rckrdmrd a23f31ce8f feat(db): Sincronizar scripts de BD y documentacion de produccion
## Scripts de Base de Datos (12 archivos)
- init-database.sh: Inicializacion completa con usuario y BD
- init-database-v3.sh: Version con dotenv-vault
- reset-database.sh: Reset BD manteniendo usuario
- recreate-database.sh: Recreacion completa
- cleanup-duplicados.sh, fix-duplicate-triggers.sh
- verify-users.sh, verify-missions-status.sh
- load-users-and-profiles.sh, DB-127-validar-gaps.sh

## Scripts de Produccion (5 archivos)
- build-production.sh: Compilar backend y frontend
- deploy-production.sh: Desplegar con PM2
- pre-deploy-check.sh: Validaciones pre-deploy
- repair-missing-data.sh: Reparar datos faltantes
- migrate-missing-objects.sh: Migrar objetos SQL

## Documentacion (7 archivos)
- GUIA-DESPLIEGUE-PRODUCCION-COMPLETA.md
- GUIA-ACTUALIZACION-PRODUCCION.md
- GUIA-VALIDACION-PRODUCCION.md
- GUIA-DEPLOYMENT-AGENTE-PRODUCCION.md
- GUIA-SSL-NGINX-PRODUCCION.md
- GUIA-SSL-AUTOFIRMADO.md
- DIRECTIVA-DEPLOYMENT.md

## Actualizaciones DDL/Seeds
- 99-post-ddl-permissions.sql: Permisos actualizados
- LOAD-SEEDS-gamification_system.sh: Seeds completos

## Nuevos archivos
- PROMPT-AGENTE-PRODUCCION.md: Prompt para agente productivo
- FLUJO-CARGA-LIMPIA.md: Documentacion de carga limpia

Resuelve: Problema de carga de BD entre dev y produccion
Cumple: DIRECTIVA-POLITICA-CARGA-LIMPIA.md

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-18 15:01:03 -06:00

623 lines
16 KiB
Markdown

# GUIA-ACTUALIZACION-PRODUCCION.md
**Fecha:** 2025-12-18
**Version:** 1.0
**Proposito:** Guia paso a paso para actualizar el servidor de produccion desde el repositorio remoto
---
## IMPORTANTE - LEER PRIMERO
Este documento es la **guia maestra** que el agente en produccion debe seguir cuando:
1. Se notifica que hay un commit en remoto
2. Se necesita actualizar el servidor con los cambios del repositorio
**Principio:** Respaldar TODO antes de actualizar, dar preferencia a remoto, reintegrar configuraciones locales.
---
## FLUJO COMPLETO DE ACTUALIZACION
```
┌─────────────────────────────────────────────────────────────┐
│ FLUJO DE ACTUALIZACION │
├─────────────────────────────────────────────────────────────┤
│ 1. DETENER SERVICIOS │
│ └─> pm2 stop all │
│ │
│ 2. RESPALDAR CONFIGURACIONES │
│ └─> Copiar .env files a /backup/config/ │
│ │
│ 3. RESPALDAR BASE DE DATOS │
│ └─> pg_dump completo a /backup/database/ │
│ │
│ 4. PULL DEL REPOSITORIO │
│ └─> git fetch && git reset --hard origin/main │
│ │
│ 5. RESTAURAR CONFIGURACIONES │
│ └─> Copiar .env files de vuelta │
│ │
│ 6. RECREAR BASE DE DATOS (limpia) │
│ └─> drop + create + seeds │
│ │
│ 7. INSTALAR DEPENDENCIAS │
│ └─> npm install en backend y frontend │
│ │
│ 8. BUILD DE APLICACIONES │
│ └─> npm run build │
│ │
│ 9. INICIAR SERVICIOS │
│ └─> pm2 start ecosystem.config.js │
│ │
│ 10. VALIDAR DEPLOYMENT │
│ └─> ./scripts/diagnose-production.sh │
└─────────────────────────────────────────────────────────────┘
```
---
## PASO 1: DETENER SERVICIOS
```bash
# Detener todos los procesos PM2
pm2 stop all
# Verificar que estan detenidos
pm2 list
```
---
## PASO 2: RESPALDAR CONFIGURACIONES
### 2.1 Crear directorio de backup (si no existe)
```bash
# Directorio de backups fuera del workspace
BACKUP_DIR="/home/gamilit/backups/$(date +%Y%m%d_%H%M%S)"
mkdir -p "$BACKUP_DIR/config"
mkdir -p "$BACKUP_DIR/database"
echo "Directorio de backup: $BACKUP_DIR"
```
### 2.2 Respaldar archivos de configuracion
```bash
# Respaldar .env de produccion
cp apps/backend/.env.production "$BACKUP_DIR/config/backend.env.production"
cp apps/frontend/.env.production "$BACKUP_DIR/config/frontend.env.production"
# Respaldar ecosystem.config.js si tiene modificaciones locales
cp ecosystem.config.js "$BACKUP_DIR/config/ecosystem.config.js"
# Respaldar cualquier otro archivo de configuracion local
if [ -f "apps/backend/.env" ]; then
cp apps/backend/.env "$BACKUP_DIR/config/backend.env"
fi
if [ -f "apps/frontend/.env" ]; then
cp apps/frontend/.env "$BACKUP_DIR/config/frontend.env"
fi
# Listar archivos respaldados
echo "=== Archivos de configuracion respaldados ==="
ls -la "$BACKUP_DIR/config/"
```
### 2.3 Archivos de configuracion criticos
| Archivo | Ubicacion | Contenido critico |
|---------|-----------|-------------------|
| `.env.production` | `apps/backend/` | DATABASE_URL, JWT_SECRET, CORS |
| `.env.production` | `apps/frontend/` | VITE_API_HOST, VITE_API_PORT |
| `ecosystem.config.js` | raiz | Configuracion PM2 |
---
## PASO 3: RESPALDAR BASE DE DATOS
### 3.1 Backup completo con pg_dump
```bash
# Variables de conexion (ajustar segun el servidor)
DB_NAME="gamilit_platform"
DB_USER="gamilit_user"
DB_HOST="localhost"
DB_PORT="5432"
# Archivo de backup
BACKUP_FILE="$BACKUP_DIR/database/gamilit_backup_$(date +%Y%m%d_%H%M%S).sql"
# Ejecutar backup completo
PGPASSWORD="$DB_PASSWORD" pg_dump \
-h "$DB_HOST" \
-p "$DB_PORT" \
-U "$DB_USER" \
-d "$DB_NAME" \
--format=plain \
--no-owner \
--no-acl \
> "$BACKUP_FILE"
# Verificar tamano del backup
ls -lh "$BACKUP_FILE"
# Comprimir backup
gzip "$BACKUP_FILE"
echo "Backup creado: ${BACKUP_FILE}.gz"
```
### 3.2 Verificar backup
```bash
# Verificar que el backup tiene contenido
gunzip -c "${BACKUP_FILE}.gz" | head -50
# Contar tablas en el backup
echo "Tablas en backup:"
gunzip -c "${BACKUP_FILE}.gz" | grep "CREATE TABLE" | wc -l
```
---
## PASO 4: PULL DEL REPOSITORIO
### 4.1 Verificar estado actual
```bash
# Ver estado actual
git status
# Ver rama actual
git branch
# Ver diferencias con remoto
git fetch origin
git log HEAD..origin/main --oneline
```
### 4.2 Hacer pull dando preferencia a remoto
```bash
# OPCION A: Reset completo a remoto (RECOMENDADO)
# Descarta TODOS los cambios locales y usa exactamente lo que hay en remoto
git fetch origin
git reset --hard origin/main
# OPCION B: Pull con estrategia de merge (si hay cambios locales importantes)
# git pull origin main --strategy-option theirs
```
### 4.3 Verificar el pull
```bash
# Verificar que estamos en el commit correcto
git log --oneline -5
# Verificar que no hay cambios pendientes
git status
```
---
## PASO 5: RESTAURAR CONFIGURACIONES
### 5.1 Restaurar archivos .env
```bash
# Restaurar configuraciones de produccion
cp "$BACKUP_DIR/config/backend.env.production" apps/backend/.env.production
cp "$BACKUP_DIR/config/frontend.env.production" apps/frontend/.env.production
# Restaurar ecosystem.config.js si fue modificado
# cp "$BACKUP_DIR/config/ecosystem.config.js" ecosystem.config.js
# Crear enlaces simbolicos a .env si el backend los requiere
cd apps/backend
ln -sf .env.production .env
cd ../..
cd apps/frontend
ln -sf .env.production .env
cd ../..
```
### 5.2 Verificar configuraciones restauradas
```bash
# Verificar que los archivos existen
ls -la apps/backend/.env*
ls -la apps/frontend/.env*
# Verificar contenido critico (sin mostrar secrets)
echo "=== Backend Config ==="
grep -E "^(APP_|NODE_ENV|CORS)" apps/backend/.env.production
echo "=== Frontend Config ==="
grep -E "^VITE_" apps/frontend/.env.production
```
---
## PASO 6: RECREAR BASE DE DATOS (LIMPIA)
### 6.1 Ejecutar script de creacion
```bash
cd apps/database
# Configurar DATABASE_URL
export DATABASE_URL="postgresql://${DB_USER}:${DB_PASSWORD}@${DB_HOST}:${DB_PORT}/${DB_NAME}"
# Ejecutar script de creacion limpia
# IMPORTANTE: Este script hace DROP y CREATE de la base de datos
./create-database.sh
cd ../..
```
### 6.2 Proceso del script create-database.sh
El script ejecuta en orden:
1. DROP DATABASE (si existe)
2. CREATE DATABASE
3. Cargar DDL (16 fases - schemas, tablas, funciones, triggers)
4. Cargar Seeds de produccion (57 archivos)
### 6.3 Verificar carga de datos
```bash
# Ejecutar script de diagnostico
./scripts/diagnose-production.sh
# O verificar manualmente las tablas criticas
psql "$DATABASE_URL" -c "
SELECT 'Tenants' as tabla, COUNT(*) as total FROM auth_management.tenants
UNION ALL SELECT 'Users', COUNT(*) FROM auth.users
UNION ALL SELECT 'Profiles', COUNT(*) FROM auth_management.profiles
UNION ALL SELECT 'Modules', COUNT(*) FROM educational_content.modules
UNION ALL SELECT 'Exercises', COUNT(*) FROM educational_content.exercises
UNION ALL SELECT 'Maya Ranks', COUNT(*) FROM gamification_system.maya_ranks
UNION ALL SELECT 'Achievements', COUNT(*) FROM gamification_system.achievements;
"
```
### 6.4 Si hay datos faltantes
```bash
# Ejecutar script de reparacion
./scripts/repair-missing-data.sh
```
---
## PASO 7: INSTALAR DEPENDENCIAS
### 7.1 Backend
```bash
cd apps/backend
# Limpiar node_modules si hay problemas
# rm -rf node_modules package-lock.json
# Instalar dependencias
npm install
cd ../..
```
### 7.2 Frontend
```bash
cd apps/frontend
# Limpiar node_modules si hay problemas
# rm -rf node_modules package-lock.json
# Instalar dependencias
npm install
cd ../..
```
---
## PASO 8: BUILD DE APLICACIONES
### 8.1 Build Backend
```bash
cd apps/backend
# Build de produccion
npm run build
# Verificar que el build fue exitoso
ls -la dist/
cd ../..
```
### 8.2 Build Frontend
```bash
cd apps/frontend
# Build de produccion
npm run build
# Verificar que el build fue exitoso
ls -la dist/
cd ../..
```
---
## PASO 9: INICIAR SERVICIOS
### 9.1 Iniciar con PM2
```bash
# Iniciar usando ecosystem.config.js
pm2 start ecosystem.config.js
# Verificar estado
pm2 list
# Guardar configuracion de PM2
pm2 save
```
### 9.2 Verificar logs
```bash
# Ver logs de todos los procesos
pm2 logs --lines 50
# Ver logs solo del backend
pm2 logs gamilit-backend --lines 30
# Ver logs solo del frontend
pm2 logs gamilit-frontend --lines 30
```
---
## PASO 10: VALIDAR DEPLOYMENT
### 10.1 Ejecutar script de diagnostico
```bash
./scripts/diagnose-production.sh
```
### 10.2 Verificaciones manuales
```bash
# Health check del backend
curl -s http://localhost:3006/api/health | jq .
# Verificar frontend
curl -s -o /dev/null -w "%{http_code}" http://localhost:3005
# Verificar tenant principal
psql "$DATABASE_URL" -c "SELECT slug, is_active FROM auth_management.tenants WHERE slug = 'gamilit-prod';"
```
### 10.3 Prueba de registro (opcional)
```bash
# Probar endpoint de registro
curl -X POST http://localhost:3006/api/v1/auth/register \
-H "Content-Type: application/json" \
-d '{
"email": "test-deploy@example.com",
"password": "TestPassword123!",
"first_name": "Test",
"last_name": "Deploy"
}'
# Si funciona, eliminar usuario de prueba
# psql "$DATABASE_URL" -c "DELETE FROM auth.users WHERE email = 'test-deploy@example.com';"
```
---
## SCRIPT AUTOMATIZADO COMPLETO
Para automatizar todo el proceso, usar el siguiente script:
```bash
#!/bin/bash
# update-production.sh
# Uso: ./scripts/update-production.sh
set -e
# Colores
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'
# Configuracion
PROJECT_DIR="/ruta/al/proyecto/gamilit"
BACKUP_BASE="/home/gamilit/backups"
DB_NAME="gamilit_platform"
DB_USER="gamilit_user"
DB_HOST="localhost"
DB_PORT="5432"
# DB_PASSWORD debe estar en variable de entorno
# Crear timestamp
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR="$BACKUP_BASE/$TIMESTAMP"
cd "$PROJECT_DIR"
echo -e "${BLUE}"
echo "=============================================="
echo " ACTUALIZACION PRODUCCION GAMILIT"
echo " Timestamp: $TIMESTAMP"
echo "=============================================="
echo -e "${NC}"
# 1. Detener servicios
echo -e "${YELLOW}[1/10] Deteniendo servicios...${NC}"
pm2 stop all
# 2. Crear directorios de backup
echo -e "${YELLOW}[2/10] Creando backup de configuraciones...${NC}"
mkdir -p "$BACKUP_DIR/config" "$BACKUP_DIR/database"
cp apps/backend/.env.production "$BACKUP_DIR/config/" 2>/dev/null || true
cp apps/backend/.env "$BACKUP_DIR/config/backend.env" 2>/dev/null || true
cp apps/frontend/.env.production "$BACKUP_DIR/config/" 2>/dev/null || true
cp apps/frontend/.env "$BACKUP_DIR/config/frontend.env" 2>/dev/null || true
cp ecosystem.config.js "$BACKUP_DIR/config/" 2>/dev/null || true
echo -e "${GREEN}Configuraciones respaldadas en $BACKUP_DIR/config/${NC}"
# 3. Backup de base de datos
echo -e "${YELLOW}[3/10] Creando backup de base de datos...${NC}"
BACKUP_FILE="$BACKUP_DIR/database/gamilit_$TIMESTAMP.sql"
PGPASSWORD="$DB_PASSWORD" pg_dump -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d "$DB_NAME" > "$BACKUP_FILE"
gzip "$BACKUP_FILE"
echo -e "${GREEN}Base de datos respaldada: ${BACKUP_FILE}.gz${NC}"
# 4. Pull del repositorio
echo -e "${YELLOW}[4/10] Actualizando desde repositorio remoto...${NC}"
git fetch origin
git reset --hard origin/main
echo -e "${GREEN}Repositorio actualizado${NC}"
# 5. Restaurar configuraciones
echo -e "${YELLOW}[5/10] Restaurando configuraciones...${NC}"
cp "$BACKUP_DIR/config/.env.production" apps/backend/ 2>/dev/null || true
cp "$BACKUP_DIR/config/.env.production" apps/frontend/ 2>/dev/null || true
# 6. Recrear base de datos
echo -e "${YELLOW}[6/10] Recreando base de datos...${NC}"
cd apps/database
export DATABASE_URL="postgresql://${DB_USER}:${DB_PASSWORD}@${DB_HOST}:${DB_PORT}/${DB_NAME}"
./create-database.sh
cd ../..
# 7. Instalar dependencias
echo -e "${YELLOW}[7/10] Instalando dependencias backend...${NC}"
cd apps/backend && npm install && cd ../..
echo -e "${YELLOW}[8/10] Instalando dependencias frontend...${NC}"
cd apps/frontend && npm install && cd ../..
# 8. Build
echo -e "${YELLOW}[9/10] Construyendo aplicaciones...${NC}"
cd apps/backend && npm run build && cd ../..
cd apps/frontend && npm run build && cd ../..
# 9. Iniciar servicios
echo -e "${YELLOW}[10/10] Iniciando servicios...${NC}"
pm2 start ecosystem.config.js
pm2 save
# 10. Validar
echo -e "${BLUE}"
echo "=============================================="
echo " VALIDACION"
echo "=============================================="
echo -e "${NC}"
./scripts/diagnose-production.sh
echo -e "${GREEN}"
echo "=============================================="
echo " ACTUALIZACION COMPLETADA"
echo "=============================================="
echo -e "${NC}"
echo "Backup disponible en: $BACKUP_DIR"
echo ""
```
---
## ROLLBACK (Si algo falla)
### Restaurar configuraciones
```bash
# Copiar archivos de configuracion del backup
cp /home/gamilit/backups/YYYYMMDD_HHMMSS/config/* apps/backend/
cp /home/gamilit/backups/YYYYMMDD_HHMMSS/config/* apps/frontend/
```
### Restaurar base de datos
```bash
# Restaurar desde backup
BACKUP_FILE="/home/gamilit/backups/YYYYMMDD_HHMMSS/database/gamilit_*.sql.gz"
# Descomprimir
gunzip -c "$BACKUP_FILE" > /tmp/restore.sql
# Restaurar
psql "$DATABASE_URL" < /tmp/restore.sql
# Limpiar
rm /tmp/restore.sql
```
### Volver a commit anterior
```bash
# Ver commits anteriores
git log --oneline -10
# Volver a commit especifico
git reset --hard <commit_hash>
# Reinstalar y reconstruir
cd apps/backend && npm install && npm run build && cd ../..
cd apps/frontend && npm install && npm run build && cd ../..
# Reiniciar
pm2 restart all
```
---
## DOCUMENTACION RELACIONADA
Despues del pull, el agente debe leer estas guias si necesita mas detalle:
| Guia | Proposito |
|------|-----------|
| `GUIA-DESPLIEGUE-PRODUCCION-COMPLETA.md` | Configuracion completa del servidor |
| `GUIA-VALIDACION-PRODUCCION.md` | Validaciones y troubleshooting |
| `GUIA-CREAR-BASE-DATOS.md` | Detalle del proceso de creacion de BD |
---
## CHECKLIST RAPIDO
```
[ ] 1. pm2 stop all
[ ] 2. Backup configuraciones a /home/gamilit/backups/
[ ] 3. Backup base de datos (pg_dump)
[ ] 4. git fetch && git reset --hard origin/main
[ ] 5. Restaurar .env files
[ ] 6. cd apps/database && ./create-database.sh
[ ] 7. npm install (backend y frontend)
[ ] 8. npm run build (backend y frontend)
[ ] 9. pm2 start ecosystem.config.js
[ ] 10. ./scripts/diagnose-production.sh
```
---
**Ultima actualizacion:** 2025-12-18
**Autor:** Sistema de documentacion GAMILIT