Persistencia, secretos y seguridad pública (CLOUD-05)

La demo conserva CONNECTION_PROFILE=fixture por defecto. PostgreSQL es opcional y separado del ciclo del Container App; al habilitarlo se ejecutan las migraciones versionadas del backend y se entrega solo la referencia DATABASE_URL_REF=env:SCHEMASAFE_DATABASE_URL.

Configuración segura

infra/azure/public-env.example contiene nombres de referencias, no valores. DATABASE_URL_REF y AUTH_SIGNING_KEY_REF apuntan a variables/secretos del entorno de ejecución. La URI, contraseña y clave nunca se incluyen en Bicep, GitHub artifacts, frontend, logs o comandos copiados a tickets.

El origen CORS deriva de la URL HTTPS de Cloudflare Pages (FRONTEND_ORIGIN) y el backend no expone MongoDB, CouchDB ni Cassandra públicamente. La retención de reportes y auditoría se configura con 90 días por defecto y se revisa con la fecha de expiración del entorno.

PostgreSQL opcional

  1. Confirma primero en Azure Portal la cuota gratuita B1ms y el presupuesto. Mantén SCHEMASAFE_POSTGRES_ENABLED=false si la cobertura no está clara.
  2. Ejecuta az deployment group what-if con postgresEnabled=true y un archivo local ignorado; aprueba cuota, presupuesto y retención.
  3. Aplica el despliegue y entrega la conexión al gestor de secretos.
  4. Configura el Container App con DATABASE_URL_REF y reinicia de forma controlada; el backend ejecuta la migración versionada antes de servir.
  5. Verifica historial y auditoría después de un reinicio; respalda antes de eliminar el servidor al terminar la demo.

El reinicio no borra historial cuando PostgreSQL está habilitado. Si no se habilita, SQLite/fixtures siguen siendo válidos para la demo, pero el historial público no se presenta como persistente.

Token y frontend

SCHEMASAFE_PUBLIC_TOKEN/VITE_AUTH_TOKEN es opcional y, si se compila en la UI, debe considerarse público y corto: no es un secreto de administración. Las claves de firma y la URI PostgreSQL nunca se compilan en frontend.

Cierre

Al finalizar, exporta evidencia, ejecuta backup/restore si PostgreSQL estuvo habilitado, elimina el Resource Group dedicado y revoca la identidad federada según el procedimiento de OPS-04. La URL pública real solo se registra después del despliegue y smoke de CLOUD-03/CLOUD-06.

Referencias