# Despliegue en cPanel — analytics.intracool.site

Esta guía asume: servidor Ubuntu con cPanel/WHM, Node.js disponible a través
de **Setup Node.js App** (Passenger), y el subdominio `analytics.intracool.site`
ya creado apuntando a su propia carpeta de `public_html`.

No cambia nada de la arquitectura ni del diseño del sistema — solo cómo se
empaqueta y arranca en tu servidor.

## 0. Estructura recomendada en el servidor

Fuera de `public_html` (por seguridad — ver sección 7):

```
/home/USUARIO_CPANEL/call-center-analytics/     ← el repo completo (backend/ + app/)
/home/USUARIO_CPANEL/call-center-analytics/data/     ← SQLite (se crea sola)
/home/USUARIO_CPANEL/call-center-analytics/uploads/  ← subidas temporales (se crea sola)
```

Dentro de `public_html` del subdominio (esto SÍ es público):

```
/home/USUARIO_CPANEL/analytics.intracool.site/   ← solo el contenido de app/dist
```

## 1. Subir el proyecto

Sube el zip a `/home/USUARIO_CPANEL/call-center-analytics/` (por Git, SFTP, o
el Administrador de Archivos de cPanel) y descomprímelo ahí.

## 2. Backend

### 2.1 Variables de entorno

```bash
cd backend
cp .env.example .env
```

Edita `.env` y reemplaza `USUARIO_CPANEL` por tu usuario real:

```
PORT=4000
NODE_ENV=production
CORS_ORIGIN=https://analytics.intracool.site
DATABASE_PATH=/home/USUARIO_CPANEL/call-center-analytics/data/analytics.sqlite
UPLOAD_DIR=/home/USUARIO_CPANEL/call-center-analytics/uploads
```

Las carpetas `data/` y `uploads/` **se crean automáticamente** la primera vez
que arranca el backend — no hace falta crearlas a mano.

### 2.2 Instalar y compilar

```bash
npm install --omit=dev
npm run build
```

Esto genera `backend/dist/` (incluye `schema.sql`, copiado automáticamente
como parte de `npm run build` — sin esto el backend fallaría al arrancar).

### 2.3 Probar manualmente antes de conectar cPanel (opcional pero recomendado)

```bash
npm start
# en otra terminal:
curl http://localhost:4000/api/health
# → {"ok":true,"env":"production","uptimeSeconds":N}
```

Detén el proceso (Ctrl+C) antes de continuar — en el paso 4, cPanel/Passenger
se encarga de mantenerlo corriendo.

## 3. Frontend

```bash
cd app
npm install
npm run build
```

`app/.env.production` ya trae `VITE_API_URL=https://analytics.intracool.site`
— Vite lo toma automáticamente en `npm run build`, no hace falta pasar nada
por línea de comandos. **Nunca debe apuntar a localhost en este build.**

Verifica que quedó embebido correctamente:

```bash
grep -rl "analytics.intracool.site" dist/assets/*.js
```

Debe imprimir al menos un archivo. Si no imprime nada, `.env.production` no
se aplicó (revisa que el archivo exista y no tenga errores de sintaxis).

Copia el contenido de `app/dist/` (no la carpeta en sí, su contenido) a:

```
/home/USUARIO_CPANEL/analytics.intracool.site/
```

## 4. cPanel · Setup Node.js App (Passenger)

En cPanel → **Setup Node.js App** → **Create Application**:

| Campo | Valor |
|---|---|
| Node.js version | La más reciente disponible (18+) |
| Application mode | Production |
| Application root | `call-center-analytics/backend` |
| Application URL | Ver Opción A/B abajo |
| Application startup file | `dist/server.js` |

**Startup file: usa `dist/server.js` directamente.** El archivo `backend/app.js`
que se incluye en el proyecto es solo un respaldo por si tu instalación de
Passenger específicamente exige encontrar `app.js` en la raíz sin importar la
configuración — en ese caso, pon `app.js` como startup file en su lugar (ya
apunta a `dist/server.js` internamente).

En la sección **Environment Variables** de esa misma pantalla, agrega las 5
variables del paso 2.1 (cPanel las inyecta al proceso; no necesitas que exista
un archivo `.env` para que funcionen, aunque no está de más tenerlo).

Después de crear la app, entra a la pestaña con el ícono de terminal que
cPanel ofrece ahí mismo ("Run NPM Install") o corre manualmente dentro de esa
consola:

```bash
npm install --omit=dev
npm run build
```

Luego **Restart** la aplicación.

### Opción A (recomendada) — Node app bajo `/api` del mismo dominio

Application URL: `analytics.intracool.site/api`

cPanel gestiona automáticamente el proxy de esa ruta hacia tu app Node — no
necesitas configurar `mod_proxy` manualmente. Las rutas internas del backend
ya están montadas bajo `/api` (`app.use('/api', ...)`), así que esto encaja
sin tocar código.

### Opción B — Backend fuera de cPanel (PM2 / systemd en 127.0.0.1:4000)

Si prefieres no usar el Node App Manager de cPanel y correr el backend tú
mismo (por ejemplo con PM2: `pm2 start dist/server.js --name analytics-api`),
entonces Apache necesita reenviar `/api` manualmente — descomenta el bloque
`mod_proxy` en `htaccess.example` (sección 5).

## 5. .htaccess del frontend

Copia `htaccess.example` (en la raíz del proyecto) como `.htaccess` dentro de:

```
/home/USUARIO_CPANEL/analytics.intracool.site/.htaccess
```

Resuelve dos cosas:
- Rutas de React Router (`/agentes`, `/importar`, etc.) siempre sirven
  `index.html`, para que la navegación del lado del cliente funcione al
  recargar la página o entrar por link directo.
- Nunca reescribe `/api/*` — esas peticiones son del backend, no del SPA.

Si usaste la Opción B, descomenta también el bloque `mod_proxy` del mismo
archivo.

## 6. Verificación final

```bash
curl https://analytics.intracool.site/api/health
# → {"ok":true,...}
```

Abre `https://analytics.intracool.site` en el navegador: debe cargar el
Dashboard Ejecutivo y, si ya importaste datos antes, mostrarlos. Si está
vacío, ve a **Importar Datos** y sube un archivo de prueba.

## 7. Seguridad

- `DATABASE_PATH` y `UPLOAD_DIR` quedan **fuera** de `public_html` (paso 0) —
  nadie puede descargar el `.sqlite` ni archivos subidos entrando por URL.
- El `.htaccess` de ejemplo además bloquea explícitamente cualquier `.env`,
  `.sql`, `.sqlite` o `.log` que por error termine dentro de `public_html`.
- CORS solo acepta `CORS_ORIGIN` (tu dominio real) — ninguna otra web puede
  llamar a la API desde el navegador de un visitante.
- En producción (`NODE_ENV=production`) el backend nunca devuelve el detalle
  interno de un error al navegador — solo un mensaje genérico. El detalle
  completo queda en los logs del servidor (visibles desde cPanel > Setup
  Node.js App > Logs, o `stderr` si usas PM2/systemd).
- Este zip **no incluye ningún `.env` real** — solo `.env.example` y
  `app/.env.production` (que no es secreto: solo contiene la URL pública de
  la API, no credenciales).
- Sigue sin haber autenticación ni roles — el sistema es de uso personal, tal
  como se definió desde la Fase 3. Si el subdominio queda públicamente
  accesible y prefieres restringir el acceso, la opción más simple sin tocar
  la app es protegerlo con autenticación HTTP Básica desde cPanel
  (**Directory Privacy**) sobre la carpeta de `public_html`.

## 8. Actualizaciones futuras

```bash
./deploy.sh /home/USUARIO_CPANEL/analytics.intracool.site
```

Recompila backend y frontend, y publica el frontend nuevo. Después, reinicia
el backend manualmente desde cPanel > Setup Node.js App > Restart (el script
no lo hace por ti a propósito, para que siempre sea una acción consciente).
