Azure Runtime

<!-- TASK-212-MARKER:azure -->

Azure Runtime

TesseraCMS kører helt på Azure. Hele infrastrukturen er IaaS-fri — alt er managed services.

Komponenter

Service Rolle
Azure Container Apps (ACA) SSR Next.js-runtime, auto-skalerer på trafik
Azure Container Registry / GHCR Docker images bygget af GitHub Actions
Azure Table Storage Content-items (alle pages, blocks, menus, themes)
Azure Blob Storage Media (billeder, dokumenter)
Azure AD via ACA Easy Auth OAuth-login til admin
Azure Communication Services (ACS) Transactional email (invitationer, reset osv.)

Storage-model

Content: Azure Table Storage med PartitionKey = <tenantSlug>_<typeName>. Alle læs/skriv-operationer skal scope på tenantSlug — dette håndhæves i src/lib/storage/content-items.ts.

Media: Azure Blob Storage med container per tenant. Editor upload'er via /admin/media, public-site-rendering bruger blob-URLs direkte.

Deploy-flow

  1. Push til master på GitHub
  2. GitHub Action bygger Docker image (Node 24, Next.js standalone)
  3. Image push'es til GHCR
  4. Action kalder az containerapp update --image på ACA
  5. ACA traffic-shift'er gradvist til ny revision
  6. Total tid: ~5-7 minutter

Easy Auth

Azure AD-login håndteres af Easy Auth foran ACA. Når en bruger besøger /admin/* kører Easy Auth OAuth-flowet og sætter X-MS-CLIENT-PRINCIPAL-headers. TesseraCMS læser dem og krydser med roller fra storage for at autorisere.

Hvad TesseraCMS IKKE bruger

Bevidste fravalg for at holde stacken simpel:

  • Ingen separat database (Azure Tables dækker behovet)
  • Ingen Redis / cache-layer (Tables er lave-latens nok)
  • Ingen Kubernetes (ACA håndterer scaling)
  • Ingen Service Bus (admin er CRUD — ingen async-flows endnu)

Dybere indhold

Se Azure architecture-siden for fuldt deployment-diagram, naming-conventions for resources og operational runbook.

Cross-references

Azure runtime architecture

Layered view of how a public request travels from browser to Azure storage. Each row is a deployment layer.

Client
Browser
User session
Edge
Azure Container Apps
Auto-scaling HTTP entry-point
App
Next.js SSR
Multi-tenant routing — /[artist]/...
TesseraCMS Engine
Block + content-type registry
Storage
Azure Tables
Content items per tenant
Azure Blob
Media files
ACS Email
Transactional mail
Identity
Easy Auth + Azure AD
OAuth in front of /admin

<!-- TASK-216-MARKER:azure-diagram -->