# Perfil de despliegue: Namecheap Stellar

**Estado:** verificado contra documentación pública de Namecheap el 11-oct-2026. Los límites pueden cambiar; **repetir la verificación en la Fase 0 sobre la cuenta real**.

## 1. Límites verificados

| Recurso | Stellar | Fuente |
|---|---|---|
| Disco | 20 GB SSD | [Planes compartidos](https://www.namecheap.com/hosting/shared/) |
| Inodos (archivos) | **300.000** | idem |
| Dominios alojados | 3 | idem |
| Bases de datos MySQL | 50 | idem |
| Backups de Namecheap | 2 por semana, "no garantizados" | idem |
| CPU (LVE) | 50 % (ráfaga hasta 200 %) | [Guía LVE](https://www.namecheap.com/support/knowledgebase/article.aspx/1127/103/a-handy-guide-to-resource-limits-or-what-is-lve) |
| RAM física | 1 GB | idem |
| Procesos de entrada (EP) | **20** | idem |
| E/S | 50 MB/s | idem |
| Cron | mínimo 5 min; máx. 5 simultáneos | [Restricciones](https://www.namecheap.com/support/knowledgebase/article.aspx/157/22/do-you-have-any-server-resource-restrictions/) |
| Procesos persistentes | prohibidos | idem |
| Uso sostenido | ningún script ≥ 25 % de recursos durante ≥ 60 s | idem |

**No publicado (verificar en Fase 0):** NPROC, disponibilidad de SSH en el plan (se solicita al soporte), versión exacta de MariaDB, soporte de PHP 8.3 y extensiones, `memory_limit`, `upload_max_filesize`, `max_execution_time`.

## 2. Consecuencias de diseño

| Límite | Riesgo | Decisión de diseño |
|---|---|---|
| 300.000 inodos | Cada versión documental es un archivo; `vendor/` también consume inodos | Cuota de inodos por organización, alerta al 70 % y bloqueo de cargas al 90 %. Directorios fragmentados por prefijo del identificador (`ab/cd/…`). Medir inodos de `vendor/` en Fase 0 y optimizar con `composer install --no-dev --optimize-autoloader`. |
| 20 EP | Descargas largas y cargas ocupan un proceso de entrada | Descargas por *streaming* en bloques de 1 MiB, sin cargar el archivo en memoria. Límite de tamaño por archivo (inicial 10 MB). Sin polling agresivo desde la interfaz. |
| 1 GB RAM | Procesar archivos o lotes grandes provoca 500/503 | `memory_limit` objetivo 256 MB por petición. Hash SHA-256 por flujo (`hash_update_stream`). Lotes de cola pequeños (10 por defecto). Sin procesamiento de documentos en la petición web. |
| CPU 50 % y regla de 25 %/60 s | Cron pesado penaliza la cuenta | El worker de cola corre como máximo 45 s por ejecución y duerme entre trabajos. Sin OCR ni conversión local. |
| Cron ≥ 5 min | Vencimientos y correos con retraso | Se diseña tolerando 5 a 10 min de latencia. Un único cron `schedule:run` cada 5 min. `withoutOverlapping` en todas las tareas. |
| Sin procesos persistentes | No hay `queue:work` residente | Cola en base de datos, drenada por cron con `--stop-when-empty`. |
| Backups "no garantizados" | Pérdida de datos | Backup propio nocturno (BD + archivos) con verificación de hash y copia fuera de Namecheap. Refuerza ADR-009: **solo datos de prueba**. |
| SSH no confirmado | Sin `composer` ni `artisan` en servidor | **Despliegue por artefacto**: `scripts/build-release.sh` genera un `.zip` con `vendor/` y *assets* ya compilados. Migraciones mediante comando de cron de una sola ejecución. |
| 3 dominios | Un entorno por dominio | Producción y validación en dominios distintos; desarrollo en local. |

## 3. Presupuesto de recursos orientativo (a validar)

- Petición web típica: < 64 MB de RAM, < 300 ms de CPU.
- Subida máxima inicial: 10 MB; configurable por política.
- Lote de cola: 10 trabajos o 45 s, lo que ocurra primero.
- Cuota inicial por organización: 5.000 versiones documentales (≈ 5.000 inodos) y 2 GB.
- Con 300.000 inodos y reserva de 60.000 para código, `vendor/`, cachés y logs, quedan ≈ 240.000 inodos para documentos en total.

## 4. Lista de comprobación Fase 0 en la cuenta real

- [ ] `php -v` y `php -m` con 8.3 y extensiones: `pdo_mysql`, `mbstring`, `openssl`, `fileinfo`, `intl`, `sodium`, `zip`, `xml`, `ctype`, `tokenizer`.
- [ ] Versión de MariaDB y *collation* `utf8mb4_unicode_ci` disponible.
- [ ] `php -i | grep -E "memory_limit|upload_max|post_max|max_execution"`.
- [ ] SSH disponible (solicitud al soporte) o confirmar despliegue solo por artefacto.
- [ ] *Document root* apuntando a `public/` del proyecto (en cPanel, dominio o subdominio dedicado). Si no es posible, **no habilitar cargas**.
- [ ] Directorio `storage_private/` fuera de `public_html`.
- [ ] Conteo de inodos tras desplegar (`find . | wc -l` o cPanel).
- [ ] Cron de prueba cada 5 min y envío de correo real.
- [ ] Confirmar ubicación del centro de datos y condiciones sobre datos personales (relevante para Perú).
