# 🚀 Despliegue de Informados CV en cPanel

Esta guía detalla cómo desplegar la aplicación Laravel 12 + Filament 3 en un servidor cPanel.

---

## 📋 Requisitos Previos

### En el Servidor cPanel:
- **PHP 8.3+** (configurable en cPanel → Select PHP Version)
- **Composer** instalado
- **Node.js 18+** y npm (para compilar assets)
- **MySQL 8.0+** o MariaDB
- **Acceso SSH** (recomendado) o File Manager de cPanel
- **Dominio/Subdominio** configurado

### Extensiones PHP Requeridas:
- BCMath
- Ctype
- Fileinfo
- JSON
- Mbstring
- OpenSSL
- PDO
- PDO_MySQL
- Tokenizer
- XML
- cURL
- GD o Imagick (para procesamiento de imágenes)
- ZIP

---

## 🗂️ Estructura de Directorios en cPanel

```
/home/usuario/
├── public_html/              # DocumentRoot del dominio
│   ├── index.php            # Apunta a Laravel public
│   ├── .htaccess
│   ├── css/
│   ├── js/
│   └── storage -> ../informados/storage/app/public
├── informados/              # Aplicación Laravel (FUERA de public_html)
│   ├── app/
│   ├── bootstrap/
│   ├── config/
│   ├── database/
│   ├── public/             # Contenido se copia/enlaza a public_html
│   ├── resources/
│   ├── routes/
│   ├── storage/
│   ├── vendor/
│   ├── .env
│   ├── artisan
│   └── composer.json
└── repositories/            # Opcional: clonar aquí el repo
```

---

## 🔧 Paso 1: Preparar el Proyecto Localmente

### 1.1 Compilar Assets para Producción

```bash
# En tu máquina local
cd /Users/ronaldpazaguilar/Herd/informados

# Compilar assets de producción
npm run build

# Limpiar caché
php artisan config:clear
php artisan cache:clear
php artisan view:clear
php artisan route:clear
```

### 1.2 Optimizar Composer

```bash
# Instalar dependencias de producción (sin dev)
composer install --optimize-autoloader --no-dev

# O si prefieres hacerlo en el servidor, genera composer.lock actualizado
composer update --lock
```

### 1.3 Crear Archivo .env de Producción

Crea un archivo `.env.production` con la configuración del servidor:

```env
APP_NAME="Informados CV"
APP_ENV=production
APP_KEY=base64:TU_APP_KEY_GENERADA
APP_DEBUG=false
APP_URL=https://tudominio.com

LOG_CHANNEL=stack
LOG_DEPRECATIONS_CHANNEL=null
LOG_LEVEL=error

DB_CONNECTION=mysql
DB_HOST=localhost
DB_PORT=3306
DB_DATABASE=nombre_base_datos
DB_USERNAME=usuario_mysql
DB_PASSWORD=contraseña_segura

BROADCAST_DRIVER=log
CACHE_DRIVER=file
FILESYSTEM_DISK=local
QUEUE_CONNECTION=database
SESSION_DRIVER=file
SESSION_LIFETIME=120

MEMCACHED_HOST=127.0.0.1

REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379

MAIL_MAILER=smtp
MAIL_HOST=smtp.tudominio.com
MAIL_PORT=587
MAIL_USERNAME=noreply@tudominio.com
MAIL_PASSWORD=tu_password_email
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS=noreply@tudominio.com
MAIL_FROM_NAME="${APP_NAME}"

# Firebase para notificaciones push
FIREBASE_CREDENTIALS=/ruta/completa/al/firebase-credentials.json
FIREBASE_PROJECT_ID=tu-proyecto-firebase

# Configuración de la base de datos legacy (si aplica)
LEGACY_DB_HOST=localhost
LEGACY_DB_PORT=3306
LEGACY_DB_DATABASE=informados_legacy
LEGACY_DB_USERNAME=usuario_legacy
LEGACY_DB_PASSWORD=password_legacy
```

---

## 📤 Paso 2: Subir Archivos al Servidor

### Opción A: Usando Git (Recomendado)

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

# Ir al directorio home
cd ~

# Clonar el repositorio
git clone https://github.com/rongpaz/informados.git

# Entrar al proyecto
cd informados

# Cambiar a la rama de producción (si tienes)
git checkout main
```

### Opción B: Usando File Manager de cPanel

1. Comprime el proyecto localmente (sin `node_modules` ni `vendor`):
   ```bash
   zip -r informados.zip . -x "node_modules/*" -x "vendor/*" -x ".git/*" -x "storage/logs/*" -x "storage/framework/cache/*"
   ```

2. Sube `informados.zip` usando File Manager de cPanel
3. Extrae el archivo en `/home/usuario/informados`

### Opción C: Usando FTP/SFTP

Usa FileZilla o cualquier cliente FTP para subir los archivos a `/home/usuario/informados`

---

## 🔨 Paso 3: Configurar el Entorno en el Servidor

### 3.1 Conectar por SSH

```bash
ssh usuario@tudominio.com
cd ~/informados
```

### 3.2 Configurar PHP CLI (si es necesario)

```bash
# Verificar versión de PHP
php -v

# Si no es 8.3+, crear alias en .bashrc
echo 'alias php="/usr/local/bin/php83"' >> ~/.bashrc
source ~/.bashrc
```

### 3.3 Instalar Dependencias de Composer

```bash
cd ~/informados

# Si Composer está instalado globalmente
composer install --optimize-autoloader --no-dev

# Si no tienes Composer, descargarlo
curl -sS https://getcomposer.org/installer | php
php composer.phar install --optimize-autoloader --no-dev
```

### 3.4 Configurar .env

```bash
# Copiar archivo de producción
cp .env.production .env

# Editar con nano o vim
nano .env

# Generar APP_KEY si no tienes una
php artisan key:generate
```

### 3.5 Configurar Permisos

```bash
# Dar permisos de escritura a storage y bootstrap/cache
chmod -R 775 storage bootstrap/cache

# Si el servidor usa Apache con usuario específico
chown -R usuario:usuario storage bootstrap/cache
```

---

## 🗄️ Paso 4: Configurar Base de Datos

### 4.1 Crear Base de Datos en cPanel

1. Ve a **cPanel → MySQL Databases**
2. Crea una nueva base de datos: `usuario_informados`
3. Crea un usuario MySQL: `usuario_informados_user`
4. Asigna todos los privilegios al usuario en la base de datos
5. Anota las credenciales en `.env`

### 4.2 Ejecutar Migraciones

```bash
cd ~/informados

# Ejecutar migraciones
php artisan migrate --force

# Ejecutar seeders (si los tienes)
php artisan db:seed --force

# O todo junto
php artisan migrate:fresh --seed --force
```

---

## 🌐 Paso 5: Configurar DocumentRoot

### Opción A: Dominio Principal

Si `tudominio.com` debe apuntar a Laravel:

```bash
cd ~/public_html

# Respaldar index.php original (si existe)
mv index.php index.php.bak

# Crear symlinks a los assets públicos de Laravel
ln -s ~/informados/public/index.php index.php
ln -s ~/informados/public/.htaccess .htaccess
ln -s ~/informados/public/css css
ln -s ~/informados/public/js js
ln -s ~/informados/public/build build
ln -s ~/informados/storage/app/public storage

# O copiar todo el contenido de public/
cp -r ~/informados/public/* ~/public_html/
```

### Opción B: Subdominio

1. En cPanel → **Subdomains**, crea `app.tudominio.com`
2. Configura DocumentRoot: `/home/usuario/informados/public`
3. No necesitas copiar archivos, el subdominio apunta directamente

### Archivo .htaccess en public_html (si usas Opción A)

```apache
<IfModule mod_rewrite.c>
    RewriteEngine On

    # Redirigir todo a index.php de Laravel
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ /index.php [L]
</IfModule>
```

---

## 🔗 Paso 6: Configurar Storage Link

```bash
cd ~/informados

# Crear enlace simbólico de storage
php artisan storage:link

# Verificar que funciona
ls -la public/storage
```

---

## ⚙️ Paso 7: Optimizar para Producción

```bash
cd ~/informados

# Limpiar cachés antiguos
php artisan config:clear
php artisan cache:clear
php artisan view:clear
php artisan route:clear

# Generar cachés optimizados
php artisan config:cache
php artisan route:cache
php artisan view:cache

# Optimizar autoload de Composer
composer dump-autoload --optimize --no-dev
```

---

## 🔐 Paso 8: Configurar SSL (HTTPS)

### Opción A: Let's Encrypt (Gratis)

1. Ve a cPanel → **SSL/TLS Status**
2. Busca tu dominio
3. Click en **Run AutoSSL**
4. Espera 5-10 minutos

### Opción B: SSL Comercial

1. Compra certificado SSL
2. Ve a cPanel → **SSL/TLS → Manage SSL Sites**
3. Sube certificado, clave privada y CA Bundle
4. Asigna al dominio

### Forzar HTTPS en .htaccess

Edita `public_html/.htaccess`:

```apache
<IfModule mod_rewrite.c>
    RewriteEngine On

    # Forzar HTTPS
    RewriteCond %{HTTPS} off
    RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

    # Laravel routes
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ /index.php [L]
</IfModule>
```

---

## 📧 Paso 9: Configurar Email

### Opción A: Usar cPanel Email

```env
MAIL_MAILER=smtp
MAIL_HOST=mail.tudominio.com
MAIL_PORT=587
MAIL_USERNAME=noreply@tudominio.com
MAIL_PASSWORD=tu_password
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS=noreply@tudominio.com
MAIL_FROM_NAME="Informados CV"
```

### Opción B: Usar Gmail SMTP

```env
MAIL_MAILER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
MAIL_USERNAME=tucorreo@gmail.com
MAIL_PASSWORD=tu_app_password
MAIL_ENCRYPTION=tls
```

### Probar Email

```bash
php artisan tinker
>>> Mail::raw('Test email', function($msg) { $msg->to('test@example.com')->subject('Test'); });
```

---

## 🔥 Paso 10: Configurar Firebase (Notificaciones Push)

### 10.1 Subir Credenciales de Firebase

```bash
# Crear directorio para credenciales
mkdir -p ~/informados/storage/credentials

# Subir firebase-credentials.json usando SFTP o cPanel File Manager
# Ruta: ~/informados/storage/credentials/firebase-credentials.json

# Ajustar permisos
chmod 600 ~/informados/storage/credentials/firebase-credentials.json
```

### 10.2 Actualizar .env

```env
FIREBASE_CREDENTIALS=/home/usuario/informados/storage/credentials/firebase-credentials.json
FIREBASE_PROJECT_ID=informados-cv
```

---

## 🔄 Paso 11: Configurar Queue Worker (Cron Job)

### 11.1 Crear Script de Queue Worker

```bash
nano ~/queue-worker.sh
```

Contenido:

```bash
#!/bin/bash
cd /home/usuario/informados
/usr/local/bin/php83 artisan queue:work --tries=3 --timeout=90 >> /dev/null 2>&1
```

```bash
chmod +x ~/queue-worker.sh
```

### 11.2 Configurar Cron Job en cPanel

1. Ve a cPanel → **Cron Jobs**
2. Agrega un nuevo cron job:

**Para Queue Worker** (ejecutar cada minuto):
```
* * * * * /home/usuario/queue-worker.sh
```

**Para Schedule** (tareas programadas de Laravel):
```
* * * * * cd /home/usuario/informados && /usr/local/bin/php83 artisan schedule:run >> /dev/null 2>&1
```

---

## 🧪 Paso 12: Verificar Instalación

### 12.1 Probar en el Navegador

```
https://tudominio.com
```

Deberías ver la aplicación funcionando.

### 12.2 Probar Admin Panel

```
https://tudominio.com/admin
```

### 12.3 Verificar Logs

```bash
tail -f ~/informados/storage/logs/laravel.log
```

---

## 🐛 Solución de Problemas Comunes

### Error 500 - Internal Server Error

```bash
# Ver logs de Laravel
tail -50 ~/informados/storage/logs/laravel.log

# Ver logs de Apache
tail -50 ~/var/log/apache/error_log

# Verificar permisos
chmod -R 775 storage bootstrap/cache
```

### "No application encryption key has been specified"

```bash
php artisan key:generate
php artisan config:cache
```

### Error de Base de Datos

```bash
# Verificar credenciales en .env
nano .env

# Probar conexión
php artisan tinker
>>> DB::connection()->getPdo();
```

### Assets no cargan (404)

```bash
# Verificar que los symlinks existen
ls -la ~/public_html/

# Regenerar build de Vite
npm run build

# Copiar assets
cp -r public/build ~/public_html/
```

### Storage Link no funciona

```bash
# Eliminar link antiguo
rm public/storage

# Recrear
php artisan storage:link

# Si no funciona, crear manualmente
ln -s ~/informados/storage/app/public ~/public_html/storage
```

---

## 🔄 Actualización del Proyecto

Cuando hagas cambios y necesites actualizar:

```bash
# Conectar por SSH
ssh usuario@tudominio.com
cd ~/informados

# Hacer pull de los cambios
git pull origin main

# Actualizar dependencias
composer install --optimize-autoloader --no-dev

# Ejecutar migraciones nuevas
php artisan migrate --force

# Limpiar cachés
php artisan config:clear
php artisan cache:clear
php artisan view:clear
php artisan route:clear

# Regenerar cachés
php artisan config:cache
php artisan route:cache
php artisan view:cache

# Si hay cambios en el frontend
npm install
npm run build
cp -r public/build ~/public_html/
```

---

## 📋 Checklist de Despliegue

- [ ] PHP 8.3+ configurado
- [ ] Composer instalado
- [ ] Archivos subidos al servidor
- [ ] `.env` configurado correctamente
- [ ] `APP_KEY` generada
- [ ] Base de datos creada
- [ ] Migraciones ejecutadas
- [ ] Permisos de storage configurados (775)
- [ ] Storage link creado
- [ ] DocumentRoot apuntando a `public/` o symlinks creados
- [ ] SSL/HTTPS configurado
- [ ] Email configurado y probado
- [ ] Firebase credenciales subidas
- [ ] Cron jobs configurados (queue, schedule)
- [ ] Cachés de producción generados
- [ ] Aplicación probada en navegador
- [ ] Admin panel accesible
- [ ] Logs sin errores

---

## 🔐 Seguridad Post-Despliegue

### 1. Proteger Archivos Sensibles

```bash
chmod 600 .env
chmod 600 storage/credentials/firebase-credentials.json
```

### 2. Deshabilitar Directorios Listables

Agrega a `.htaccess`:

```apache
Options -Indexes
```

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

```bash
# Permitir solo puertos necesarios
# 80, 443, 22 (SSH), 3306 (MySQL solo localhost)
```

### 4. Actualizar Regularmente

```bash
# Cada semana/mes
composer update --no-dev
php artisan migrate --force
```

---

## 📞 Soporte

Si encuentras problemas:
1. Revisa logs: `storage/logs/laravel.log`
2. Verifica configuración: `php artisan config:show`
3. Contacta al soporte de tu hosting cPanel

---

**¡Despliegue completado! 🎉**
