# Despliegue en cPanel (con acceso a Terminal)

Guía para subir esta aplicación Laravel 13 (PHP ^8.3, Inertia + Vue + Vite) a un hosting cPanel que ofrece acceso a Terminal (SSH o el Terminal web de cPanel).

## 1. Verifica la versión de PHP

El proyecto requiere PHP `^8.3`.

```bash
php -v
```

Si no marca 8.3+, activa esa versión para el dominio en **MultiPHP Manager** (cPanel) y usa la ruta completa del binario en el terminal si el `php` por defecto es otro, ej:

```bash
/opt/cpanel/ea-php83/root/usr/bin/php -v
```

(la ruta exacta depende del hosting; consúltala en MultiPHP si `php -v` no da 8.3).

## 2. Sube el código

Con repo Git:

```bash
git clone <tu-repo> logi-app
```

Sin repo, sube el `.zip` (sin `vendor/`, `node_modules/`) por File Manager y descomprímelo por terminal (más rápido que vía navegador):

```bash
unzip logi-app.zip -d logi-app
```

## 3. Document root apuntando a `public/`

Coloca el proyecto **fuera** de `public_html` (ej. `/home/usuario/logi-app`) y en cPanel → **Dominios**, edita el "Document Root" del dominio/subdominio para que apunte a `/home/usuario/logi-app/public`. Esto evita exponer `.env`, `app/`, etc.

## 4. Instala dependencias

```bash
cd ~/logi-app
composer install --no-dev --optimize-autoloader
```

Si `composer` no está instalado globalmente, revisa si cPanel trae el link `composer` o usa `php composer.phar install ...`.

Para el frontend (Vite + Vue), comprueba si hay Node disponible:

```bash
node -v
```

Muchos hostings compartidos **no traen Node en el terminal SSH** aunque sí den terminal. Si no está:

```bash
npm install
npm run build
```

Si falla, compila `npm run build` en tu máquina local y sube solo la carpeta `public/build/` generada.

## 5. Configura `.env`

```bash
cp .env.example .env
php artisan key:generate
```

Edita `.env` con nano/vi (o File Manager):

- `APP_ENV=production`
- `APP_DEBUG=false`
- `APP_URL=https://tudominio.com`
- `DB_CONNECTION=mysql`, `DB_HOST=127.0.0.1`, `DB_DATABASE`, `DB_USERNAME`, `DB_PASSWORD` → los datos de la base creada en **MySQL Database Wizard** de cPanel (`SESSION_DRIVER`, `CACHE_STORE` y `QUEUE_CONNECTION` usan `database` por defecto, así que la base debe existir antes de continuar).
- Datos de `MAIL_*` reales si vas a enviar correo (por defecto está en `log`).

## 6. Migraciones y storage link

```bash
php artisan migrate --force
php artisan storage:link
```

## 7. Permisos

```bash
chmod -R 775 storage bootstrap/cache
```

## 8. Optimiza para producción

```bash
php artisan config:cache
php artisan route:cache
php artisan view:cache
```

⚠️ Si después editas `.env`, corre `php artisan config:clear` (o `config:cache` de nuevo) porque el caché de config congela esos valores.

## 9. Cron para el scheduler (si lo usas)

En cPanel → **Cron Jobs**, o `crontab -e`:

```
* * * * * php /home/usuario/logi-app/artisan schedule:run >> /dev/null 2>&1
```

## 10. Cola de trabajos (opcional)

Como `QUEUE_CONNECTION=database`, si en algún punto se despachan jobs asíncronos hace falta un worker. El hosting compartido normalmente no permite procesos persistentes (`queue:work` en background/Supervisor), así que la alternativa típica es un cron cada minuto:

```
* * * * * php /home/usuario/logi-app/artisan queue:work --stop-when-empty >> /dev/null 2>&1
```

## 11. SSL

Activa **AutoSSL** en cPanel para HTTPS gratis, y confirma que `APP_URL` use `https://`.

---

## Alternativa sin Terminal (solo File Manager / FTP)

Si en algún momento pierdes el acceso a Terminal, el flujo cambia bastante:

1. Compila todo localmente: `composer install --no-dev --optimize-autoloader` y `npm run build`.
2. Genera `APP_KEY` en local (`php artisan key:generate --show`) y pégala a mano en el `.env` de producción.
3. Sube el proyecto completo (con `vendor/` y `public/build/` ya generados) por File Manager/FTP.
4. Mismo criterio de document root apuntando a `public/` (o, si no puedes cambiar el document root, copia el contenido de `public/` dentro de `public_html` y ajusta las rutas `require` de `index.php`).
5. Migraciones: exporta el esquema/datos con `mysqldump` o phpMyAdmin en local, e impórtalo por **phpMyAdmin** en cPanel.
6. `storage:link`: si el File Manager no permite crear symlinks, copia manualmente el contenido de `storage/app/public` dentro de `public/storage` (repetirlo en cada deploy).
7. Truco común para correr comandos artisan sin terminal: subir un script temporal (ej. `public/deploy.php`) que llame `Artisan::call(...)`, visitarlo una vez por navegador, y **borrarlo inmediatamente** después (protegido por contraseña o restricción de IP mientras esté expuesto).
