# Despliegue en `minka.b4all.net` (Namecheap Stellar) — Fase 0

**Estado:** guía de preparación. Ningún paso de este documento se ha ejecutado todavía en la cuenta real; los marcados con ⚠ dependen de lo que muestre su cPanel y deben confirmarse.
Subdominio: `minka.b4all.net` (actualmente vacío). Perfil de límites: `perfil-stellar.md`.

## Principio de disposición de carpetas

Todo el código y los datos van **fuera** de `public_html`; solo `public/` de Laravel es accesible por HTTP.

```text
/home/USUARIO/
├── minka/                  ← aplicación (app, vendor, config, storage, .env…)
│   └── public/             ← ÚNICA carpeta servida por el subdominio
├── storage_private/        ← documentos (nunca accesible por HTTP)
├── minka-diag/             ← diagnóstico Fase 0 (se puede borrar después)
├── backups/                ← copias propias (además de copiarlas fuera de Namecheap)
└── public_html/            ← no se usa para Minka
```

## Pasos (cPanel)

1. **Document root del subdominio** ⚠
   cPanel › *Domains* (o *Subdomains*) › `minka.b4all.net` › cambiar *Document Root* a `minka/public`.
   Si cPanel solo permite carpetas dentro de `public_html`, **detenerse**: no habilitar cargas de documentos (FR-DOC-004) y consultarlo conmigo; hay una disposición alternativa, pero con más riesgo.
2. **PHP 8.3 para el subdominio** ⚠
   cPanel › *Select PHP Version* (ver [R4](https://www.namecheap.com/support/knowledgebase/article.aspx/9417/2219/how-to-change-php-version-and-update-php-extensions-on-shared-servers/)). Activar: `pdo_mysql`, `mbstring`, `openssl`, `fileinfo`, `intl`, `sodium`, `zip`, `xml`, `ctype`, `tokenizer`, `curl`. Si 8.3 no aparece, **detenerse**: el SRS (4.1) exige documentarlo, no sustituir en silencio.
3. **Valores PHP** (cPanel › *Select PHP Version › Options*): `memory_limit=256M`, `upload_max_filesize=10M`, `post_max_size=12M`, `max_execution_time=60`, `display_errors=Off`.
4. **HTTPS**: comprobar que `https://minka.b4all.net` tiene certificado válido (AutoSSL / el que ofrezca la cuenta). Sin HTTPS no se continúa (NFR-SEC-001).
5. **Base de datos**: cPanel › *MySQL® Databases* (o *MariaDB*): crear BD y usuario propios de Minka con contraseña larga y aleatoria; asignar todos los privilegios **solo a esa BD**. No compartir usuario con otras aplicaciones.
6. **Diagnóstico de Fase 0** (sección siguiente) y envío del informe.
7. **Cron** de prueba cada 5 min (ver sección "Cron").
8. **Correo**: crear `no-reply@b4all.net` (o usar SMTP externo) y enviar un correo de prueba.

## Diagnóstico de Fase 0

Con **SSH** (si lo tienes habilitado; se pide al soporte de Namecheap):

```bash
mkdir -p ~/minka-diag && cd ~/minka-diag
# subir fase0-diagnostico.php aquí (FTP o Administrador de archivos)
php fase0-diagnostico.php ~/minka > informe.txt
cat informe.txt
```

**Sin SSH**: cPanel › *Cron Jobs* › crear una tarea con la hora a 2–3 minutos de ahora:

```text
/usr/local/bin/php /home/USUARIO/minka-diag/fase0-diagnostico.php /home/USUARIO/minka > /home/USUARIO/minka-diag/informe.txt 2>&1
```

⚠ Verifica la ruta de PHP que cPanel sugiere para tu cuenta; puede variar (por ejemplo `/opt/cpanel/ea-php83/root/usr/bin/php`). Cuando aparezca `informe.txt`, ábrelo en el Administrador de archivos, **revisa que no contenga datos sensibles** (no imprime contraseñas ni variables de entorno) y pégalo aquí. Después elimina el cron y la carpeta `minka-diag`.

El script es de solo lectura (salvo un archivo de prueba que borra) y **se niega a ejecutarse por web**; aun así, no lo coloques en `public_html`. La guarda web no se ha probado en un servidor real.

## Cron de la aplicación (cuando exista el proyecto)

Un único cron, cada 5 minutos (mínimo permitido):

```text
*/5 * * * * /usr/local/bin/php /home/USUARIO/minka/artisan schedule:run >/dev/null 2>&1
```

⚠ Usar la misma ruta de PHP que el paso anterior. `schedule:run` ejecutará lotes de ≤ 10 trabajos o ≤ 45 s, con `withoutOverlapping`.

## Despliegue por artefacto (sin Composer ni SSH en el servidor)

1. En tu equipo: `bash scripts/build-release.sh` genera `build/minka-AAAAMMDDHHMM.zip` con `vendor/` y assets (script **aún no ejecutado**).
2. Subir el `.zip` a `/home/USUARIO/` y extraerlo en `minka/` con el Administrador de archivos.
3. Crear `/home/USUARIO/minka/.env` (copiando `.env.example`) con valores reales. **Nunca** versionarlo ni dejarlo accesible por HTTP.
4. Migraciones sin SSH: crear un cron **de una sola ejecución** `php /home/USUARIO/minka/artisan migrate --force` y eliminarlo después. Hacer antes una copia de la BD.
5. Comprobar `https://minka.b4all.net/api/v1/health` (cuando exista) y que `https://minka.b4all.net/.env` y `/storage/` devuelvan 404.

## Pruebas obligatorias antes de habilitar cargas

- [ ] `https://minka.b4all.net/.env`, `/composer.json`, `/vendor/`, `/storage/` → 404/403.
- [ ] Un archivo de prueba en `storage_private/` **no** es accesible por ninguna URL.
- [ ] Subir un `.php` renombrado como `.pdf` → rechazado.
- [ ] Recuento de archivos (inodos) tras desplegar < 20 % del límite de 300.000.
- [ ] Backup manual de BD + `storage_private/` y restauración en otra BD de prueba.

## Responsabilidades y riesgos

- Namecheap indica que sus backups son "no garantizados": el respaldo propio es obligatorio, con copia **fuera** de la cuenta.
- Solo se cargan documentos de prueba (ADR-009). Esta guía no valida cumplimiento legal ni cifrado en reposo.
- Datos que Namecheap no publica (NPROC, versión exacta de MariaDB, límites web reales) se confirman con el informe de Fase 0.
