# 🚀 Guía de Despliegue

## Índice
1. [Requisitos del Servidor](#requisitos-del-servidor)
2. [Despliegue de Base de Datos](#despliegue-de-base-de-datos)
3. [Despliegue del Backend](#despliegue-del-backend)
4. [Despliegue del Frontend](#despliegue-del-frontend)
5. [Configuración de Proxy Inverso (Nginx)](#configuración-de-proxy-inverso-nginx)
6. [Configuración de PM2](#configuración-de-pm2)
7. [SSL con Certbot](#ssl-con-certbot)
8. [Verificación Post-Despliegue](#verificación-post-despliegue)
9. [Rollback](#rollback)

---

## Requisitos del Servidor

- Ubuntu 22.04 LTS (recomendado)
- 2GB RAM mínimo
- Node.js 18+
- PostgreSQL 13+
- Nginx
- PM2 (opcional pero recomendado)
- Git

---

## Despliegue de Base de Datos

### 1. Instalar PostgreSQL

```bash
sudo apt update
sudo apt install postgresql postgresql-contrib
sudo systemctl enable postgresql
```

### 2. Crear Base de Datos y Usuario

```bash
sudo -u postgres psql
```

```sql
CREATE DATABASE hotel_hacienda;
CREATE USER hoteluser WITH ENCRYPTED PASSWORD 'password_seguro';
GRANT ALL PRIVILEGES ON DATABASE hotel_hacienda TO hoteluser;
\q
```

### 3. Restaurar Backup

```bash
scp backupcondatos22122025.sql usuario@servidor:/tmp/
ssh usuario@servidor
sudo -u postgres psql -d hotel_hacienda -f /tmp/backupcondatos22122025.sql
```

### 4. Verificar Funciones

```bash
sudo -u postgres psql -d hotel_hacienda -c "\df"
```

---

## Despliegue del Backend

### 1. Clonar Repositorio

```bash
cd /var/www
git clone https://git.consultoria-as.com/consultoria-as/hotel-hacienda.git
cd hotel-hacienda/backend/hotel_hacienda
```

### 2. Instalar Dependencias

```bash
npm install --production
```

### 3. Configurar Variables de Entorno

```bash
cp .env.example .env
nano .env
```

```env
PORT=3000
URL_CORS=https://hotel.consultoria-as.com

DB_HOST=localhost
DB_PORT=5432
DB_USER=hoteluser
DB_PASSWORD=password_seguro
DB_NAME=hotel_hacienda

EMAIL_HOST=smtp.gmail.com
EMAIL_PORT=587
EMAIL_USER=soporte@horuxfin.com
EMAIL_PASS=app_password

STRIPE_SECRET_KEY=sk_live_...

FACTURAS_API_URL=https://api.facturas.com/v1/
FACTURAS_ISSUER_RFC=RFC_DEL_HOTEL
FACTURAS_TYPE=I
FACTURAS_API_TOKEN=token_aqui

BANXICO_TOKEN=token_banxico
```

### 4. Iniciar con PM2

```bash
npm install -g pm2
pm2 start src/server.js --name hotel-api
pm2 save
pm2 startup
```

---

## Despliegue del Frontend

### 1. Compilar para Producción

```bash
cd /var/www/hotel-hacienda/frontend/Frontend-Hotel
npm install
```

### 2. Configurar Environment de Producción

```bash
echo "VITE_API_BASE_URL=https://hotel.consultoria-as.com/api" > .env
```

### 3. Build

```bash
npm run build
```

Esto genera la carpeta `dist/` con los archivos estáticos.

---

## Configuración de Proxy Inverso (Nginx)

### 1. Instalar Nginx

```bash
sudo apt install nginx
```

### 2. Configuración del Sitio

```bash
sudo nano /etc/nginx/sites-available/hotel-hacienda
```

```nginx
server {
    listen 80;
    server_name hotel.consultoria-as.com;

    # Frontend estático
    location / {
        root /var/www/hotel-hacienda/frontend/Frontend-Hotel/dist;
        index index.html;
        try_files $uri $uri/ /index.html;
    }

    # Backend API
    location /api/ {
        proxy_pass http://localhost:3000/api/;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_cache_bypass $http_upgrade;
    }

    # Logs
    access_log /var/log/nginx/hotel-access.log;
    error_log /var/log/nginx/hotel-error.log;
}
```

### 3. Activar Sitio

```bash
sudo ln -s /etc/nginx/sites-available/hotel-hacienda /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginx
```

---

## SSL con Certbot

```bash
sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d hotel.consultoria-as.com
sudo systemctl enable certbot.timer
```

---

## Verificación Post-Despliegue

### Checklist

- [ ] Backend responde: `curl https://hotel.consultoria-as.com/api/employees`
- [ ] Frontend carga sin errores en navegador
- [ ] Login funciona correctamente
- [ ] Base de datos tiene datos correctos
- [ ] Emails se envían (probar recuperación de contraseña)
- [ ] CORS permite el dominio correcto
- [ ] PM2 muestra el proceso activo: `pm2 list`
- [ ] Nginx no muestra errores: `sudo tail -f /var/log/nginx/hotel-error.log`

---

## Rollback

### Backend

```bash
pm2 stop hotel-api
# Restaurar código anterior con git
git checkout <commit-anterior>
npm install
pm2 restart hotel-api
```

### Base de Datos

```bash
# Restaurar backup previo
sudo -u postgres pg_dump hotel_hacienda > backup_antes_del_cambio.sql
sudo -u postgres psql -d hotel_hacienda -f backup_seguro.sql
```

### Frontend

```bash
# Recompilar versión anterior
git checkout <commit-anterior>
cd frontend/Frontend-Hotel
npm run build
```

---

> **Nota:** Mantener siempre un backup reciente de la base de datos antes de cualquier despliegue que modifique funciones SQL.
