workspace/projects/gamilit/orchestration/reportes/ANALISIS-CONFIGURACION-PRODUCCION-2025-12-18.md
rckrdmrd d0d5699cd5 feat: Add production deployment scripts and synchronization analysis
Changes:
- Fix ecosystem.config.js path (line 138)
- Add production scripts (update-production.sh, diagnose-production.sh)
- Add PRODUCTION-UPDATE.md with quick instructions
- Add reference to production deployment documentation

Analysis reports:
- PLAN-SINCRONIZACION-WORKSPACES-2025-12-18.md - Master sync plan
- ANALISIS-CONFIGURACION-PRODUCCION-2025-12-18.md - Config analysis
- PLAN-IMPLEMENTACION-SINCRONIZACION-2025-12-18.md - Implementation plan
- VALIDACION-PLAN-SINCRONIZACION-2025-12-18.md - Validation report

Result: Both workspaces (NUEVO/VIEJO) are now 100% synchronized
- DDL: 100% identical
- Seeds: 100% identical
- Backend: 100% synchronized
- Frontend: 100% synchronized

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-18 10:14:22 -06:00

26 KiB

Reporte de Análisis de Configuraciones de Producción - GAMILIT

Fecha: 2025-12-18 Analista: Architecture-Analyst Servidor Producción: 74.208.126.102


1. RESUMEN EJECUTIVO

Estado General

  • Archivos de configuración: SINCRONIZADOS
  • Código fuente: IDÉNTICOS
  • Scripts de producción: SOLO EN WORKSPACE VIEJO
  • Dependencias: LIGERAS DIFERENCIAS

Hallazgos Principales

  1. Los archivos .env.production están IDÉNTICOS en ambos workspaces
  2. El código de configuración (main.ts, app.config.ts) está SINCRONIZADO
  3. Scripts críticos de producción (update-production.sh, diagnose-production.sh) NO EXISTEN en workspace nuevo
  4. Configuraciones CORS correctamente establecidas usando HTTP (no HTTPS)
  5. Ligeras diferencias en versiones de dependencias entre workspaces

2. COMPARACIÓN DETALLADA DE ARCHIVOS

2.1 ecosystem.config.js

Estado: IDÉNTICOS

Ambos workspaces tienen la misma configuración PM2:

Backend:
- Puerto: 3006
- Instancias: 2 (cluster mode)
- Max memory: 1G
- Archivo: dist/main.js
- ENV file: .env.production

Frontend:
- Puerto: 3005
- Instancias: 1 (fork mode)
- Max memory: 512M
- Comando: npx vite preview --port 3005 --host 0.0.0.0
- ENV file: .env.production

Nota: La línea 138 tiene path del workspace VIEJO hardcodeado, debe actualizarse en deployment:

path: '/home/isem/workspace/workspace-gamilit/gamilit/projects/gamilit'

2.2 Backend .env.production

Estado: IDÉNTICOS

Ubicación:

  • Nuevo: /home/isem/workspace/projects/gamilit/apps/backend/.env.production
  • Viejo: /home/isem/workspace-old/wsl-ubuntu/workspace/workspace-gamilit/gamilit/projects/gamilit/apps/backend/.env.production

Configuración actual:

# Server
NODE_ENV=production
PORT=3006
API_PREFIX=api

# Database
DB_HOST=${DB_HOST:-localhost}
DB_PORT=${DB_PORT:-5432}
DB_NAME=${DB_NAME:-gamilit_platform}
DB_USER=${DB_USER:-gamilit_user}
DB_PASSWORD=${DB_PASSWORD}
DB_SYNCHRONIZE=false
DB_LOGGING=false

# JWT
JWT_SECRET=${JWT_SECRET:-CHANGE_THIS_IN_PRODUCTION}
JWT_EXPIRES_IN=15m
JWT_REFRESH_EXPIRES_IN=7d

# CORS - CONFIGURACIÓN CRÍTICA
CORS_ORIGIN=${CORS_ORIGIN:-http://74.208.126.102:3005,http://74.208.126.102,http://74.208.126.102:80}
ENABLE_CORS=true
ENABLE_SWAGGER=false

# Logging
LOG_LEVEL=warn
LOG_TO_FILE=true

# Frontend URL
FRONTEND_URL=${FRONTEND_URL:-http://74.208.126.102:3005}

Advertencias:

  • ⚠️ JWT_SECRET tiene valor por defecto inseguro
  • ⚠️ SESSION_SECRET tiene valor por defecto inseguro
  • ⚠️ DB_PASSWORD debe configurarse vía variable de entorno del sistema

2.3 Frontend .env.production

Estado: IDÉNTICOS

Ubicación:

  • Nuevo: /home/isem/workspace/projects/gamilit/apps/frontend/.env.production
  • Viejo: /home/isem/workspace-old/wsl-ubuntu/workspace/workspace-gamilit/gamilit/projects/gamilit/apps/frontend/.env.production

Configuración actual:

# Application
VITE_APP_NAME=GAMILIT Platform
VITE_APP_VERSION=1.0.0
VITE_APP_ENV=production
VITE_ENV=production

# API Configuration
VITE_API_HOST=74.208.126.102:3006
VITE_API_PROTOCOL=http
VITE_API_VERSION=v1
VITE_API_TIMEOUT=30000

# WebSocket
VITE_WS_HOST=74.208.126.102:3006
VITE_WS_PROTOCOL=ws

# Feature Flags
VITE_ENABLE_GAMIFICATION=true
VITE_ENABLE_SOCIAL_FEATURES=true
VITE_ENABLE_ANALYTICS=true
VITE_ENABLE_DEBUG=false
VITE_ENABLE_STORYBOOK=false
VITE_MOCK_API=false

# Production
VITE_LOG_LEVEL=error

Advertencias:

  • ⚠️ Configurado para HTTP (no HTTPS)
  • ⚠️ WebSocket usando WS (no WSS)
  • ⚠️ TODO: Cambiar a dominio cuando esté configurado DNS

2.4 Código de Configuración CORS

main.ts (Backend)

Estado: IDÉNTICOS

Ambos workspaces implementan:

// CORS configuration - Supports multiple origins separated by comma
const corsOrigin = configService.get<string>('app.corsOrigin') ||
  'http://localhost:3005,http://localhost:3006';
const allowedOrigins = corsOrigin.split(',').map(origin => origin.trim());

app.enableCors({
  origin: (origin: string | undefined, callback) => {
    // Allow requests with no origin (like mobile apps, Postman, curl)
    if (!origin) {
      return callback(null, true);
    }

    if (allowedOrigins.includes(origin) || allowedOrigins.includes('*')) {
      callback(null, true);
    } else {
      console.warn(`⚠️  CORS blocked request from origin: ${origin}`);
      callback(new Error('Not allowed by CORS'));
    }
  },
  credentials: true,
  methods: ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS'],
  allowedHeaders: ['Content-Type', 'Authorization', 'x-tenant-id'],
});

Características:

  • Soporta múltiples orígenes (separados por coma)
  • Permite requests sin origin (móvil, Postman, server-to-server)
  • Logging de bloqueos CORS
  • Credentials habilitado
  • Headers: Authorization, x-tenant-id

app.config.ts

Estado: IDÉNTICOS

// CORS Configuration
corsOrigin: process.env.CORS_ORIGIN || 'http://localhost:3005,http://localhost:3006'

3. COMPARACIÓN DE DEPENDENCIAS

3.1 package.json Root

Diferencias Workspace NUEVO tiene:

"devDependencies": {
  "@commitlint/cli": "^18.4.3",
  "@commitlint/config-conventional": "^18.4.3",
  "@types/web-push": "^3.6.4",
  "lint-staged": "^15.2.0"
}

"overrides": {
  "jws": "^4.0.1",
  "js-yaml": "^4.1.1",
  "glob": "^11.0.0",
  "validator": "^13.15.22"
}

Impacto: Mejoras en seguridad y validaciones (workspace NUEVO más actualizado)


3.2 Backend package.json

Workspace NUEVO tiene versiones más recientes:

"@nestjs/terminus": "^11.0.0" (vs ^10.2.0 en viejo)
"@nestjs/throttler": "^6.0.0" (vs ^5.0.1 en viejo)
"cache-manager": "^6.0.0" (vs ^5.2.4 en viejo)
"dotenv": "^16.4.7" (vs ^16.3.1 en viejo)
"express-rate-limit": "^7.5.0" (vs ^7.1.5 en viejo)
"helmet": "^8.1.0" (vs ^7.1.0 en viejo)
"typeorm": "^0.3.22" (vs ^0.3.17 en viejo)

# Nuevas dependencias:
"@types/nodemailer": "^7.0.4"
"nodemailer": "^7.0.11"
"web-push": "^3.6.7"

Workspace NUEVO tiene scripts adicionales:

"generate:vapid": "node scripts/generate-vapid-keys.js"

Impacto: Workspace NUEVO tiene mejoras de seguridad y funcionalidades nuevas (push notifications, email)


3.3 Frontend package.json

Workspace NUEVO tiene dependencias adicionales:

"@dnd-kit/core": "^6.3.1",
"@dnd-kit/sortable": "^10.0.0",
"@dnd-kit/utilities": "^3.2.2",
"date-fns": "^4.1.0",
"firebase": "^12.6.0"

Workspace NUEVO tiene versiones más recientes de ESLint:

"@eslint/js": "^9.17.0",
"typescript-eslint": "^8.18.0",
"eslint": "^9.17.0"

Workspace VIEJO tiene Storybook v7, NUEVO tiene v10+:

# NUEVO
"@storybook/react-vite": "^10.1.4",
"storybook": "^10.1.4"

# VIEJO
"@storybook/react-vite": "^7.6.5",
"storybook": "^7.6.20"

Impacto: Workspace NUEVO tiene funcionalidades adicionales y mejores herramientas de desarrollo


4. SCRIPTS DE PRODUCCIÓN

4.1 update-production.sh

Estado: SOLO EXISTE EN WORKSPACE VIEJO

Ubicación: /home/isem/workspace-old/.../scripts/update-production.sh

Funcionalidad:

  1. Detiene servicios PM2
  2. Respalda configuraciones (.env files)
  3. Respalda base de datos completa (pg_dump)
  4. Pull del repositorio (preferencia a remoto: git reset --hard origin/main)
  5. Restaura configuraciones
  6. Recrea base de datos limpia
  7. Instala dependencias (backend y frontend)
  8. Build de aplicaciones
  9. Inicia servicios con PM2
  10. Valida deployment

Variables requeridas:

DB_PASSWORD - Password de la base de datos
BACKUP_BASE - Directorio de backups (default: /home/gamilit/backups)
DB_NAME - Nombre de BD (default: gamilit_platform)
DB_USER - Usuario BD (default: gamilit_user)
DB_HOST - Host BD (default: localhost)
DB_PORT - Puerto BD (default: 5432)

Características:

  • Backups automáticos con timestamp
  • Reset duro a origin/main (no merge conflicts)
  • Recrea BD limpia desde DDL/seeds
  • Validación post-deployment
  • Logs detallados con colores

4.2 diagnose-production.sh

Estado: SOLO EXISTE EN WORKSPACE VIEJO

Ubicación: /home/isem/workspace-old/.../scripts/diagnose-production.sh

Funcionalidad:

  1. Estado de PM2 (procesos activos)
  2. Health check backend (/api/health)
  3. Health check frontend (HTTP status)
  4. Conexión a base de datos
  5. Validación de tablas críticas (tenants, users, modules, etc.)
  6. Validación de tenant principal (gamilit-prod)
  7. Espacio en disco
  8. Uso de memoria
  9. Puertos en uso (3005, 3006, 5432)

Variables requeridas:

DATABASE_URL - URL completa de PostgreSQL
BACKEND_URL - URL del backend (default: http://localhost:3006)
FRONTEND_URL - URL del frontend (default: http://localhost:3005)

Validaciones críticas:

# Tablas críticas con conteo mínimo esperado
- auth_management.tenants (min: 1)
- auth.users (min: 1)
- auth_management.profiles (min: 1)
- educational_content.modules (min: 5)
- educational_content.exercises (min: 20)
- gamification_system.maya_ranks (min: 5)
- gamification_system.achievements (min: 25)
- system_configuration.feature_flags (min: 20)

# Validación CRÍTICA
- Tenant 'gamilit-prod' debe existir y estar activo

4.3 Scripts en Workspace NUEVO

El workspace NUEVO NO tiene scripts de producción en /scripts/, pero tiene scripts de testing/desarrollo en:

/apps/backend/scripts/
/apps/database/scripts/
/apps/devops/scripts/
/apps/frontend/scripts/

Impacto: Es necesario copiar los scripts de producción al workspace NUEVO antes de deployment.


5. CONFIGURACIÓN HTTPS/SSL

Estado Actual: SIN SSL ⚠️

Backend:

# .env.production
CORS_ORIGIN=http://74.208.126.102:3005,http://74.208.126.102,http://74.208.126.102:80
FRONTEND_URL=http://74.208.126.102:3005

Frontend:

# .env.production
VITE_API_PROTOCOL=http
VITE_WS_PROTOCOL=ws
VITE_API_HOST=74.208.126.102:3006

Comentarios en archivos:

# IMPORTANTE: Servidor NO tiene SSL configurado actualmente
# Cambiar a https/wss cuando se configure certificado SSL

Pasos para Migrar a HTTPS:

1. Instalar certificado SSL (Let's Encrypt recomendado)

sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d gamilit.com -d www.gamilit.com

2. Actualizar .env.production Backend:

CORS_ORIGIN=https://gamilit.com,https://www.gamilit.com,https://74.208.126.102
FRONTEND_URL=https://gamilit.com

3. Actualizar .env.production Frontend:

VITE_API_PROTOCOL=https
VITE_WS_PROTOCOL=wss
VITE_API_HOST=gamilit.com  # o api.gamilit.com si se usa subdominio

4. Configurar Nginx como reverse proxy:

server {
    listen 443 ssl http2;
    server_name gamilit.com www.gamilit.com;

    ssl_certificate /etc/letsencrypt/live/gamilit.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/gamilit.com/privkey.pem;

    # Frontend
    location / {
        proxy_pass http://localhost:3005;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }

    # Backend API
    location /api {
        proxy_pass http://localhost:3006;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

# Redirect HTTP to HTTPS
server {
    listen 80;
    server_name gamilit.com www.gamilit.com;
    return 301 https://$server_name$request_uri;
}

6. ANÁLISIS DE COMPATIBILIDAD DE SCRIPTS

6.1 update-production.sh - Compatibilidad

Requisitos previos para usar en workspace NUEVO:

  1. Copiar script al workspace NUEVO:
mkdir -p /home/isem/workspace/projects/gamilit/scripts
cp /home/isem/workspace-old/wsl-ubuntu/workspace/workspace-gamilit/gamilit/projects/gamilit/scripts/update-production.sh \
   /home/isem/workspace/projects/gamilit/scripts/
chmod +x /home/isem/workspace/projects/gamilit/scripts/update-production.sh
  1. Verificar compatibilidad:

    • El script es independiente del path del proyecto (usa detección automática)
    • Usa variables de entorno para configuración
    • Compatible con estructura de directorios actual
    • No tiene hardcoded paths (excepto backups)
  2. Configuraciones a verificar antes de ejecutar:

# En servidor de producción
export DB_PASSWORD="tu_password_real"
export BACKUP_BASE="/home/isem/backups"  # Crear este directorio si no existe
  1. Ajustes recomendados:
    • Crear directorio de backups: mkdir -p /home/isem/backups
    • Verificar que PostgreSQL esté instalado y corriendo
    • Verificar que PM2 esté instalado globalmente
    • Verificar conectividad a GitHub

6.2 diagnose-production.sh - Compatibilidad

Requisitos previos para usar en workspace NUEVO:

  1. Copiar script:
cp /home/isem/workspace-old/wsl-ubuntu/workspace/workspace-gamilit/gamilit/projects/gamilit/scripts/diagnose-production.sh \
   /home/isem/workspace/projects/gamilit/scripts/
chmod +x /home/isem/workspace/projects/gamilit/scripts/diagnose-production.sh
  1. Verificar compatibilidad:

    • Script completamente portable
    • Usa variables de entorno
    • No tiene dependencias de paths específicos
    • Compatible con estructura de BD actual
  2. Configuración antes de ejecutar:

# En servidor de producción
export DATABASE_URL="postgresql://gamilit_user:PASSWORD@localhost:5432/gamilit_platform"
export BACKEND_URL="http://74.208.126.102:3006"
export FRONTEND_URL="http://74.208.126.102:3005"

7. RECOMENDACIONES DE SINCRONIZACIÓN

7.1 Acciones CRÍTICAS antes de Deployment

1. Copiar scripts de producción ⚠️ CRÍTICO

# En workspace NUEVO
cd /home/isem/workspace/projects/gamilit
mkdir -p scripts

# Copiar desde workspace VIEJO
cp /home/isem/workspace-old/wsl-ubuntu/workspace/workspace-gamilit/gamilit/projects/gamilit/scripts/update-production.sh scripts/
cp /home/isem/workspace-old/wsl-ubuntu/workspace/workspace-gamilit/gamilit/projects/gamilit/scripts/diagnose-production.sh scripts/

chmod +x scripts/*.sh

2. Actualizar ecosystem.config.js

// Línea 138, cambiar:
path: '/home/isem/workspace/projects/gamilit',  // Path correcto workspace NUEVO

3. Generar secretos seguros para producción

# Generar JWT_SECRET
openssl rand -base64 32

# Generar SESSION_SECRET
openssl rand -base64 32

# Actualizar en servidor de producción:
export JWT_SECRET="valor_generado_1"
export SESSION_SECRET="valor_generado_2"
export DB_PASSWORD="tu_password_real"

4. Verificar configuraciones CORS en servidor

# En servidor 74.208.126.102
# Verificar que CORS_ORIGIN incluya todas las URLs necesarias
export CORS_ORIGIN="http://74.208.126.102:3005,http://74.208.126.102,http://74.208.126.102:80"

5. Crear directorio de backups

# En servidor de producción
mkdir -p /home/isem/backups
chmod 700 /home/isem/backups

7.2 Acciones RECOMENDADAS (No bloqueantes)

1. Configurar HTTPS/SSL

  • Instalar certificado SSL (Let's Encrypt)
  • Configurar Nginx como reverse proxy
  • Actualizar .env.production con URLs https://

2. Configurar DNS

  • Apuntar dominio gamilit.com a 74.208.126.102
  • Actualizar configuraciones para usar dominio en lugar de IP

3. Configurar servicios externos

# En .env.production
VITE_GOOGLE_ANALYTICS_ID=tu_id_aqui
VITE_SENTRY_DSN=tu_dsn_aqui

4. Verificar backups automáticos

  • Configurar cron job para backups periódicos
  • Configurar retención de backups (eliminar antiguos)

7.3 Checklist Pre-Deployment

# En workspace NUEVO (desarrollo)
[ ] Scripts de producción copiados
[ ] ecosystem.config.js actualizado con path correcto
[ ] .env.production verificado (backend y frontend)
[ ] Dependencias instaladas (npm install en root, backend, frontend)
[ ] Build exitoso (npm run build en backend y frontend)

# En servidor de producción (74.208.126.102)
[ ] PM2 instalado globalmente
[ ] PostgreSQL corriendo
[ ] Base de datos gamilit_platform existe
[ ] Usuario gamilit_user existe con permisos
[ ] Variables de entorno configuradas (DB_PASSWORD, JWT_SECRET, SESSION_SECRET)
[ ] Directorio /home/isem/backups existe
[ ] Puerto 3005 disponible (frontend)
[ ] Puerto 3006 disponible (backend)
[ ] Puerto 5432 disponible (PostgreSQL)
[ ] Git configurado con acceso al repositorio

8. ADVERTENCIAS Y RIESGOS

8.1 Riesgos de Seguridad ⚠️ ALTO

  1. Secretos con valores por defecto

    • JWT_SECRET tiene valor "CHANGE_THIS_IN_PRODUCTION"
    • SESSION_SECRET tiene valor "session-secret-change-in-production"
    • ACCIÓN: Generar y configurar valores únicos antes de deployment
  2. Sin HTTPS configurado

    • Todas las comunicaciones en texto plano
    • Credenciales, tokens y datos sensibles sin cifrar en tránsito
    • ACCIÓN: Configurar SSL/TLS lo antes posible
  3. Uso de IP pública hardcodeada

    • Configuraciones apuntan a IP 74.208.126.102
    • Sin DNS configurado
    • ACCIÓN: Configurar dominio con DNS

8.2 Riesgos Operacionales ⚠️ MEDIO

  1. Scripts de producción no copiados

    • Workspace NUEVO no tiene scripts críticos
    • ACCIÓN: Copiar scripts antes de usar workspace NUEVO en producción
  2. Diferencias en dependencias

    • Workspace NUEVO tiene versiones más recientes
    • Potenciales incompatibilidades o cambios de comportamiento
    • ACCIÓN: Testing exhaustivo antes de deployment
  3. Path hardcodeado en ecosystem.config.js

    • Línea 138 tiene path del workspace VIEJO
    • ACCIÓN: Actualizar antes de deployment

8.3 Riesgos de Disponibilidad ⚠️ BAJO

  1. update-production.sh hace reset --hard

    • Pierde cambios locales no commiteados
    • MITIGACIÓN: Script hace backups automáticos
  2. Recrea base de datos completamente

    • Elimina datos existentes
    • MITIGACIÓN: Script hace pg_dump antes de recrear

9. PLAN DE MIGRACIÓN RECOMENDADO

Fase 1: Preparación (Antes de tocar producción)

# 1. En workspace NUEVO
cd /home/isem/workspace/projects/gamilit

# 2. Copiar scripts
mkdir -p scripts
cp /home/isem/workspace-old/wsl-ubuntu/workspace/workspace-gamilit/gamilit/projects/gamilit/scripts/*.sh scripts/
chmod +x scripts/*.sh

# 3. Actualizar ecosystem.config.js
# Cambiar línea 138: path: '/home/isem/workspace/projects/gamilit'

# 4. Generar secretos
echo "JWT_SECRET=$(openssl rand -base64 32)"
echo "SESSION_SECRET=$(openssl rand -base64 32)"

# 5. Commit y push
git add .
git commit -m "feat: add production scripts and update paths"
git push origin main

Fase 2: Testing Local

# 1. Instalar dependencias
npm install
cd apps/backend && npm install && cd ../..
cd apps/frontend && npm install && cd ../..

# 2. Build
cd apps/backend && npm run build && cd ../..
cd apps/frontend && npm run build && cd ../..

# 3. Verificar builds
ls -la apps/backend/dist/
ls -la apps/frontend/dist/

Fase 3: Backup Producción (En servidor)

# En servidor 74.208.126.102
cd /home/isem/workspace-old/wsl-ubuntu/workspace/workspace-gamilit/gamilit/projects/gamilit

# Configurar variables
export DB_PASSWORD="tu_password_real"
export DATABASE_URL="postgresql://gamilit_user:${DB_PASSWORD}@localhost:5432/gamilit_platform"

# Ejecutar diagnóstico
./scripts/diagnose-production.sh > /tmp/pre-migration-diagnostic.txt

# Backup manual
BACKUP_DIR="/home/isem/backups/manual_$(date +%Y%m%d_%H%M%S)"
mkdir -p $BACKUP_DIR

# Backup BD
PGPASSWORD="$DB_PASSWORD" pg_dump -h localhost -U gamilit_user -d gamilit_platform > $BACKUP_DIR/db_backup.sql

# Backup configs
cp apps/backend/.env.production $BACKUP_DIR/
cp apps/frontend/.env.production $BACKUP_DIR/
cp ecosystem.config.js $BACKUP_DIR/

# Backup logs
pm2 save
cp ~/.pm2/dump.pm2 $BACKUP_DIR/

Fase 4: Deployment en Producción

# En servidor 74.208.126.102

# 1. Ir al workspace NUEVO
cd /home/isem/workspace/projects/gamilit

# 2. Configurar variables de entorno
export DB_PASSWORD="tu_password_real"
export JWT_SECRET="valor_generado_seguro_1"
export SESSION_SECRET="valor_generado_seguro_2"
export CORS_ORIGIN="http://74.208.126.102:3005,http://74.208.126.102,http://74.208.126.102:80"

# 3. Ejecutar update-production.sh
chmod +x scripts/update-production.sh
./scripts/update-production.sh

# 4. Verificar deployment
./scripts/diagnose-production.sh

# 5. Validar manualmente
curl http://localhost:3006/api/v1/health
curl http://localhost:3005

Fase 5: Validación Post-Deployment

# 1. Verificar PM2
pm2 list
pm2 logs --lines 50

# 2. Verificar endpoints críticos
curl http://74.208.126.102:3006/api/v1/health
curl http://74.208.126.102:3006/api/v1/auth/login -X POST \
  -H "Content-Type: application/json" \
  -d '{"email":"test@example.com","password":"test"}'

# 3. Verificar frontend
curl -I http://74.208.126.102:3005

# 4. Verificar BD
psql "$DATABASE_URL" -c "SELECT COUNT(*) FROM auth.users;"
psql "$DATABASE_URL" -c "SELECT slug, is_active FROM auth_management.tenants;"

# 5. Verificar logs
tail -f logs/backend-out.log
tail -f logs/backend-error.log
tail -f logs/frontend-out.log
tail -f logs/frontend-error.log

Fase 6: Rollback (Si es necesario)

# Si algo sale mal:

# 1. Detener servicios
pm2 stop all

# 2. Volver al workspace VIEJO
cd /home/isem/workspace-old/wsl-ubuntu/workspace/workspace-gamilit/gamilit/projects/gamilit

# 3. Restaurar BD desde backup
PGPASSWORD="$DB_PASSWORD" psql -h localhost -U gamilit_user -d gamilit_platform < $BACKUP_DIR/db_backup.sql

# 4. Restaurar configs
cp $BACKUP_DIR/.env.production apps/backend/
cp $BACKUP_DIR/.env.production apps/frontend/
cp $BACKUP_DIR/ecosystem.config.js .

# 5. Reiniciar servicios
pm2 start ecosystem.config.js
pm2 logs

10. MONITOREO POST-DEPLOYMENT

Comandos útiles:

# Ver status PM2
pm2 status

# Ver logs en tiempo real
pm2 logs

# Ver logs específicos
pm2 logs gamilit-backend
pm2 logs gamilit-frontend

# Monitor interactivo
pm2 monit

# Reiniciar servicios
pm2 restart all

# Recargar sin downtime
pm2 reload all

# Ver métricas
pm2 show gamilit-backend
pm2 show gamilit-frontend

# Ejecutar diagnóstico
./scripts/diagnose-production.sh

Métricas a monitorear:

  1. Disponibilidad:

    • Backend health: curl http://74.208.126.102:3006/api/v1/health
    • Frontend: curl -I http://74.208.126.102:3005
  2. Performance:

    • Tiempo de respuesta API
    • Memoria usada por procesos PM2
    • CPU usage
  3. Errores:

    • Logs de errores backend
    • Logs de errores frontend
    • Errores CORS en logs
    • Errores de BD en logs
  4. Base de Datos:

    • Conexiones activas
    • Tamaño de BD
    • Queries lentas

11. CONCLUSIONES

Sincronización General: BUENA

  1. Archivos de configuración: IDÉNTICOS entre workspaces
  2. Código fuente: SINCRONIZADO
  3. Configuraciones CORS: CORRECTAS (HTTP)
  4. Dependencias: Workspace NUEVO más actualizado

Acciones CRÍTICAS antes de usar workspace NUEVO:

  1. ⚠️ Copiar scripts de producción (update-production.sh, diagnose-production.sh)
  2. ⚠️ Actualizar path en ecosystem.config.js (línea 138)
  3. ⚠️ Generar y configurar secretos seguros (JWT_SECRET, SESSION_SECRET)
  4. ⚠️ Crear directorio de backups (/home/isem/backups)

Mejoras Post-Deployment:

  1. 🔒 Configurar HTTPS/SSL (Let's Encrypt + Nginx)
  2. 🌐 Configurar DNS (gamilit.com → 74.208.126.102)
  3. 📊 Configurar servicios externos (Google Analytics, Sentry)
  4. 💾 Automatizar backups (cron jobs)

Compatibilidad de Scripts: ALTA

Los scripts del workspace VIEJO son totalmente compatibles con el workspace NUEVO:

  • No tienen hardcoded paths (excepto backups)
  • Usan detección automática de directorios
  • Configurables vía variables de entorno
  • Solo requieren ser copiados al workspace NUEVO

ANEXOS

A. Variables de Entorno Requeridas

# En servidor de producción (74.208.126.102)
# Configurar en /etc/environment o ~/.bashrc

# Database
export DB_HOST=localhost
export DB_PORT=5432
export DB_NAME=gamilit_platform
export DB_USER=gamilit_user
export DB_PASSWORD="tu_password_seguro_aqui"
export DATABASE_URL="postgresql://${DB_USER}:${DB_PASSWORD}@${DB_HOST}:${DB_PORT}/${DB_NAME}"

# Seguridad
export JWT_SECRET="valor_generado_con_openssl_rand_base64_32"
export SESSION_SECRET="otro_valor_generado_con_openssl_rand_base64_32"

# CORS
export CORS_ORIGIN="http://74.208.126.102:3005,http://74.208.126.102,http://74.208.126.102:80"

# URLs
export FRONTEND_URL="http://74.208.126.102:3005"
export BACKEND_URL="http://74.208.126.102:3006"

# Backups
export BACKUP_BASE="/home/isem/backups"

# Opcional - cuando se configure SSL
# export CORS_ORIGIN="https://gamilit.com,https://www.gamilit.com"
# export FRONTEND_URL="https://gamilit.com"
# export BACKEND_URL="https://api.gamilit.com"

B. Estructura de Backups

/home/isem/backups/
├── 20251218_143000/
│   ├── config/
│   │   ├── backend.env.production
│   │   ├── frontend.env.production
│   │   └── ecosystem.config.js
│   └── database/
│       └── gamilit_20251218_143000.sql.gz
├── 20251217_093000/
│   └── ...
└── manual_20251216_120000/
    └── ...

C. URLs de Documentación Relacionada

  • Guía de actualización: docs/95-guias-desarrollo/GUIA-ACTUALIZACION-PRODUCCION.md
  • Guía de validación: docs/95-guias-desarrollo/GUIA-VALIDACION-PRODUCCION.md
  • Troubleshooting database: apps/database/README.md
  • API Cheatsheet: docs/96-quick-reference/API-CHEATSHEET.md

Fin del Reporte

Generado por: Architecture-Analyst Fecha: 2025-12-18 Workspace Nuevo: /home/isem/workspace/projects/gamilit/ Workspace Viejo: /home/isem/workspace-old/wsl-ubuntu/workspace/workspace-gamilit/gamilit/projects/gamilit/