# Seguridad del despliegue en VPS + cPanel

## 1. Lo más importante: separar Application Root de Document Root

En cPanel: **Setup Node.js App** → al crearla, te pide dos rutas distintas:

- **Application Root**: ej. `barberia-app` (fuera de `public_html`). Acá va
  TODO el código: `.env`, `db.js`, `schema.sql`, `routes/`, `services/`,
  `node_modules/`, todo.
- **Application URL / Document Root**: el subdominio o carpeta pública
  (ej. `public_html/api` o un subdominio `api.tudominio.cl`). Apache
  reenvía automáticamente el tráfico de esa URL hacia tu proceso Node —
  pero **nunca sirve directamente los archivos del Application Root.**

**Nunca subas el código directo a `public_html`.** Si tu proyecto ya
está en `public_html`, muévelo fuera (a `~/barberia-app`, por ejemplo)
y vuelve a apuntar la app de Node ahí.

## 2. `.htaccess` como segunda barrera

Ya viene incluido en este proyecto (`.htaccess`, en la raíz). Bloquea:
- Cualquier archivo que empiece con punto (`.env`, `.git`, etc.)
- Extensiones sensibles (`.sql`, `.log`, `.json`, `.md`, `.yml`)
- Listado de carpetas si no hay `index`
- Carpetas específicas del proyecto por nombre

Esto es **redundancia**, no la solución principal — solo importa si por
algún motivo un archivo termina donde Apache sí lo sirve.

## 3. Permisos del archivo `.env`

Por SSH, en la carpeta del Application Root:

```bash
chmod 600 .env
```

Esto hace que solo tu propio usuario de cPanel pueda leerlo — ni otros
usuarios del mismo servidor (si es hosting compartido dentro del VPS)
podrían abrirlo.

## 4. MySQL

- **Nunca lo dejes escuchando en todas las interfaces.** En cPanel,
  confirma que el acceso remoto a MySQL esté deshabilitado salvo que lo
  necesites explícitamente (WHM → MySQL/MariaDB → Remote MySQL — debe
  estar vacío, sin IPs autorizadas, a menos que tengas un motivo real).
- El usuario de la base (`testuser` en nuestros ejemplos, cámbialo por
  algo real) debe tener permisos **solo** sobre la base de este
  proyecto, nunca `GRANT ALL ON *.*`.
- Contraseña larga y única para ese usuario — no la reuses de otro
  sistema tuyo.

## 5. Firewall del VPS

La mayoría de los VPS con cPanel traen **CSF (ConfigServer Security &
Firewall)**. Verificar en WHM → ConfigServer Security & Firewall que:

- Puerto **3306** (MySQL) esté **cerrado** al exterior — solo debe ser
  accesible desde `localhost`, nunca desde internet.
- El puerto interno donde corre tu app de Node (el que cPanel asigna,
  normalmente algo como 3000-3999) **no** necesita estar abierto al
  exterior tampoco — Apache/Passenger habla con él internamente.
- Solo deberían estar abiertos: 80/443 (web), 22 (SSH — idealmente con
  login por llave, no por contraseña), y los puertos propios de cPanel
  (2082/2083/2086/2087/2095/2096).

## 6. Variables de entorno en producción

En el `.env` real del servidor (nunca el mismo que usas en pruebas):

```
NODE_ENV=production
JWT_SECRET=<genera uno nuevo, largo y aleatorio — no reuses el de pruebas>
CRON_SECRET=<otro distinto>
WHATSAPP_WEB_SERVICE_SECRET=<otro distinto>
```

Genera secretos largos así (por SSH):
```bash
node -e "console.log(require('crypto').randomBytes(32).toString('hex'))"
```

## 7. Verificar desde AFUERA, una vez desplegado

Estos comandos los corres tú mismo, desde tu computador (no desde el
servidor), reemplazando `tudominio.cl` por tu dominio real. Cada uno
**debe devolver 403 o 404** — si alguno devuelve 200 con contenido
real, ese archivo quedó expuesto y hay que corregirlo antes de seguir:

```bash
curl -I https://tudominio.cl/.env
curl -I https://tudominio.cl/schema.sql
curl -I https://tudominio.cl/server.js
curl -I https://tudominio.cl/db.js
curl -I https://tudominio.cl/.git/config
curl -I https://tudominio.cl/package.json
curl -I https://tudominio.cl/node_modules/
```

Si tienes acceso a otra herramienta de escaneo (como el propio WHM, o
`nmap` desde otra máquina) para confirmar que el puerto 3306 no
responde desde afuera, mejor — pero los `curl` de arriba ya cubren el
riesgo específico que describiste (alguien adivinando nombres de
archivo por URL).
