ketl cloud
Arkitektur-spesifikasjon

Fra static export til hybrid SSR + ISR

Hvordan vi flytter ketl.no fra Next.js output: "export" til en hybrid-modell som indekserer 1M+ norske selskaper, med ISR-revalidering på Brregs daglige oppdatering og dynamiske OG-bilder.

Pre-genererte ved build

50 446

paths

Maks paths-kapasitet

1.1M

org.nr + kommuner

Estimert innsats

23 dager

3 prod-blokkerende steg

Hvorfor flytte fra static export?

SEO-skala
Static export kan ikke generere 1M+ org-sider ved build. Vi trenger ISR for å indeksere alle aktive norske selskap fra Brreg.
Dynamiske OG-bilder
@vercel/og krever Edge Runtime. Dette gir per-selskap- unfurls i LinkedIn og X som driver klikk.
Auth i middleware
Verifiser Firebase ID-token før dashboard-render i stedet for klient-side redirect. Færre flicker, bedre TTFB.
ISR for friske data
Brreg oppdaterer daglig, SSB månedlig. ISR med 24t-revalidate matcher uten å re-bygge hele siten.

Rendering-strategi per route-familie

Source of truth: src/lib/seo/rendering-strategi.ts. Hver familie har sin egen Next.js-modus, valgt basert på datafriskhets-krav og total path-kapasitet.

Route-familieStrategiPre-genMaksHosting
/

Forside

STATIC——begge
/data/[kilde]

Datakatalog-side per kilde

SSG4150begge
/apper/[slug]

Analyseapper-side per app

SSG1850begge
/apper/kommuneprofil/[kommunenummer]

Kommuneprofil

ISR

revalidate 24t

30357begge
/org/[orgnr]

Selskapsside per org.nr

ISR

revalidate 24t

50 0001 100 000vercel
/kommune/[kommunenr]

Kommune-SEO-side

ISR

revalidate 24t

357357begge
/api/og/[type]

Dynamisk OG-bilde-generator

EDGE——vercel
/kunnskap/[slug]

Kunnskapsbase-artikler

STATIC——begge
/dashboard/*

Innloggede dashboards

SSR——begge
STATICStatisk — bygd én gang ved deploy
SSGSSG — alle paths bygd ved build via generateStaticParams
ISRISR — pre-genererte + on-demand med revalidate
SSRSSR — server renderer hver request
EDGEEdge — kjører på CDN-noder (Cloudflare/Vercel Edge)

2 familier krever Vercel-spesifikk infra (Edge Runtime / @vercel/og). Hvis vi velger Cloud Run må disse re-implementeres med Cloudflare Workers eller satori-baserte selvkjørte renderere.

Performance-budget

CI håndhever disse via Lighthouse + Web Vitals beacon. Brudd blokkerer merge.

Metrikkp50p90CWV-grense

Largest Contentful Paint

lcp
1800 ms2500 ms2500

Time To First Byte

ttfb
300 ms600 ms800

First Contentful Paint

fcp
1200 ms1800 ms1800

Interaction to Next Paint

inp
100 ms200 ms200

Cumulative Layout Shift

cls
0.05 0.1 0.1

Maks build-tid

10 min

Maks routes

1.2M

Maks route-bundle

200 kB

Maks first-load JS

250 kB

Migrasjonssteg

Rekkefølgen er kritisk: vi kan ikke fjerne static export før hosting-alternativet er grønt.

  1. 1

    Velg hosting — Vercel vs Cloud Run

    hosting~2dblokkerer prod

    Spike: Vercel (null infra, raskt ISR) vs Cloud Run + Next standalone (matcher resten av stacken, EU-kun data). Avgjør basert på data residency-krav fra tidlige enterprise-kunder.

    • Beslutning dokumentert i ADR-011
    • Kostnadsestimat for 10M requests/mnd
    • Data residency-sjekk mot GDPR-krav
  2. 2

    Cloud Run baseline-deploy (hvis valgt)

    hosting~3dblokkerer prod

    Sett opp Artifact Registry, Cloud Run service, Cloud Build trigger. Test med hello-world Next.js standalone image.

    • cloudbuild.yaml commited
    • Deploy til staging fra main-commit
    • Cold-start < 3s på min-instance=0
  3. 3

    Fjern `output: "export"` fra next.config.ts

    config~1d

    Når Cloud Run-baseline er grønn: fjern static-export-config, bytt til default Next output. Tester og build må fortsatt passere.

    • `next build` produserer `.next/` (ikke `out/`)
    • Alle eksisterende routes fortsatt statiske via default
    • Images kan bruke next/image optimizer
  4. 4

    /org/[orgnr] med generateStaticParams for topp 50k

    routes~5d

    Legg til SEO-motor-route. Brreg-proxy med 24t ISR. Pre-generer topp 50k mest søkte org.nr fra Search Console-data eller egne logger.

    • Build-tid under 10 min selv med 50k paths
    • On-demand ISR for resten (1M+ org.nr)
    • JSON-LD Organization per side
    • Canonical URL satt
  5. 5

    /kommune/[kommunenr] med ISR

    routes~3d

    357 kommuner pre-generert, 24t revalidate. Kombinerer SSB KOSTRA + Brreg + kart-overlay.

    • Alle 357 paths indekseres
    • ISR revalidate trigger på SSB-oppdatering (webhook eller poll)
  6. 6

    Dynamisk OG-bilde-generator (/api/og/[type])

    routes~2d

    Edge Runtime med @vercel/og. Type: `selskap` / `app` / `kommune`. Cache-Control: public, max-age=604800, immutable.

    • 1200x630 PNG per type
    • Fonter embedded i edge-bundle
    • Validert mot LinkedIn, X og Slack unfurl
  7. 7

    Flytt auth til Next middleware

    auth~3d

    Verifiser Firebase ID token i middleware før /dashboard/*-SSR. Setter `x-user-id` header for downstream bruk.

    • Middleware kjører kun for matchede routes (matcher-regex)
    • Token-verifisering < 30ms p90
  8. 8

    Ny CI/CD-pipeline med Artifact Registry

    ci-cd~2dblokkerer prod

    GitHub Actions bygger Docker image, pusher til Artifact Registry, trigger Cloud Run deploy på main.

    • Deploy-tid under 10 min totalt
    • Rollback-script dokumentert
    • Preview-deploys for PR-er
  9. 9

    Sanntid performance-monitoring

    observability~2d

    Web Vitals beacon til Firebase Analytics. Cloud Logging for server-side latency. Alert når p90 TTFB > 600ms.

    • Dashboard i GCP viser LCP/TTFB/INP per route
    • Alerts koblet til PagerDuty/Slack

Trenger du norske offentlige data nå?

SEO-motoren over 1M selskaper kommer i Q3. I mellomtiden kan du bruke datakatalogen og MCP-serveren vår direkte.

ketl cloud
DataApperMCPPriser
AI-transparensPersonvernSikkerhet

© 2026 ketl cloud

build c372edd · 2026-05-11 14:18:12 UTC