# Guía de Implementación - cPanel

Esta guía explica cómo desplegar la API Node.js en un hosting con cPanel.

## 📋 Requisitos del Hosting

- **cPanel** con acceso SSH (recomendado)
- **Node.js** disponible (versión 14+)
- **MySQL** (versión 5.7+)
- Permisos para crear bases de datos

## 🚀 Paso a Paso

### 1. Preparar Archivos Localmente

Comprime la carpeta `api/` en un archivo ZIP:

```bash
# En tu computadora
cd prototipo-intranet
zip -r api-deploy.zip api/
```

### 2. Crear Base de Datos en cPanel

1. Accede a tu **cPanel**
2. Ve a **"MySQL Database Wizard"**
3. Crea la base de datos: `carrasq_intranet`
4. Crea un usuario MySQL con contraseña segura
5. Asigna todos los privilegios al usuario

### 3. Importar Base de Datos

1. En cPanel, ve a **"phpMyAdmin"**
2. Selecciona la base de datos creada
3. Ve a la pestaña **"Importar"**
4. Selecciona el archivo `database/init/01-instalacion-completa.sql`
5. Click en **"Go"**

### 4. Subir API al Servidor

#### Opción A: Via File Manager

1. En cPanel, abre **"File Manager"**
2. Ve a `public_html/` (o el directorio de tu dominio)
3. Crea carpeta: `api/`
4. Sube el archivo ZIP y extráelo

#### Opción B: Via SSH (Recomendado)

```bash
# Conectar por SSH
ssh usuario@tudominio.com

# Navegar a public_html
cd public_html

# Crear directorio
mkdir api
cd api

# Subir archivos (desde tu PC)
scp -r api/* usuario@tudominio.com:~/public_html/api/

# O clonar desde Git (si usas repositorio)
git clone https://github.com/tuusuario/intranet-api.git .
```

### 5. Configurar Node.js en cPanel

#### Si tu cPanel tiene "Setup Node.js App":

1. Ve a **"Setup Node.js App"**
2. Click en **"Create Application"**
3. Configura:
   - **Node.js version**: 14.x, 16.x o 18.x (recomendado)
   - **Application root**: `public_html/api`
   - **Application URL**: `tudominio.com/api` (o subdominio)
   - **Application startup file**: `server.js`
4. Click **"Create"**

5. Una vez creado, ve a **"Manage"** y en la sección **"Run NPM Install"** click en **"Run"**

#### Si NO tienes "Setup Node.js App":

Instalar Node.js manualmente (vía SSH):

```bash
# Instalar nvm (Node Version Manager)
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash
source ~/.bashrc

# Instalar Node.js
nvm install 18
nvm use 18

# Verificar
node -v  # Debe mostrar v18.x.x
npm -v   # Debe mostar 9.x.x
```

### 6. Instalar Dependencias

```bash
cd ~/public_html/api
npm install --production
```

### 7. Configurar Variables de Entorno

Crea archivo `.env` en la carpeta `api/`:

```bash
cd ~/public_html/api
cat > .env << 'EOF'
# ============================================
# CONFIGURACIÓN SERVIDOR (cPanel)
# ============================================
NODE_ENV=production
PORT=3000
API_URL=https://api.tudominio.com
CLIENT_URL=https://tudominio.com

# ============================================
# BASE DE DATOS MYSQL (cPanel)
# ============================================
DB_HOST=localhost
DB_PORT=3306
DB_USER=tu_usuario_mysql
DB_PASSWORD=tu_contraseña_mysql
DB_NAME=carrasq_intranet

# ============================================
# JWT - Generar claves seguras:
# node -e "console.log(require('crypto').randomBytes(64).toString('hex'))"
# ============================================
JWT_SECRET=REEMPLAZA_CON_CLAVE_GENERADA
JWT_REFRESH_SECRET=REEMPLAZA_CON_OTRA_CLAVE_GENERADA
JWT_ACCESS_EXPIRES_IN=15m
JWT_REFRESH_EXPIRES_IN=7d

# ============================================
# SEGURIDAD
# ============================================
BCRYPT_ROUNDS=12
MAX_LOGIN_ATTEMPTS=5
LOCKOUT_MINUTES=30

# ============================================
# ARCHIVOS
# ============================================
UPLOAD_PATH=./uploads
MAX_FILE_SIZE=10485760
EOF
```

**Importante:** Genera JWT_SECRET y JWT_REFRESH_SECRET:

```bash
node -e "console.log(require('crypto').randomBytes(64).toString('hex'))"
```

### 8. Crear Usuario Administrador

```bash
cd ~/public_html/api
node scripts/create-admin.js
```

### 9. Configurar .htaccess (si es necesario)

Si tu API está en subcarpeta, crea `.htaccess` en `public_html/`:

```apache
RewriteEngine On
RewriteRule ^$ http://127.0.0.1:3000/ [P,L]
RewriteRule ^(.*)$ http://127.0.0.1:3000/$1 [P,L]
```

O con dominio completo:

```apache
RewriteEngine On
RewriteCond %{HTTP_HOST} ^api\.tudominio\.com$ [NC]
RewriteRule ^(.*)$ http://127.0.0.1:3000/$1 [P,L]
```

### 10. Iniciar la Aplicación

#### Opción A: PM2 (Recomendado para producción)

```bash
# Instalar PM2 globalmente
npm install -g pm2

# Iniciar aplicación
cd ~/public_html/api
pm2 start server.js --name "carrasqu-api"

# Guardar configuración
pm2 save
pm2 startup

# Ver estado
pm2 status
pm2 logs carrasqu-api
```

#### Opción B: PM2 con ecosystem.config.js

Crea `ecosystem.config.js`:

```javascript
module.exports = {
  apps: [{
    name: 'carrasqu-api',
    script: './server.js',
    instances: 1,
    autorestart: true,
    watch: false,
    max_memory_restart: '1G',
    env: {
      NODE_ENV: 'production',
      PORT: 3000
    },
    log_file: './logs/combined.log',
    out_file: './logs/out.log',
    error_file: './logs/error.log',
    log_date_format: 'YYYY-MM-DD HH:mm:ss Z'
  }]
};
```

Iniciar:

```bash
pm2 start ecosystem.config.js
pm2 save
```

#### Opción C: screen (alternativa simple)

```bash
screen -S api
cd ~/public_html/api
npm start

# Presiona Ctrl+A, luego D para salir de screen
# Para volver: screen -r api
```

### 11. Configurar SSL (HTTPS)

En cPanel:

1. Ve a **"SSL/TLS"**
2. Ve a **"Manage SSL Sites"**
3. Instala certificado SSL (Let's Encrypt está disponible en muchos cPanel)

O usa Let's Encrypt vía SSH:

```bash
# Instalar certbot (si está disponible)
# O usa AutoSSL en cPanel
```

### 12. Configurar Firewall (si tienes acceso)

```bash
# Permitir puerto 3000 (si es necesario)
# Normalmente cPanel maneja esto automáticamente
```

### 13. Verificar Instalación

```bash
# Test de conexión
curl https://tudominio.com/api/health

# Debería retornar:
# {"success":true,"timestamp":"...","database":"connected"}
```

---

## 🔄 Mantenimiento

### Reiniciar servicio:

```bash
pm2 restart carrasqu-api
```

### Ver logs:

```bash
pm2 logs carrasqu-api
# O
tail -f ~/.pm2/logs/carrasqu-api-out.log
```

### Actualizar código:

```bash
cd ~/public_html/api
git pull  # Si usas git
npm install --production
pm2 restart carrasqu-api
```

### Backup de base de datos:

```bash
mysqldump -u usuario -p carrasq_intranet > backup_$(date +%Y%m%d).sql
```

---

## 🐛 Solución de Problemas

### "Cannot find module"

```bash
cd ~/public_html/api
rm -rf node_modules
npm install --production
```

### "EACCES: permission denied"

```bash
# Cambiar permisos
chmod -R 755 ~/public_html/api
```

### "Port already in use"

```bash
# Encontrar proceso
lsof -i :3000
kill -9 <PID>

# O reiniciar PM2
pm2 kill
pm2 start ecosystem.config.js
```

### "Connection refused" a MySQL

Verifica que:
- El host sea `localhost` (no 127.0.0.1)
- El usuario tenga privilegios desde localhost
- La base de datos existe: `SHOW DATABASES;`

---

## 📊 Configuración Recomendada

### Subdominio dedicado para API

Crea subdominio: `api.tudominio.com`

Apunta a: `~/public_html/api`

Ventajas:
- ✅ Separación clara frontend/backend
- ✅ CORS más simple
- ✅ Escalabilidad independiente

### Frontend en dominio principal

El frontend HTML en `tudominio.com` consume la API en `api.tudominio.com`

---

## 📞 Soporte

Si tienes problemas:

1. Revisa logs: `pm2 logs`
2. Verifica conexión MySQL: `mysql -u usuario -p`
3. Test manual: `curl http://localhost:3000/health`
4. Contacta soporte de tu hosting

---

**Última actualización:** Mayo 2026
