# Despliegue en Namecheap

> **Estado honesto:** esta guía se basa en la documentación de Namecheap (cPanel → *Setup Node.js App*) y **no se ha probado en una cuenta real de Namecheap**. Pruébela primero con datos ficticios. Fuente: https://www.namecheap.com/support/knowledgebase/article.aspx/10047/2182/how-to-work-with-nodejs-app/

## 1. Qué tipo de hosting elegir

| Opción | Cuándo sirve | Advertencias |
|---|---|---|
| **Hosting compartido (Stellar, etc.)** con *Setup Node.js App* | Un abogado solo, o un despacho muy pequeño, para probar. | La base embebida (PGlite) funciona en **un solo proceso**; si el hosting lanza varios procesos o reinicia la app, puede haber bloqueos. Hay límites de memoria/CPU. No está confirmado que ofrezcan PostgreSQL con Node. |
| **VPS** de Namecheap + PostgreSQL | **Recomendado** para varios usuarios y para uso real. | Requiere administrar el servidor (actualizaciones, firewall, HTTPS). |

Para un despacho con varios integrantes, use VPS con PostgreSQL (`DATABASE_URL`).

## 1b. Plan Stellar (Estelar) de Namecheap — el plan del responsable del producto

Incluye 3 sitios, 20 GB SSD y 30 buzones. Es hosting compartido, así que aplica todo lo de la fila «Hosting compartido». Puntos concretos:

- **Uso adecuado:** un abogado o un despacho de 1–2 personas, con datos ficticios o de prueba al inicio. No lo use para varios despachos clientes ni para decenas de usuarios.
- **Alertas y app «dormida»:** en cPanel la aplicación Node corre bajo Passenger, que puede detenerla cuando no recibe visitas. Si se detiene, **el proceso que dispara los avisos también se detiene** y los recordatorios llegarían tarde. Mitigación: cree una tarea en *Cron Jobs* cada 5 minutos que visite la app: `curl -fsS https://su-dominio.ec/api/health > /dev/null`. No es una garantía: verifique en *Alertas* que los avisos salgan a tiempo antes de confiar en ellos.
- **No ejecute un segundo proceso** (por ejemplo, un script de cron que abra la base de datos) mientras la app corre con PGlite: la base embebida admite un solo proceso. Por eso el cron anterior solo hace una visita HTTP. Para los respaldos, deténgase la app un momento o pruebe primero el procedimiento (ver `README.md`).
- **Correo:** los 30 buzones permiten un correo propio del dominio (por ejemplo `abogado@su-dominio.ec`). Cree el buzón en cPanel → *Email Accounts* y, en *Ajustes → Mi correo*, use el servidor y puerto que cPanel muestra en *Connect Devices* (normalmente `mail.su-dominio.ec`, puerto 465 o 587). Si el plan incluye Private Email, sirve `mail.privateemail.com`.
- **Disco:** los 20 GB incluyen adjuntos y respaldos; descargue los respaldos y bórrelos del servidor periódicamente.
- **Si se queda corto** (lentitud, reinicios, límites de CPU/memoria, avisos tardíos): pase a un VPS con PostgreSQL; los datos se migran con respaldo/restauración y con la exportación JSON.
- La prueba gratuita de 30 días sirve para validar Node 22 y el correo **antes** de pagar; el precio posterior depende de la promoción vigente: confírmelo en Namecheap.

## 2. Correo del abogado o del bufete

El sistema envía los avisos **desde el correo propio de cada despacho**. Cada administrador lo configura en *Ajustes → Mi correo*:

- **Namecheap Private Email:** servidor `mail.privateemail.com`, puerto `587`, usuario = su correo completo, contraseña del buzón.
- **Gmail / Microsoft 365:** requieren verificación en dos pasos y una *contraseña de aplicación*.

La contraseña se guarda **cifrada** (AES-256-GCM) con la clave `APP_SECRET` del servidor. Use el botón *Enviar mensaje de prueba*: confirma que el servidor de correo aceptó el mensaje, pero **no puede saber si fue leído**. Algunos hostings compartidos bloquean conexiones SMTP salientes a servidores externos: si la prueba falla por conexión, consulte con soporte de Namecheap.

## 3. Pasos en hosting compartido (cPanel)

1. En cPanel abra **Setup Node.js App** → *Create Application*. Elija **Node.js 22** (si no está disponible, la aplicación no funcionará: requiere Node 22 o superior). Modo: *Production*. Application root: `lexcontrol` (fuera de `public_html`). Application URL: su dominio o subdominio.
2. Suba el proyecto compilado (o compílelo localmente con `npm ci && npm run build`) a la carpeta `lexcontrol`, **sin** la carpeta `data`.
3. Cree el archivo de arranque `app.js` en la raíz de la aplicación (Namecheap exige un archivo `.js`; como el proyecto usa módulos ES, se carga con `import()`):

   ```js
   import('./server/dist/index.js').catch((e) => { console.error(e); process.exit(1); });
   ```
   Si Passenger rechaza la sintaxis, renómbrelo a `app.mjs` o use `module.exports = import('./server/dist/index.js')` en un `app.cjs`.
4. Ejecute *Run NPM Install* desde el panel (o suba `node_modules` ya instalados para Linux).
5. Defina las **variables de entorno** en el mismo panel:

   | Variable | Valor |
   |---|---|
   | `NODE_ENV` | `production` |
   | `APP_URL` | `https://su-dominio.ec` (HTTPS obligatorio) |
   | `APP_SECRET` | 64 caracteres aleatorios (`node -e "console.log(require('crypto').randomBytes(32).toString('hex'))"`). **Guárdela en un lugar seguro.** |
   | `PGLITE_DIR` | `/home/USUARIO/lexcontrol-data/pgdata` (**fuera** de `public_html`) |
   | `STORAGE_DIR` | `/home/USUARIO/lexcontrol-data/files` |
   | `MAIL_PROVIDER` | `none` |
   | `BRAND_NAME` | opcional: nombre en la pantalla de acceso |
   | `WORKER_ENABLED` | `true` |

   (Con PostgreSQL: `DATABASE_URL=postgres://…` en lugar de `PGLITE_DIR`.)
6. Active **HTTPS** (AutoSSL / certificado) y compruebe que `APP_URL` empiece por `https://`.
7. Reinicie la aplicación, abra el dominio y cree la cuenta del despacho en `/registro`. Después entre a *Ajustes → Despacho* para poner el nombre y el logo, y a *Mi correo* para configurar el correo.

## 4. Respaldos

Programe una tarea en cPanel → **Cron Jobs** (por ejemplo, diaria):

```
cd /home/USUARIO/lexcontrol && /ruta/a/node server/dist/cli/backup.js
```
(Ajuste la ruta de Node a la que muestre el panel.) Descargue periódicamente los respaldos a otro lugar: **los respaldos no están cifrados** y, si están en el mismo servidor, un fallo del servidor los afecta también. Pruebe la restauración (`npm run restore`) antes de confiar en ellos.

## 5. Antes de usar datos reales

Ver `docs/LIMITACIONES.md`: revisión jurídica (LOPDP), contrato de tratamiento de datos con el hosting (Namecheap es un proveedor internacional: evalúe la transferencia internacional de datos), pruebas de restauración y revisión de seguridad.

## 6. Lo que no está verificado

- Que su plan de Namecheap permita Node 22, procesos persistentes (el *worker* de alertas) y conexiones SMTP salientes.
- El comportamiento de PGlite bajo Passenger con reinicios frecuentes.
- La ruta exacta del *cron* y de Node en su cuenta.
