# Despliegue en cPanel (hosting compartido)

Instrucciones para subir el sistema MTO MEDSURSA a un hosting cPanel con MariaDB. No requiere Docker, Node ni Supervisor.

## 1. Pre-requisitos en cPanel

- PHP ≥ 8.3 (preferible 8.4) habilitado en **MultiPHP Manager** para tu dominio o subdominio.
- Extensiones PHP: `bcmath`, `ctype`, `curl`, `dom`, `fileinfo`, `gd`, `mbstring`, `mysqli`, `openssl`, `pdo`, `pdo_mysql`, `tokenizer`, `xml`, `zip`.
- Acceso por SSH (para `composer install`) — si no hay SSH, sube `vendor/` ya generado.
- Subdominio (recomendado): por ejemplo `mto.tudominio.com` apuntando a `~/public_html/mto-public/`.

## 2. Estructura recomendada en el servidor

```
/home/usuario/
├── mto/                  # Carpeta del proyecto Laravel (FUERA de public_html)
│   ├── app/
│   ├── bootstrap/
│   ├── config/
│   ├── database/
│   ├── resources/
│   ├── routes/
│   ├── storage/
│   ├── vendor/
│   ├── .env
│   └── ...
└── public_html/
    └── mto-public/       # Punto de entrada web (carpeta `public/` del proyecto)
        ├── index.php
        ├── .htaccess
        ├── img/
        └── storage/      # symlink → ../mto/storage/app/public
```

> Si tu hosting no permite carpetas fuera de `public_html`, coloca todo en `public_html/mto/` y apunta el subdominio a `public_html/mto/public/`. Funciona igual.

## 3. Subir archivos

Usa **Administrador de archivos** o SFTP/SSH:

```bash
# desde tu máquina (con git o zip)
scp -r mto/ usuario@servidor:/home/usuario/mto/
```

O comprime y sube `mto.zip`, descomprime en `/home/usuario/`.

## 4. Mover la carpeta `public/`

```bash
mv /home/usuario/mto/public /home/usuario/public_html/mto-public
```

Edita `/home/usuario/public_html/mto-public/index.php` para corregir las rutas:

```php
require __DIR__.'/../../mto/vendor/autoload.php';
$app = require_once __DIR__.'/../../mto/bootstrap/app.php';
```

(Cambia `..` según donde quedó la carpeta del proyecto.)

## 5. Crear la base de datos

En **cPanel → MySQL Databases**:

1. Crea base `usuario_mto` (utf8mb4).
2. Crea usuario `usuario_mto` con contraseña fuerte.
3. Asigna **All Privileges** del usuario a la base.

## 6. Configurar `.env`

```env
APP_NAME="Sistema MTO MEDSURSA"
APP_ENV=production
APP_KEY=base64:GENERAR_NUEVA   # ver paso 7
APP_DEBUG=false
APP_URL=https://mto.tudominio.com

APP_LOCALE=es
APP_FALLBACK_LOCALE=es
APP_TIMEZONE=America/Lima

LOG_CHANNEL=daily
LOG_LEVEL=error

DB_CONNECTION=mariadb
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=usuario_mto
DB_USERNAME=usuario_mto
DB_PASSWORD=tu_contrasena_fuerte
DB_CHARSET=utf8mb4
DB_COLLATION=utf8mb4_unicode_ci

SESSION_DRIVER=database
SESSION_LIFETIME=120
SESSION_SECURE_COOKIE=true
SESSION_DOMAIN=.tudominio.com

CACHE_STORE=database
QUEUE_CONNECTION=database
FILESYSTEM_DISK=public
```

## 7. Ejecutar comandos vía SSH (Terminal en cPanel)

```bash
cd /home/usuario/mto
composer install --no-dev --optimize-autoloader
php artisan key:generate
php artisan migrate --force --seed
php artisan storage:link
php artisan config:cache
php artisan route:cache
php artisan view:cache
```

> Si tu hosting no tiene `composer` instalado, sube la carpeta `vendor/` ya generada localmente.

## 8. Permisos

```bash
chmod -R 755 /home/usuario/mto
chmod -R 775 /home/usuario/mto/storage /home/usuario/mto/bootstrap/cache
```

## 9. Crear el symlink `storage`

cPanel a veces no permite `php artisan storage:link`. Hazlo manualmente:

```bash
ln -s /home/usuario/mto/storage/app/public /home/usuario/public_html/mto-public/storage
```

## 10. Configurar el cron de Laravel Scheduler

En **cPanel → Cron Jobs**, agregar (cada minuto):

```
* * * * * cd /home/usuario/mto && /usr/local/bin/php artisan schedule:run >> /dev/null 2>&1
```

## 11. `.htaccess` del subdominio

`/home/usuario/public_html/mto-public/.htaccess` ya viene con Laravel. Verifica que tenga:

```apache
<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews -Indexes
    </IfModule>

    RewriteEngine On

    # Handle Authorization Header
    RewriteCond %{HTTP:Authorization} .
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

    # Redirect Trailing Slashes If Not A Folder...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_URI} (.+)/$
    RewriteRule ^ %1 [L,R=301]

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

Y a la raíz `/home/usuario/mto/.htaccess`:

```apache
RewriteEngine On
RewriteRule ^.*$ - [F,L]
```

(Bloquea acceso directo al código fuera de `public/`.)

## 12. Forzar HTTPS

En el subdominio, agrega al inicio del `.htaccess` de `mto-public/`:

```apache
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
```

## 13. Backups

cPanel → **Backup Wizard** → respaldo de:

- Base `usuario_mto` (semanal).
- `home/usuario/mto/storage/` (incluye fotos cargadas).
- `.env`.

Programa también:

```
0 3 * * * mysqldump -u usuario_mto -p'tu_password' usuario_mto | gzip > /home/usuario/backups/mto_$(date +\%F).sql.gz
```

## 14. Optimizaciones para producción

```bash
php artisan optimize
php artisan icons:cache  # solo si usas blade-icons
```

## 15. Mantenimiento

```bash
php artisan down              # poner en mantenimiento
php artisan migrate --force   # tras subir nuevas migraciones
php artisan up                # restaurar
```

## 16. Resolución de problemas

| Síntoma                                                   | Causa                                | Solución                                                                |
|-----------------------------------------------------------|--------------------------------------|-------------------------------------------------------------------------|
| 500 al cargar / pantalla en blanco                        | Permisos de `storage` o caché viejo  | `chmod -R 775 storage bootstrap/cache && php artisan optimize:clear`    |
| `419 Page Expired` al hacer login                         | Cookies seguras sin HTTPS            | Activar HTTPS o `SESSION_SECURE_COOKIE=false` en dev                    |
| Imágenes/fotos no cargan                                  | Falta el symlink                     | Crear symlink (paso 9)                                                  |
| Importación falla con `Allowed memory size exhausted`     | Excel muy grande                     | En cPanel → MultiPHP INI Editor: `memory_limit=512M`, `max_execution_time=300` |
| `Class "ZipArchive" not found`                            | Falta la extensión zip               | Habilitar `zip` en MultiPHP                                             |
| `SQLSTATE[42S02]`                                         | Migraciones no corridas              | `php artisan migrate --force`                                           |

## 17. Subir actualizaciones

```bash
cd /home/usuario/mto
php artisan down
git pull              # o sube los archivos vía SFTP
composer install --no-dev --optimize-autoloader
php artisan migrate --force
php artisan optimize:clear
php artisan optimize
php artisan up
```
