StatusPage — Architectuur
De StatusPage Worker is een SvelteKit SSR-applicatie die draait op Cloudflare Workers. Ze combineert een publieke statusweergave met een OIDC-beveiligde admin-sectie en een cron-gedreven health-poller. De verbinding met AutoMate.API loopt uitsluitend via een Workers VPC Service binding — er is geen publieke route naar de API.
Cloudflare stack
Bindings — overzicht
Binding naam | Type | Resource | Doel |
|---|---|---|---|
| D1 Database |
| Applicatiedata: modules, health, incidenten |
| KV Namespace |
| OIDC-sessies (8u TTL) + Entra API-token cache |
| VPC Service | ID | AutoMate.API via cloudflared tunnel |
| Static Assets |
| SvelteKit client-bundle (JS, CSS) |
Cron triggers
Er zijn twee cron-schedules geregistreerd in wrangler.jsonc:
Schedule | Trigger | Actie |
|---|---|---|
| Elke minuut |
|
| Elk uur (minuut 0) |
|
De elke-minuut-trigger doet ook een rollup van de huidige dag zodat het publieke dashboard de dagelijkse uptime-blokken meteen bijwerkt zonder een uur te wachten.
De cron-handler (src/lib/server/scheduled.ts) controleert event.cron en stuurt door naar de juiste functie:
Waarom een postbuild-script nodig is
@sveltejs/adapter-cloudflare v7 schrijft na vite build het volledige worker-bundle naar .svelte-kit/cloudflare-tmp/_worker.js en overschrijft vervolgens het bestand dat in wrangler.jsonc's main-veld staat (src/main.ts). Dat gegenereerde bundle exporteert alleen een fetch-handler — géén scheduled().
Cloudflare Workers roepen cron triggers aan via scheduled(), niet via fetch. Zonder extra stap missen cron triggers hun handler.
Het script scripts/inject-scheduled.mjs wordt uitgevoerd als postbuild-hook en overschrijft src/main.ts met een wrapper die:
de gegenereerde SvelteKit
fetch-handler re-exporteert uit_worker.jseen
scheduled()-handler toevoegt die doorstuurt naarhandleCron
OIDC-authenticatieflow (admin)
De admin-sectie vereist een geldige Azure AD-identiteit. De flow gebruikt de arctic-library voor authorization code + PKCE:
De redirect URI is
{url.origin}/signin-oidc(nietPUBLIC_BASE_URL) zodat lokale dev naarlocalhostterugkeertDe Entra-app registration heeft
{origin}/signin-oidcals toegestane redirect URISessies worden uitsluitend in KV opgeslagen met een TTL van 8 uur
De
id_tokenwordt gedecodeerd zonder signature verification (safe: TLS + client secret authenticeren de token endpoint al)
Entra-app: ac3eb2dc-8631-45a3-b702-e167511070f2 in tenant 8f3d46f0-9151-4904-be93-69420b7d9d61
API-clientverbinding en tokencache
De Worker communiceert met AutoMate.API via client-credentials (machine-to-machine). Het Entra-token wordt gecached in KV om per-request tokenacquisitie te vermijden:
De werkelijke HTTP-aanroep verloopt via env.webapi.fetch(...) met de echte Azure App Service-hostname als URL. Zie StatusPage — Workers VPC en CFTunnel voor de reden achter deze hostname-eis.
Security headers
src/hooks.server.ts voegt op elke response de volgende headers toe:
Header | Waarde |
|---|---|
|
|
|
|
|
|
Custom domain
status.automate365.cloud is geconfigureerd als custom_domain: true in wrangler.jsonc. Wrangler beheert automatisch een proxied CNAME-record in Cloudflare DNS en voorziet het domein van Universal SSL. Bij de eerste deploy met dit record vervangt Wrangler een eventueel bestaand DNS-record (de voormalige Railway-configuratie).