# Guía de Despliegue - GAMILIT Platform ## 📋 Información General Esta guía describe el proceso completo de despliegue de la plataforma GAMILIT en el servidor de producción. ### Servidor de Producción - **IP**: 74.208.126.102 - **Usuario**: isem - **Backend**: Puerto 3006 (2 instancias en cluster) - **Frontend**: Puerto 3005 (1 instancia) - **Base de datos**: PostgreSQL 15 (ya configurada) - **Gestor de procesos**: PM2 --- ## 🚀 Proceso de Despliegue Completo ### 1. Pre-requisitos Antes de comenzar el despliegue, asegúrate de tener instalado: ```bash # Node.js (v18 o superior) node --version # npm (v9 o superior) npm --version # PM2 (se instalará automáticamente si no está presente) npm install -g pm2 # PostgreSQL client (opcional, para verificar BD) psql --version ``` ### 2. Verificación Pre-Despliegue Ejecuta el script de verificación para asegurarte de que todo está listo: ```bash ./scripts/pre-deploy-check.sh ``` Este script verifica: - ✅ Node.js y npm instalados - ✅ PM2 instalado - ✅ Archivos de configuración presentes - ✅ Configuración de puertos correcta - ✅ Configuración de CORS - ✅ Configuración de base de datos - ✅ Secrets de producción - ✅ Conectividad a la base de datos - ✅ Permisos de directorios ### 3. Build para Producción Compila tanto el backend como el frontend: ```bash ./scripts/build-production.sh ``` Este script: 1. Instala las dependencias del proyecto 2. Compila el backend (TypeScript → JavaScript) 3. Compila el frontend (React + Vite → archivos estáticos optimizados) 4. Muestra el tamaño de los builds 5. Verifica que los builds fueron exitosos **Resultado esperado:** - `apps/backend/dist/main.js` - Backend compilado - `apps/frontend/dist/` - Frontend compilado (archivos estáticos) ### 4. Despliegue con PM2 Una vez que los builds estén listos, despliega la aplicación: ```bash ./scripts/deploy-production.sh ``` Este script: 1. Verifica que PM2 esté instalado 2. Verifica que los builds existan 3. Verifica archivos `.env.production` 4. Crea el directorio de logs si no existe 5. Detiene procesos PM2 anteriores (si existen) 6. Inicia el backend (2 instancias en cluster) 7. Inicia el frontend (1 instancia) 8. Guarda la configuración de PM2 9. Muestra el estado de los procesos **Resultado esperado:** ``` ┌─────┬──────────────────────┬─────────┬─────────┬─────────┬──────────┐ │ id │ name │ mode │ status │ cpu │ memory │ ├─────┼──────────────────────┼─────────┼─────────┼─────────┼──────────┤ │ 0 │ gamilit-backend │ cluster │ online │ 0% │ 120 MB │ │ 1 │ gamilit-backend │ cluster │ online │ 0% │ 115 MB │ │ 2 │ gamilit-frontend │ fork │ online │ 0% │ 85 MB │ └─────┴──────────────────────┴─────────┴─────────┴─────────┴──────────┘ ``` --- ## 📁 Estructura de Archivos de Configuración ### `ecosystem.config.js` (Raíz del proyecto) Archivo de configuración de PM2 que define cómo se ejecutan los procesos: ```javascript { apps: [ { name: 'gamilit-backend', instances: 2, // 2 instancias en cluster exec_mode: 'cluster', // Modo cluster para balanceo de carga env_file: './.env.production' }, { name: 'gamilit-frontend', instances: 1, exec_mode: 'fork' } ] } ``` ### `apps/backend/.env.production` Variables de entorno del backend en producción: ```bash NODE_ENV=production PORT=3006 DB_HOST=74.208.126.102 DB_NAME=gamilit_platform CORS_ORIGIN=http://74.208.126.102:3005,http://74.208.126.102 JWT_SECRET=PROD_IksGn8fpggQ2MlhAG3/dlzpIOrx+cNyAgEBmYF3nIYs= # ... más variables ``` ### `apps/frontend/.env.production` Variables de entorno del frontend en producción: ```bash VITE_ENV=production VITE_API_URL=http://74.208.126.102:3006/api VITE_WS_URL=ws://74.208.126.102:3006 VITE_ENABLE_DEBUG=false # ... más variables ``` --- ## 🔧 Comandos de PM2 ### Gestión de Procesos ```bash # Ver estado de todos los procesos pm2 status # Ver logs en tiempo real pm2 logs # Ver logs solo del backend pm2 logs gamilit-backend # Ver logs solo del frontend pm2 logs gamilit-frontend # Monitor interactivo pm2 monit ``` ### Reiniciar Procesos ```bash # Reiniciar todos los procesos pm2 restart all # Reiniciar solo el backend pm2 restart gamilit-backend # Reiniciar solo el frontend pm2 restart gamilit-frontend # Reload (zero-downtime restart) - solo para cluster mode pm2 reload gamilit-backend ``` ### Detener y Eliminar Procesos ```bash # Detener todos los procesos pm2 stop all # Detener un proceso específico pm2 stop gamilit-backend # Eliminar todos los procesos pm2 delete all # Eliminar un proceso específico pm2 delete gamilit-backend ``` ### Guardar y Restaurar Configuración ```bash # Guardar la configuración actual pm2 save # Restaurar procesos guardados pm2 resurrect # Configurar inicio automático en boot pm2 startup # (Seguir las instrucciones que muestra el comando) ``` --- ## 🌐 URLs de Acceso Una vez desplegado, la aplicación estará disponible en: - **Frontend**: http://74.208.126.102:3005 - **Backend API**: http://74.208.126.102:3006/api - **API Documentation**: http://74.208.126.102:3006/api/docs - **Health Check**: http://74.208.126.102:3006/api/health --- ## 🔒 Configuración de CORS El backend está configurado para aceptar requests desde: - `http://74.208.126.102:3005` (Frontend en producción) - `http://74.208.126.102` (Por si se accede sin puerto) - `https://gamilit.com` (Dominio personalizado si se configura) - `https://www.gamilit.com` **Modificar CORS**: Editar `apps/backend/.env.production` → variable `CORS_ORIGIN` --- ## 📊 Monitoreo y Logs ### Ubicación de Logs Los logs de PM2 se guardan en: ``` logs/ ├── backend-error.log # Errores del backend ├── backend-out.log # Output del backend ├── frontend-error.log # Errores del frontend └── frontend-out.log # Output del frontend ``` ### Ver Logs ```bash # Ver últimas 100 líneas de logs del backend pm2 logs gamilit-backend --lines 100 # Ver logs en tiempo real con filtro pm2 logs gamilit-backend | grep ERROR # Ver logs de errores tail -f logs/backend-error.log ``` ### Monitoreo de Recursos ```bash # Monitor interactivo con CPU y memoria pm2 monit # Información detallada de un proceso pm2 show gamilit-backend # Estadísticas pm2 list ``` --- ## 🔄 Actualización de la Aplicación Para actualizar la aplicación después de cambios en el código: ### Opción 1: Actualización Completa ```bash # 1. Detener los procesos pm2 stop all # 2. Obtener últimos cambios (si usas Git) git pull origin main # 3. Rebuild ./scripts/build-production.sh # 4. Redesplegar ./scripts/deploy-production.sh ``` ### Opción 2: Actualización con Zero-Downtime (Backend) ```bash # 1. Obtener cambios git pull origin main # 2. Rebuild backend cd apps/backend npm install npm run build # 3. Reload (zero-downtime) pm2 reload gamilit-backend ``` ### Opción 3: Actualización Manual ```bash # Solo backend cd apps/backend npm install npm run build pm2 restart gamilit-backend # Solo frontend cd apps/frontend npm install npm run build:prod pm2 restart gamilit-frontend ``` --- ## ⚠️ Troubleshooting ### El backend no inicia ```bash # Ver logs de errores pm2 logs gamilit-backend --err --lines 50 # Verificar archivo .env.production cat apps/backend/.env.production # Verificar conectividad a la BD psql -h 74.208.126.102 -U gamilit_user -d gamilit_platform ``` ### El frontend no carga ```bash # Ver logs pm2 logs gamilit-frontend --lines 50 # Verificar que el build existe ls -la apps/frontend/dist/ # Verificar configuración de API cat apps/frontend/.env.production | grep VITE_API_URL ``` ### Error de CORS ```bash # Verificar configuración de CORS en backend cat apps/backend/.env.production | grep CORS_ORIGIN # Debe incluir: http://74.208.126.102:3005 ``` ### Proceso se reinicia constantemente ```bash # Ver logs para identificar el error pm2 logs --lines 100 # Ver información del proceso pm2 show gamilit-backend # Aumentar límite de memoria si es necesario pm2 delete gamilit-backend # Editar ecosystem.config.js → max_memory_restart: '2G' pm2 start ecosystem.config.js --only gamilit-backend --env production ``` ### Puerto ocupado ```bash # Ver qué proceso está usando el puerto sudo lsof -i :3006 # Backend sudo lsof -i :3005 # Frontend # Detener el proceso conflictivo pm2 delete # o kill -9 ``` --- ## 🔐 Seguridad ### Variables Sensibles **NUNCA** commitear archivos `.env.production` al repositorio. Estos archivos contienen: - Contraseñas de base de datos - Secrets de JWT - API keys ### Secrets de Producción Los secrets deben ser únicos para producción. Para generar nuevos secrets: ```bash # Generar JWT secret openssl rand -base64 32 # Resultado ejemplo: # PROD_IksGn8fpggQ2MlhAG3/dlzpIOrx+cNyAgEBmYF3nIYs= ``` ### Permisos de Archivos ```bash # Los archivos .env deben tener permisos restrictivos chmod 600 apps/backend/.env.production chmod 600 apps/frontend/.env.production ``` --- ## 📝 Checklist de Despliegue Antes de cada despliegue a producción: - [ ] Código mergeado a rama `main` - [ ] Tests pasando (`npm test`) - [ ] Variables de entorno de producción actualizadas - [ ] Secrets de producción configurados - [ ] Pre-deploy check ejecutado sin errores - [ ] Build exitoso - [ ] Base de datos migrada (si hay cambios en esquema) - [ ] CORS configurado correctamente - [ ] Logs monitoreados después del despliegue - [ ] Health check respondiendo correctamente - [ ] Frontend cargando correctamente - [ ] Backend API respondiendo --- ## 🆘 Soporte Para problemas o preguntas sobre el despliegue: 1. Revisar logs: `pm2 logs` 2. Verificar estado: `pm2 status` 3. Consultar esta guía 4. Revisar documentación de PM2: https://pm2.keymetrics.io/ --- ## 📚 Referencias - [PM2 Documentation](https://pm2.keymetrics.io/docs/usage/quick-start/) - [NestJS Deployment](https://docs.nestjs.com/fundamentals/deployment) - [Vite Production Build](https://vitejs.dev/guide/build.html) - [PostgreSQL Documentation](https://www.postgresql.org/docs/) --- **Última actualización**: 2025-11-09 **Versión**: 1.0.0 **Servidor**: 74.208.126.102 **Responsable**: DevOps Team