## 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>
16 KiB
16 KiB
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:
- Se notifica que hay un commit en remoto
- 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
# 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)
# 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
# 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
# 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
# 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
# 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
# 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
# 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
# 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
# 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
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:
- DROP DATABASE (si existe)
- CREATE DATABASE
- Cargar DDL (16 fases - schemas, tablas, funciones, triggers)
- Cargar Seeds de produccion (57 archivos)
6.3 Verificar carga de datos
# 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
# Ejecutar script de reparacion
./scripts/repair-missing-data.sh
PASO 7: INSTALAR DEPENDENCIAS
7.1 Backend
cd apps/backend
# Limpiar node_modules si hay problemas
# rm -rf node_modules package-lock.json
# Instalar dependencias
npm install
cd ../..
7.2 Frontend
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
cd apps/backend
# Build de produccion
npm run build
# Verificar que el build fue exitoso
ls -la dist/
cd ../..
8.2 Build Frontend
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
# Iniciar usando ecosystem.config.js
pm2 start ecosystem.config.js
# Verificar estado
pm2 list
# Guardar configuracion de PM2
pm2 save
9.2 Verificar logs
# 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
./scripts/diagnose-production.sh
10.2 Verificaciones manuales
# 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)
# 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:
#!/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
# 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
# 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
# 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