# 🚀 Cómo subir Peninsula Fitness al VPS (paso a paso)

Este ZIP contiene **todo el código fuente + configuraciones** para poner el sitio
y el CRM **online con HTTPS** en un **VPS de Hostinger** (Ubuntu).

> ⚠️ **Importante:** esta app NO funciona en el **Web Hosting / Cloud compartido**
> de Hostinger (no corre Node ni base de datos). Necesitas un **VPS KVM**.
> Lo que NO viene en el ZIP (a propósito): `node_modules`, `dist`, la base de
> datos `.data/` y los secretos `.env*`. Eso se genera/crea en el servidor.

---

## Resumen en 7 pasos

1. **Crea el VPS** en Hostinger (Ubuntu) y apunta tu dominio. → `deploy/HOSTINGER-VPS.md`
2. **Sube este ZIP** al VPS y descomprímelo en `/var/www/peninsula`.
3. **Prepara el servidor** (Node, Nginx, PM2, firewall…): `sudo bash deploy/scripts/server-setup.sh`
4. **Crea los secretos**: copia `deploy/env.production.example` a `.env.production` y rellénalo.
5. **Instala y compila**: `npm ci && npm run build`
6. **Arranca la app**: `pm2 start deploy/pm2/ecosystem.config.cjs && pm2 save`
7. **Nginx + HTTPS**: instala el sitio y `sudo certbot --nginx -d TU_DOMINIO`

El detalle completo de cada paso está en **`deploy/DEPLOY.md`**.

---

## Paso 1 — VPS y dominio (Hostinger)

Sigue **`deploy/HOSTINGER-VPS.md`**: activa un **VPS KVM con Ubuntu 24.04**, obtén
la **IP**, configura el **acceso SSH** y apunta los registros **A** (`@` y `www`)
de tu dominio a esa IP.

## Paso 2 — Subir y descomprimir el ZIP

Desde tu computadora (reemplaza `IP_DEL_VPS`):

```bash
# Sube el ZIP al servidor
scp "peninsula-fitness-deploy.zip" deploy@IP_DEL_VPS:/tmp/

# Entra al servidor y descomprime en la carpeta de la app
ssh deploy@IP_DEL_VPS
sudo mkdir -p /var/www/peninsula
sudo chown -R $USER:www-data /var/www/peninsula
cd /var/www/peninsula
unzip -o /tmp/peninsula-fitness-deploy.zip -d /var/www/peninsula
```

> Si `unzip` no está: `sudo apt-get update && sudo apt-get install -y unzip`.
> Alternativa sin SSH: usa el **Browser terminal** del panel de Hostinger y sube
> el ZIP con `wget`/`scp`, o clónalo por `git` si tienes repositorio.

## Paso 3 — Preparar el servidor (una sola vez)

```bash
cd /var/www/peninsula
sudo bash deploy/scripts/server-setup.sh
```

Instala Node 20, Nginx, PM2, Certbot, UFW (22/80/443) y Fail2ban, y crea el
usuario y las carpetas de datos. **Lee el aviso final** sobre asegurar el SSH.

## Paso 4 — Secretos (`.env.production`)

```bash
cd /var/www/peninsula
cp deploy/env.production.example .env.production
nano .env.production          # pon ADMIN_PASSWORD fuerte y tu dominio
chmod 600 .env.production
```

Genera una contraseña fuerte: `openssl rand -base64 24`.

## Paso 5 — Instalar dependencias y compilar

```bash
cd /var/www/peninsula
npm ci          # compila better-sqlite3 para el servidor
npm run build
```

## Paso 6 — Arrancar la app con PM2

```bash
pm2 start deploy/pm2/ecosystem.config.cjs
pm2 save
pm2 status                     # debe verse "peninsula" en estado "online"
curl -sI http://127.0.0.1:4321 | head -1   # → HTTP/1.1 200 OK
```

## Paso 7 — Nginx + HTTPS

```bash
sudo cp deploy/nginx/peninsulafitness.conf /etc/nginx/sites-available/peninsulafitness
sudo ln -s /etc/nginx/sites-available/peninsulafitness /etc/nginx/sites-enabled/
sudo rm -f /etc/nginx/sites-enabled/default
sudo nginx -t && sudo systemctl reload nginx

# Certificado TLS automático (cambia el dominio):
sudo certbot --nginx -d peninsulafitness.com.mx -d www.peninsulafitness.com.mx
```

¡Listo! Abre `https://TU_DOMINIO` y entra al CRM en `https://TU_DOMINIO/crm/login`
con el `ADMIN_EMAIL` / `ADMIN_PASSWORD` que pusiste en `.env.production`.

---

## Backups (recomendado)

```bash
crontab -e
# añade (respaldo diario 3:15 AM de BD + imágenes):
15 3 * * * /var/www/peninsula/deploy/scripts/backup.sh >> /var/log/peninsula/backup.log 2>&1
```

## Actualizaciones futuras

Para volver a desplegar cambios sin downtime, lo más cómodo es desde tu máquina:

```bash
SERVER=deploy@IP_DEL_VPS ./deploy/scripts/deploy.sh
```

(O vuelve a subir un ZIP nuevo, descomprime sobre `/var/www/peninsula`, y corre
`npm ci && npm run build && pm2 reload peninsula`.)

---

## Verificación rápida (smoke test)

```bash
curl -sI https://TU_DOMINIO | head -1                       # 200 + HTTPS
curl -sI https://TU_DOMINIO/crm | grep -i location          # redirige a /crm/login
curl -s  https://TU_DOMINIO/sitemap.xml | head -3           # sitemap OK
```

## ¿Problemas?

Revisa la tabla de **problemas comunes** al final de **`deploy/DEPLOY.md`**
(502, errores de better-sqlite3, certbot, etc.).

---

### Mapa de archivos clave del ZIP
- `INSTRUCCIONES-DESPLIEGUE.md` ← este archivo (empieza aquí)
- `deploy/HOSTINGER-VPS.md` ← pasos propios de Hostinger
- `deploy/DEPLOY.md` ← guía detallada
- `deploy/env.production.example` ← plantilla de secretos
- `deploy/nginx/…` · `deploy/pm2/…` · `deploy/scripts/…` ← configs y scripts
- `src/`, `public/`, `package.json`, `package-lock.json`, `astro.config.mjs` ← la app
