Despliegue público de la demo (CLOUD-03)

El workflow .github/workflows/deploy-public.yml solo se activa desde main o mediante workflow_dispatch. Primero comprueba que exista la configuración del environment schemasafe-demo; si faltan credenciales, deja un resumen blocked y no ejecuta comandos Azure, Docker ni Cloudflare Pages.

Requisitos del environment

Configurar fuera del repositorio, con mínimo privilegio y OIDC:

  • AZURE_CLIENT_ID, AZURE_TENANT_ID y AZURE_SUBSCRIPTION_ID para una identidad federada limitada al Resource Group de M10.
  • CLOUDFLARE_API_TOKEN con permisos mínimos para publicar los dos proyectos de Pages y CLOUDFLARE_ACCOUNT_ID como variable no sensible.
  • CLOUDFLARE_FRONTEND_PROJECT y CLOUDFLARE_DOCS_PROJECT como variables; sus URLs serán https://<proyecto>.pages.dev.
  • SCHEMASAFE_PUBLIC_TOKEN permanece solo en el smoke autenticado; nunca se inyecta en el build frontend.
  • Variables no sensibles opcionales: SCHEMASAFE_RESOURCE_GROUP, SCHEMASAFE_AZURE_LOCATION, SCHEMASAFE_PROJECT_NAME, SCHEMASAFE_ENVIRONMENT_NAME y SCHEMASAFE_PROJECT_ID.
  • SCHEMASAFE_POSTGRES_ENABLED es false por defecto. Solo debe cambiarse a true después de confirmar en Azure Portal que B1ms está cubierto por la cuota de la suscripción; al activarlo también se requieren SCHEMASAFE_DATABASE_URL y SCHEMASAFE_POSTGRES_ADMIN_PASSWORD.

La imagen se publica en GHCR con el SHA del commit, Bicep despliega el backend seguro con SQLite/fixtures por defecto en westus y el job publica frontend y manuales en Cloudflare Pages Free. Al final, el workflow muestra las URLs y bloquea la entrega si health/readiness falla.

En el entorno Express de Container Apps, cambiar un secreto no reemplaza una réplica que ya estaba ejecutándose. Por eso el workflow publica además una segunda etiqueta inmutable del mismo digest (<sha>-secretref) y la usa justo después de configurar secretref:schemasafe-auth-signing-key; ese cambio crea una réplica nueva que recibe el secreto en su entorno sin escribir la clave en la imagen, el repositorio o los logs. minReplicas=0 y maxReplicas=1 se mantienen sin cambios.

Límites y rollback

No se guardan credenciales ni URI en el repositorio. PostgreSQL permanece opcional y la configuración pública por defecto usa fixtures. Para rollback se conserva la imagen por SHA y se usa el procedimiento de OPS-04 con una revisión saludable; no se elimina el Resource Group durante una recuperación.

Mientras el environment no esté configurado, no existe una URL pública verificable. La URL real debe registrarse como SCHEMASAFE_PUBLIC_URL en la evidencia posterior al despliegue; no se inventa durante CI.

Referencias