# 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, córrala dos veces y verifique 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 toca el esquema, deje 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, recuerde 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).
