- Configure workspace Git repository with comprehensive .gitignore - Add Odoo as submodule for ERP reference code - Include documentation: SETUP.md, GIT-STRUCTURE.md - Add gitignore templates for projects (backend, frontend, database) - Structure supports independent repos per project/subproject level Workspace includes: - core/ - Reusable patterns, modules, orchestration system - projects/ - Active projects (erp-suite, gamilit, trading-platform, etc.) - knowledge-base/ - Reference code and patterns (includes Odoo submodule) - devtools/ - Development tools and templates - customers/ - Client implementations template 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
11 KiB
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:
# 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:
./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:
./scripts/build-production.sh
Este script:
- Instala las dependencias del proyecto
- Compila el backend (TypeScript → JavaScript)
- Compila el frontend (React + Vite → archivos estáticos optimizados)
- Muestra el tamaño de los builds
- Verifica que los builds fueron exitosos
Resultado esperado:
apps/backend/dist/main.js- Backend compiladoapps/frontend/dist/- Frontend compilado (archivos estáticos)
4. Despliegue con PM2
Una vez que los builds estén listos, despliega la aplicación:
./scripts/deploy-production.sh
Este script:
- Verifica que PM2 esté instalado
- Verifica que los builds existan
- Verifica archivos
.env.production - Crea el directorio de logs si no existe
- Detiene procesos PM2 anteriores (si existen)
- Inicia el backend (2 instancias en cluster)
- Inicia el frontend (1 instancia)
- Guarda la configuración de PM2
- 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:
{
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:
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:
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
# 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
# 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
# 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
# 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
# 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
# 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
# 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)
# 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
# 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
# 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
# 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
# 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
# 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
# Ver qué proceso está usando el puerto
sudo lsof -i :3006 # Backend
sudo lsof -i :3005 # Frontend
# Detener el proceso conflictivo
pm2 delete <nombre-proceso>
# o
kill -9 <PID>
🔐 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:
# Generar JWT secret
openssl rand -base64 32
# Resultado ejemplo:
# PROD_IksGn8fpggQ2MlhAG3/dlzpIOrx+cNyAgEBmYF3nIYs=
Permisos de Archivos
# 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:
- Revisar logs:
pm2 logs - Verificar estado:
pm2 status - Consultar esta guía
- Revisar documentación de PM2: https://pm2.keymetrics.io/
📚 Referencias
Última actualización: 2025-11-09 Versión: 1.0.0 Servidor: 74.208.126.102 Responsable: DevOps Team