# Guía de Despliegue - Lliria Properties

## Opciones de despliegue

---

## 🖥 OPCIÓN 1: VPS Ubuntu/Debian con PM2 + Nginx (RECOMENDADO)

### 1. Requisitos en el servidor

```bash
# Node.js 20+
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt-get install -y nodejs

# MySQL 8
sudo apt install mysql-server -y
sudo mysql_secure_installation

# PM2 (gestor de procesos)
sudo npm install -g pm2

# Nginx
sudo apt install nginx -y
```

### 2. Subir el proyecto

```bash
# Opción A: Git
git clone https://github.com/tu-usuario/lliria-properties-scraper.git /var/www/lliria
cd /var/www/lliria

# Opción B: SCP desde tu PC local
# Desde Windows: scp -r lliria-properties-scraper usuario@IP_SERVIDOR:/var/www/lliria
```

### 3. Configurar variables de entorno

```bash
cd /var/www/lliria
cp .env.example .env
nano .env   # Editar con los datos reales del servidor
```

**Variables importantes para producción:**
```env
NODE_ENV=production
PORT=3000
DB_HOST=localhost
DB_PORT=3306
DB_USER=lliria_user
DB_PASSWORD=TU_PASSWORD_SEGURA
DB_NAME=lliria_properties
SESSION_SECRET=CADENA_ALEATORIA_LARGA_32CHARS
EMAIL_HOST=smtp.gmail.com
EMAIL_PORT=587
EMAIL_SECURE=false
EMAIL_USER=tu@gmail.com
EMAIL_PASS=app_password_gmail
EMAIL_FROM=Lliria Properties <tu@gmail.com>
EMAIL_TO=tu@gmail.com
SCRAPING_DAILY_TIME=01:00
SCRAPING_TIMEZONE=Europe/Madrid
SCRAPING_OPERATIONS=rent,sale
SCRAPER_MAX_ZONES_PER_PORTAL=12
SCRAPER_CHALLENGE_COOLDOWN_MINUTES=360
```

### 4. Crear base de datos MySQL

```bash
sudo mysql -u root -p
```
```sql
CREATE USER 'lliria_user'@'localhost' IDENTIFIED BY 'TU_PASSWORD_SEGURA';
CREATE DATABASE lliria_properties CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
GRANT ALL PRIVILEGES ON lliria_properties.* TO 'lliria_user'@'localhost';
FLUSH PRIVILEGES;
EXIT;
```

### 5. Instalar dependencias e inicializar BD

```bash
cd /var/www/lliria
npm install
npx ts-node src/config/initDb.ts
```

### 6. Arrancar con PM2

```bash
pm2 start ecosystem.config.js --env production
pm2 save
pm2 startup   # Copiar y ejecutar el comando que devuelve
```

**Comandos PM2 útiles:**
```bash
pm2 status          # Ver estado
pm2 logs lliria-properties  # Ver logs en tiempo real
pm2 restart lliria-properties
pm2 stop lliria-properties
```

### 7. Configurar Nginx

```bash
# Copiar la config (editar con tu dominio)
sudo cp /var/www/lliria/nginx.conf /etc/nginx/sites-available/lliria
sudo nano /etc/nginx/sites-available/lliria  # Cambiar 'tu-dominio.com'
sudo ln -s /etc/nginx/sites-available/lliria /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
```

### 8. SSL gratuito con Let's Encrypt

```bash
sudo apt install certbot python3-certbot-nginx -y
sudo certbot --nginx -d tu-dominio.com -d www.tu-dominio.com
```

---

## ☁️ OPCIÓN 2: Railway (más sencillo, gratis hasta cierto límite)

1. Crear cuenta en [railway.app](https://railway.app)
2. Crear nuevo proyecto → "Deploy from GitHub repo"
3. Seleccionar el repositorio
4. Añadir servicio MySQL desde el marketplace de Railway
5. Configurar variables de entorno (Settings → Variables)
6. En Settings → Networking → Generate Domain

---

## ☁️ OPCIÓN 3: Render.com (alternativa gratuita)

1. Crear cuenta en [render.com](https://render.com)
2. New → Web Service → conectar GitHub
3. **Build Command:** `npm install`
4. **Start Command:** `npx ts-node --transpile-only src/app.ts`
5. Añadir base de datos MySQL externa (por ejemplo, [PlanetScale](https://planetscale.com) o [FreeSQLDatabase](https://www.freesqldatabase.com))
6. Configurar Environment Variables

---

## 🏠 OPCIÓN 4: Mismo servidor que XAMPP (Acceso local/red)

Si quieres ejecutarlo en el mismo PC con XAMPP ya configurado:

### Opción 4A: Directo en Windows con PM2

```powershell
# Instalar PM2 globalmente
npm install -g pm2

# Iniciar la app
cd C:\xampp\htdocs\captajaus\lliria-properties-scraper
pm2 start ecosystem.config.js
pm2 save
```

Para acceso desde fuera de la red local, necesitas:
- Router: abrir puerto 3000 (o 80 con proxy)
- DNS dinámico: No-IP, DuckDNS o similar

### Opción 4B: Apache como proxy inverso

Añadir a `C:\xampp\apache\conf\extra\httpd-vhosts.conf`:

```apache
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so

<VirtualHost *:80>
    ServerName lliria.tu-dominio.com
    ProxyPreserveHost On
    ProxyPass / http://localhost:3000/
    ProxyPassReverse / http://localhost:3000/
</VirtualHost>
```

---

## 🔒 Seguridad en producción

### Cambiar credenciales por defecto

En `src/controllers/authController.ts`, las credenciales estáticas son `George/4213`.
Para producción, crear un usuario real en la tabla `users`:

```bash
# Generar hash bcrypt de la nueva contraseña
node -e "const b=require('bcryptjs');b.hash('TU_NUEVA_PASSWORD',10).then(h=>console.log(h))"
```

```sql
INSERT INTO users (username, password, email)
VALUES ('George', '$2b$10$HASH_GENERADO_AQUI', 'tu@email.com');
```

### Variables de sesión

Cambiar `SESSION_SECRET` por una cadena aleatoria larga:
```bash
node -e "console.log(require('crypto').randomBytes(32).toString('hex'))"
```

---

## 📧 Configurar Gmail para alertas de email

1. Gmail → Cuenta → Seguridad → Verificación en dos pasos (activar)
2. Gmail → Cuenta → Seguridad → Contraseñas de aplicaciones
3. Generar contraseña para "Otra aplicación" → copiar en `EMAIL_PASS`

```env
EMAIL_HOST=smtp.gmail.com
EMAIL_PORT=587
EMAIL_SECURE=false
EMAIL_USER=tu.correo@gmail.com
EMAIL_PASS=xxxx xxxx xxxx xxxx   # 16 caracteres sin espacios
```

---

## 📋 Checklist final de despliegue

- [ ] Variables de entorno configuradas (`.env`)
- [ ] `NODE_ENV=production` establecido
- [ ] BD inicializada (`npx ts-node src/config/initDb.ts`)
- [ ] Contraseña de George cambiada
- [ ] SESSION_SECRET cambiado
- [ ] PM2 arrancado y configurado para inicio automático
- [ ] Nginx configurado y funcionando
- [ ] SSL activado (Let's Encrypt)
- [ ] Email configurado y probado
- [ ] Firewall: solo puertos 80, 443, 22 abiertos

---

## 🐛 Solución de problemas

| Problema                  | Solución                                                                                   |
| ------------------------- | ------------------------------------------------------------------------------------------ |
| `Cannot connect to MySQL` | Verificar DB_HOST, DB_USER, DB_PASSWORD en .env                                            |
| `EADDRINUSE port 3000`    | `pm2 stop all` o cambiar PORT en .env                                                      |
| `Cannot find module`      | `npm install` en el directorio del proyecto                                                |
| Email no llega            | Verificar contraseña de aplicación Gmail, revisar carpeta spam                             |
| Scraping lento            | Normal: el ciclo diario procesa portales y operaciones de forma secuencial; reduzca `SCRAPER_MAX_ZONES_PER_PORTAL` si fuera necesario |
| 403/429/CAPTCHA           | El portal entra en cuarentena temporal. No reduzca el cooldown ni reinicie en bucle; espere y revise los logs |
