Files
whatsapp/modules/soporte/docs/operacion/30-despliegue.md
T
Lizandro GuarnizoandClaude Opus 5 32c209710c Documentación completa del proyecto en el módulo Soporte
21 documentos en cuatro secciones, escritos sobre el comportamiento real del
sistema —incluidos los casos que costaron diagnosticar esta semana.

Manual de usuario (visible para todos): primeros pasos, recepción, toma de
muestras, portal del enfermero y administración. Orientado a tareas concretas,
no a describir pantallas.

Documentación técnica: índice de módulos, turnero, formularios y firma digital,
WhatsApp y bot, domicilios, webhook (migrado de WEBHOOK_ENDPOINTS.md) e
inventario de endpoints.

Arquitectura: visión general, enrutamiento y registro de módulos, roles y
permisos, modelo de datos, integración con WhatsApp, y decisiones tomadas con
su deuda técnica asociada.

Operación: runbook de incidentes ordenado por síntoma, configuraciones críticas
—incluido qué vive en Meta y no en la base— y despliegue.

Se documentan explícitamente las trampas conocidas: role/role_id que hay que
mantener sincronizados, las columnas can_* que el control de acceso no lee, las
URL de plantilla que no se cambian desde el código, y las columnas históricas
que quedaron en NULL sin forma de recuperarlas.

README_DOCS.md apunta al módulo y explica cómo agregar páginas.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-04 10:14:32 -05:00

80 lines
2.6 KiB
Markdown

# Despliegue y mantenimiento
## Cómo se despliega
No hay build ni compilación. El código PHP se sirve directo:
```bash
git pull
```
Con eso los cambios están en producción. Es la contrapartida de no usar framework de frontend.
**Si el cambio incluye esquema de base de datos**, hay que correr la migración además del `git pull`.
## Repositorio
| | |
|---|---|
| Remoto | `gitea` |
| Rama | `main` |
Se trabaja directo sobre `main`.
## Migraciones
Van en `migrations/`, con nombre `AAAAMMDD_descripcion.sql`.
**Deben ser idempotentes** — poder correrse más de una vez sin causar daño:
```sql
ALTER TABLE admin_users
ADD COLUMN IF NOT EXISTS cedula VARCHAR(30) NULL AFTER cargo;
UPDATE admin_users SET cedula = username
WHERE cedula IS NULL AND username REGEXP '^[0-9]{5,15}$';
```
MariaDB 11.8 admite `IF NOT EXISTS` en `ALTER TABLE`. Para `UPDATE` e `INSERT`, la guarda va en el `WHERE`.
Antes de dar por buena una migración, corrila dos veces y verificá que la segunda no cambie nada.
> Aplicar un cambio directo en producción sin dejar la migración hace que un entorno nuevo no lo tenga, y nadie se entera hasta que algo falla. Si tocás el esquema, dejá el archivo.
## Archivos subidos
| Carpeta | Contenido |
|---|---|
| `uploads/turnero/tv_media/` | Videos e imágenes de la pantalla de TV |
| `uploads/terms/` | Documentos de términos y condiciones |
Se crean solas al primer uso. **No están en el repositorio**: al mover el sistema de servidor hay que copiarlas aparte, o los enlaces quedan rotos.
## Verificaciones después de desplegar
```bash
# Sintaxis de los archivos tocados
php -l archivo.php
# ¿Responde un enlace público?
curl -s -o /dev/null -w "%{http_code}\n" "https://<dominio>/<ruta>"
```
Si el cambio afectó permisos, recordá que **las sesiones abiertas conservan los permisos viejos** hasta que el usuario vuelva a entrar.
## Configuración por entorno
Las credenciales se leen de variables de entorno (`.env`, vía phpdotenv) y de `system_config`. El dominio no se configura: se deduce del `HTTP_HOST` de cada petición.
## Mantenimiento periódico
| Cada | Revisar |
|---|---|
| Semana | Consumo de LIA (`lab_config.lia_tokens_usados`) contra el tope de 1.000.000 |
| Mes | Que los enlaces enviados por WhatsApp respondan — sobre todo el de términos |
| Mes | Consentimientos que quedaron sin firmar |
| Trimestre | Plantillas de Meta: que sigan aprobadas |
| Trimestre | Muestras pendientes acumuladas por paciente |
Las consultas para varias de estas revisiones están en el [runbook](?m=soporte&v=documentacion&s=operacion&d=runbook).