- 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>
489 lines
11 KiB
Markdown
489 lines
11 KiB
Markdown
# 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 <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:
|
|
|
|
```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
|