# Despliegue en Windows con PM2

> Para el procedimiento automatizado, health checks, rotación y futura migración Docker, consulta [Operación segura y migración Docker](operacion-segura-y-migracion.md).

PM2 es el gestor de procesos que mantiene el servidor ejecutándose en segundo plano, lo reinicia si falla, y lo arranca automáticamente con Windows.

---

## Instalación de PM2

```powershell
npm install -g pm2
npm install -g pm2-windows-startup
```

---

## Fichero `ecosystem.config.js`

El proyecto incluye este fichero de configuración:

```javascript
module.exports = {
  apps: [{
    name: "lliria-properties",
    script: "dist/app.js",
    instances: 1,
    exec_mode: "cluster",
    watch: false,
    max_memory_restart: "500M",
    env: {
      NODE_ENV: "production",
      PORT: 3000
    },
    log_date_format: "YYYY-MM-DD HH:mm:ss",
    out_file: "./logs/pm2-out.log",
    error_file: "./logs/pm2-err.log",
    merge_logs: true,
  }]
};
```

---

## Arrancar el servidor

```powershell
cd C:\xampp\htdocs\captajaus\lliria-properties-scraper

# Primera vez o tras cambios de código:
npx tsc
pm2 start ecosystem.config.js

# Subsiguientes reinicios (sin recompilar):
pm2 restart lliria-properties
```

### Despliegue verificado recomendado

```powershell
# Validación sin tocar proceso ni base de datos
npm run deploy:local -- -ValidateOnly -SkipMigrations

# Despliegue completo con migraciones, rollback y health check
npm run deploy:local
```

Comprobación directa:

```powershell
Invoke-RestMethod http://127.0.0.1:3000/health
```

## Rotación de logs

```powershell
npm run logs:configure
pm2 conf pm2-logrotate
```

La configuración del proyecto rota a diario o al superar 20 MB, conserva 14 archivos y comprime los históricos.

---

## Arranque automático con Windows

```powershell
pm2-windows-startup install
pm2 save --force
```

Esto añade una tarea en el Registro de Windows que ejecuta PM2 al iniciar sesión, que a su vez restaura todos los procesos guardados.

---

## Comandos de Gestión

```powershell
# Estado de los procesos
pm2 status
pm2 list

# Logs
pm2 logs lliria-properties           # en tiempo real
pm2 logs lliria-properties --lines 100  # últimas 100 líneas
pm2 flush                             # limpiar logs guardados

# Control
pm2 start lliria-properties
pm2 stop lliria-properties
pm2 restart lliria-properties
pm2 reload lliria-properties          # recarga sin downtime (cluster mode)
pm2 delete lliria-properties          # eliminar de PM2

# Guardar estado
pm2 save --force                      # guardar lista de procesos para autorestart

# Monitorización interactiva
pm2 monit
```

---

## Archivos de Log

Los logs se guardan en `logs/`:
- `logs/pm2-out.log` — salida estándar (console.log)
- `logs/pm2-err.log` — errores (console.error, excepciones)

Para ver logs en tiempo real con pm2:
```powershell
pm2 logs lliria-properties --timestamp
```

---

## Actualización del Código

Flujo estándar de actualización:

```powershell
cd C:\xampp\htdocs\captajaus\lliria-properties-scraper

# 1. Compilar los cambios TypeScript
npx tsc

# 2. Reiniciar PM2 con el nuevo dist/
pm2 restart lliria-properties

# 3. Guardar estado (por si se reinicia Windows)
pm2 save --force

# 4. Verificar que está online
pm2 status
```

---

## Variables de Entorno

Las variables de entorno se leen del fichero `.env` en la raíz. Si el fichero no existe, se usan los valores por defecto:

| Variable         | Por defecto         | Descripción      |
| ---------------- | ------------------- | ---------------- |
| `DB_HOST`        | `localhost`         | Host MySQL       |
| `DB_PORT`        | `3306`              | Puerto MySQL     |
| `DB_USER`        | `root`              | Usuario MySQL    |
| `DB_PASSWORD`    | ``                  | Contraseña MySQL |
| `DB_NAME`        | `lliria_properties` | Nombre de la BD  |
| `SESSION_SECRET` | aleatorio           | Clave de sesión  |
| `PORT`           | `3000`              | Puerto HTTP      |

Para actualizar variables de entorno sin recompilar:
```powershell
pm2 restart lliria-properties --update-env
```

---

## Solución de Problemas

### PM2 no arranca al iniciar Windows
```powershell
pm2-windows-startup install
pm2 save --force
```
Asegúrate de que XAMPP también arranca automáticamente (panel XAMPP → Config → Autostart).

### El proceso se reinicia en bucle (↺ alto)
```powershell
pm2 logs lliria-properties --lines 50
```
Busca el error en los últimos logs. Los motivos más comunes son:
- MySQL no está corriendo
- Puerto 3000 en uso
- Error en `dist/app.js` (¿has compilado con `npx tsc`?)

### Cambiar el puerto
Edita `.env`:
```env
PORT=3001
```
Luego:
```powershell
pm2 restart lliria-properties --update-env
```
