# Guía: Ejecutar la aplicación con PM2 en producción ## 📋 Requisitos previos 1. **Node.js instalado** (versión 18 o superior) 2. **Nginx configurado** (ver `OPTIMIZACION_NGINX.md`) 3. **Dependencias instaladas**: `npm install` ## 🚀 Instalación de PM2 ```bash # Instalar PM2 globalmente sudo npm install -g pm2 ``` ## ⚙️ Configuración inicial ### 1. Actualizar package.json (opcional) Ya tienes `src/index-optimized.js` listo. Puedes agregar un script de producción: ```json "scripts": { "start": "node src/index.js", "start:prod": "node src/index-optimized.js", "dev": "node src/index.js" } ``` ### 2. Verificar que la aplicación funciona ```bash # Probar manualmente primero node src/index-optimized.js # Deberías ver: "🚀 Servidor API corriendo en http://localhost:3000/" # Presiona Ctrl+C para detener ``` ## 🎯 Iniciar con PM2 ### Opción 1: Comando directo (rápido) ```bash # Desde el directorio del proyecto cd /var/www/parking # o tu ruta pm2 start src/index-optimized.js --name parking-api ``` ### Opción 2: Con archivo de configuración (recomendado) Crea un archivo `ecosystem.config.cjs` en la raíz del proyecto (usa `.cjs` porque el proyecto tiene `"type": "module"` en package.json): ```javascript module.exports = { apps: [{ name: 'parking-api', script: 'src/index-optimized.js', instances: 1, exec_mode: 'fork', env: { NODE_ENV: 'production', PORT: 3000 }, error_file: './logs/pm2-error.log', out_file: './logs/pm2-out.log', log_date_format: 'YYYY-MM-DD HH:mm:ss Z', merge_logs: true, autorestart: true, watch: false, max_memory_restart: '500M' }] } ``` Luego inicia con: ```bash pm2 start ecosystem.config.cjs ``` **Nota:** Si tu proyecto tiene `"type": "module"` en `package.json`, debes usar la extensión `.cjs` para el archivo de configuración de PM2, ya que PM2 requiere CommonJS. ## 📊 Comandos útiles de PM2 ```bash # Ver estado de las aplicaciones pm2 status # Ver logs en tiempo real pm2 logs parking-api # Ver logs de los últimos 100 líneas pm2 logs parking-api --lines 100 # Reiniciar la aplicación pm2 restart parking-api # Detener la aplicación pm2 stop parking-api # Eliminar la aplicación de PM2 pm2 delete parking-api # Ver información detallada pm2 show parking-api # Monitoreo en tiempo real pm2 monit ``` ## 🔄 Configurar inicio automático Para que PM2 inicie automáticamente al reiniciar el servidor: ```bash # Generar script de inicio pm2 startup # Esto mostrará un comando como: # sudo env PATH=$PATH:/usr/bin pm2 startup systemd -u tu_usuario --hp /home/tu_usuario # Ejecuta el comando que te muestre (copia y pega) # Guardar la configuración actual pm2 save ``` Ahora, cada vez que reinicies el servidor, PM2 iniciará automáticamente tu aplicación. ## 🔍 Verificación ### 1. Verificar que PM2 está corriendo la app ```bash pm2 status # Deberías ver "parking-api" con status "online" ``` ### 2. Verificar que Node.js responde ```bash curl http://localhost:3000/api/health # Debe responder: {"ok":true} ``` ### 3. Verificar que Nginx hace proxy correctamente ```bash curl http://localhost/api/health # Debe responder: {"ok":true} ``` ### 4. Verificar logs ```bash pm2 logs parking-api --lines 50 ``` ## 🛠️ Solución de problemas ### La aplicación no inicia ```bash # Ver logs de error pm2 logs parking-api --err # Verificar que el puerto 3000 no está ocupado sudo netstat -tulpn | grep 3000 # Verificar permisos de archivos ls -la data/ ``` ### La aplicación se reinicia constantemente ```bash # Ver logs para identificar el error pm2 logs parking-api # Verificar uso de memoria pm2 monit ``` ### Cambiar el puerto Si necesitas usar otro puerto (ej: 3001): ```bash # Opción 1: Variable de entorno PORT=3001 pm2 start src/index-optimized.js --name parking-api # Opción 2: En ecosystem.config.js env: { PORT: 3001 } ``` **No olvides actualizar la configuración de Nginx** para apuntar al nuevo puerto: ```nginx location /api/ { proxy_pass http://localhost:3001; # Cambiar aquí # ... } ``` ## 📈 Monitoreo y rendimiento ```bash # Ver estadísticas en tiempo real pm2 monit # Ver métricas pm2 describe parking-api # Reiniciar con cero downtime (si tienes múltiples instancias) pm2 reload parking-api ``` ## 🔐 Seguridad adicional ### Ejecutar como usuario no-root ```bash # Crear usuario para la aplicación sudo useradd -m -s /bin/bash parking # Cambiar propietario de los archivos sudo chown -R parking:parking /var/www/parking # Iniciar PM2 como ese usuario sudo -u parking pm2 start src/index-optimized.js --name parking-api ``` ## 📝 Resumen de comandos esenciales ```bash # Iniciar pm2 start src/index-optimized.js --name parking-api # Ver estado pm2 status # Ver logs pm2 logs parking-api # Reiniciar pm2 restart parking-api # Configurar inicio automático pm2 startup pm2 save ``` ## ✅ Checklist de producción - [ ] PM2 instalado globalmente - [ ] Aplicación iniciada con PM2 - [ ] Logs verificados (sin errores) - [ ] API responde en `/api/health` - [ ] Nginx configurado y funcionando - [ ] Inicio automático configurado (`pm2 startup` + `pm2 save`) - [ ] Permisos de archivos correctos - [ ] Puerto 3000 accesible - [ ] Firewall configurado (si aplica)