3n.nl / haven-lab

Een complete Haven-haven op één gaming-pc

Haven is de VNG-standaard voor platformonafhankelijke cloud­hosting van overheidsapplicaties. Dit lab draait de volledige keten thuis: een Haven-compliant Kubernetes-cluster, de Haven+ platformdiensten en daarbovenop Open Zaak — op een pc die 's avonds ook gewoon een spelletje draait.

> tussenstand 10 oktober 2026: Haven 15/15 · Haven+ via Flux · Open Zaak met rollen-demo · haven.3n.nl, alleen binnen het tailnet

> verdieping: de referentie — elke laag en elk component uitgelegd, en vier schaalpaden van één pc tot multi-cloud · welke toepassingen er al op een Haven draaien, per procesdomein · is Haven gelukt? — de markt, de gevestigde leveranciers en de Rijkscloud

architectuur

De architectuur in één plaat

Van onder naar boven: één fysieke machine, daarin zes virtuele machines die samen het cluster vormen, daarop de platformlaag en de toepassingen. Links wordt alles vanuit git beheerd; rechts komt het verkeer binnen door één sluis, Tailscale. Niets staat open op internet.

Architectuurplaat Haven+ thuislab Vier gestapelde lagen: host, cluster, platform, toepassingen. Links git en de HX90, rechts Tailscale als enige toegang. Buiten de pc thuisnet en tailnet GitHub nixos_eigen_hardware1 fork van Haven+ gitops-flux HX90 Cowork + git, kubectl, haven check NUC DNS van het tailnet, Wake-on-LAN Demo-laptop, telefoon *.haven.3n.nl via tailnet Gaming-pc · i7-14700KF · RTX 4070 SUPER · 32 GB · boot van Samsung T7 Windows op de interne NVMe blijft onaangeraakt Tailscale · subnet-router · tag:haven-lab · enige toegang 4 · Toepassingen (Common Ground) Open Zaakzaken, documenten, catalogus Open Notificatiesgebeurtenissen Werkplekrollen-UI op de API's (demo) Open Formulieren · Objectenna de geheugenuitbreiding 3 · Haven+ platformdiensten (VNG-referentie, via Flux) Istio gatewayGateway API · .200 cert-managereigen CA, *.haven.3n.nl Keycloakéén SSO voor alles CloudNative-PGPostgreSQL + PostGIS GarageS3-objectopslag Alloy, Loki, Mimir, Tempo, Grafanalogs, metrics, traces, dashboards Kyverno, Falco, Trivybeleid aan; rest wacht op RAM SOPS/age, Velerogeheimen in git; back-up later Flux, HeadlampGitOps, cluster-UI 2 · Haven-cluster · Kubernetes op Talos Linux · 15/15 checks zone-azone-bzone-c cp1 · control planecp2 · control planecp3 · control plane worker1 · 4 vCPU · 5 GBworker2 · 4 vCPU · 5 GBworker3 · 4 vCPU · 5 GB MetalLB · LB-adressencsi-driver-nfs · RWXmetrics-server 1 · Host · NixOS, declaratief in git Incus · KVM6 VM's, bridge 10.42.0.0/24 NFS-exportReadWriteMany-volumes disko · systemd-bootT7: boot / Incus-pool / NFS autoUpgradehaalt main elke 10 min git pull: push = uitrol
Elke laag wordt vanuit git beheerd: de host via de NixOS-flake (autoUpgrade), het cluster via talhelper-configuratie, het platform via Flux. Verkeer van buiten komt uitsluitend binnen via Tailscale en wordt op laag 3 door de Istio-gateway en cert-manager afgehandeld.

tussenstand · 10 oktober

Wat er nu draait, en wie waar inlogt

De keten staat: de Haven-checker geeft 15 van 15, de Haven+-platformdiensten komen uit git via Flux, en daarbovenop draaien Open Zaak en Open Notificaties met een zaaktypencatalogus, API-clients met autorisaties en demodata — allemaal als desired state: één script, één job, herhaalbaar op een leeg cluster. Eén identiteit (Keycloak) voor alles met een browser; API's op een ondertekend token per toepassing.

Toegangsplaat: wie logt waar in Links vijf soorten gebruikers, rechts de diensten; de lijnen tonen via welk pad ze inloggen: SSO via Keycloak, token of sleutel. Keycloak · één SSO groepen bepalen de rol; realm en accounts uit git keycloak.haven.3n.nl Beheerderplatform, cluster, host · groep beheer Loketmedewerkermeldingen aannemen en afhandelen Behandelaar en beslisseronderzoek, triage, besluit Forensisch onderzoekervorderen, filteren, vrijgeven Toepassing of scriptkoppeling, demodata, notificaties Werkplekwerkplek.haven.3n.nl · mijn zaken, documenten, acties per rol Open Zaak en Open Notificaties · beheercatalogus, autorisaties, abonnementen ZGW-API'szaken, documenten, catalogi, autorisaties · JWT per client Grafanalogs, metrics, traces · iedereen leest, beheer schrijft Headlamp, kubectl, flux, talosctlcluster-UI en CLI's · token of configbestand Host (ssh) en gitssh-sleutel; push naar main = uitrol inloggen bij Keycloak OIDC naar de toepassing JWT met client-id en secret · rol = client token, kubeconfig, ssh-sleutel · alleen beheer
Mensen loggen overal met dezelfde Keycloak-identiteit in; de groep waarin ze zitten bepaalt met welke API-client de werkplek namens hen praat. Toepassingen en scripts gebruiken een ondertekend token per client. Alleen beheer heeft tokens, kubeconfig en ssh.

Wat de demo laat zien: een scheiding die de registratie zelf afdwingt

Een toezichthouder krijgt meldingen van burgers en verzoeken van marktpartijen. Een onderzoek kan vragen om gegevens bij een leverancier te vorderen. Dat materiaal is ruw en bevat ook wat niet relevant is; een forensisch team verzamelt en filtert het, en pas de gefilterde set gaat naar de behandelaar. De vraag is of die scheiding een werkafspraak is of een eigenschap van het systeem. In dit lab is het het laatste.

Gegevensstromen met drie vertrouwenszones Loket en onderzoek werken op zaakvertrouwelijk, forensisch op geheim. De enige stroom van geheim naar zaakvertrouwelijk loopt via filteren en vrijgeven; de behandelaar krijgt een 403 op de vorderingszaak. LOKETtot zaakvertrouwelijk · client loket ONDERZOEKtot zaakvertrouwelijk · client behandeling FORENSISCHtot en met geheim · client forensisch Melder Marktpartij Leverancier P1meldingregistreren P2signaalbeoordelen P5besluiten P3gegevensvorderen P4filteren envrijgeven melding, bewijs verzoek om onderzoek signaal verzoek tot vordering vordering onderzoek ruwe dataset · geheim vrijgegeven bewijsstuk · zaakvertrouwelijk filterverantwoording en vrijgaveverklaring blijven in de zone HTTP 403 Zaken APIDocumenten APICatalogi APIAutorisaties API zaken, statussen, rollen, relaties, audittraildocumenten, vertrouwelijkheid per stukzaaktypen, documenttypenscopes × zaaktype × max. vertrouwelijkheid elk proces leest en schrijft met de client van zijn zone; de Autorisaties API beslist per request en de Zaken API logt wie wat deed Elke andere toepassing op dezelfde API's krijgt dezelfde 403: de scheiding zit in de registratie, niet in de UI.
De enige stroom die van geheim naar zaakvertrouwelijk oversteekt is P4: het forensisch team maakt een nieuw document in de onderzoekszaak, met bron, ontvangstdatum en auteur, en legt de filterkeuze vast in de vorderingszaak. De behandelaar ziet dat de vorderingszaak bestaat, maar kan hem niet openen.

Wat we onderweg leerden

lagen

Waarom vier lagen

Haven schrijft een configuratie van Kubernetes voor; de Haven Compliancy Checker toetst die met vijftien verplichte checks. Drie daarvan eisen een echte hoogbeschikbare opzet: minstens drie control-plane-nodes, drie workers en meerdere beschikbaarheidszones. Op één fysieke machine haal je dat alleen met virtuele machines. Vandaar de scheiding tussen host en cluster.

1 · Host

NixOS op een externe USB-SSD. De hele machine staat beschreven in een flake; een push naar main is de uitrol. Incus draait de VM's, de host exporteert NFS en is de Tailscale-subnet-router.

NixOS 26.05 · disko · Incus · nfs · Tailscale

2 · Haven-cluster

Zes Talos Linux-VM's: een onveranderlijk besturingssysteem zonder SSH, alleen een API. Drie zones via node-labels, de API achter één virtueel adres. MetalLB, nfs-csi en metrics-server vullen aan wat een cloud normaal levert.

Talos 1.13 · talhelper · Flannel · MetalLB · csi-driver-nfs

3 · Haven+ platform

De referentie-PaaS van VNG, gedeployed met Flux vanuit een fork van gitops-flux. Identiteit, certificaten, databases, observability en back-up zijn daarmee gestandaardiseerd op OpenID Connect, OpenTelemetry en de Gateway API.

Istio · cert-manager · Keycloak · CNPG · Loki/Mimir/Tempo/Grafana · Velero

4 · Toepassingen

Common Ground-componenten als tenants op het platform. Open Zaak als zaakregister, Open Notificaties voor gebeurtenissen, een kleine werkplek als rollen-UI. De demo-casus: een melding die via een onderzoek uitmondt in een beoordeling, met een forensische stap ertussen.

Open Zaak · Open Notificaties · Werkplek · Open Formulieren (later)

rollen en gereedschap

Wie doet wat, met welk gereedschap

In een echte overheidsorganisatie liggen deze rollen bij verschillende teams en leveranciers. In het lab vervult één persoon ze allemaal, maar de scheiding wordt wél afgedwongen: elke rol heeft zijn eigen toegangspad, en Keycloak kent de rollen die de toepassingen gebruiken.

RolVerantwoordelijk voorGereedschapToegang
Infrabeheerderhost en VM's De fysieke machine, het besturingssysteem, de virtualisatie, opslag en het netwerk. Capaciteit en stroom.
  • git + Claude Cowork op de HX90
  • NixOS-flake, disko, nixos-rebuild
  • incus voor de VM's
  • Tailscale-console (ACL, routes)
ssh met sleutel naar de host; push naar main
ClusterbeheerderKubernetes De Talos-nodes, Kubernetes-versie, de basislaag, upgrades en de Haven-compliance.
  • talosctl, talhelper (configs in git, geheimen met sops)
  • kubectl, helmfile
  • Haven CLI: haven check
  • Headlamp (cluster-UI uit Haven+)
Talos-API en kube-API alleen via het tailnet; kubeconfig en talosconfig uit sops
PlatformbeheerderHaven+ De platformdiensten: identiteit, certificaten, databases, observability, beleid, back-up. Onboarding van tenants.
  • Flux (flux CLI, fork van gitops-flux)
  • Keycloak-beheer, Grafana
  • Sealed Secrets, Velero
  • Kyverno-beleid, Trivy-rapporten
Git-fork (push = uitrol); Keycloak-realm master
Applicatiebeheerderfunctioneel beheer Open Zaak De zaaktypencatalogus, autorisaties tussen componenten, notificatie-abonnementen, formulieren.
  • Open Zaak-beheerinterface (ZTC, autorisaties)
  • Open Notificaties-beheer
  • Open Formulieren-ontwerper
Browser via tailnet; Keycloak-groep beheer → superuser in Open Zaak
Loket, behandelaar, forensisch, beslissereindgebruikers Meldingen aannemen, onderzoeken, gegevens vorderen en filteren, besluiten — elk met alleen de zaken en documenten die bij de rol horen.
  • Werkplek: rollen-UI op de ZGW-API's
  • Open Zaak-API's achter de Istio-gateway
Browser; Keycloak-groep per rol, elke groep een eigen API-client met autorisaties
Melderburger of collega Een melding doen en de status volgen.
  • Open Formulieren
Browser; in het lab via gedeelde tailnet-node, in productie via DigiD/eHerkenning
ToezichtCISO, auditor Aantoonbaarheid: voldoet het cluster aan Haven, is het veilig geconfigureerd, wat gebeurt er op het platform.
  • haven check inclusief CNCF-conformance
  • kube-bench (CIS), Kubescape
  • Grafana, Loki, Falco-meldingen
  • Trivy-kwetsbaarheidsrapporten
Dashboards via de gateway, SSO; audittrail per zaak in de Zaken API

demo-casus

Van melding naar beoordeling

Een toezichthouder die meldingen van burgers en verzoeken van marktpartijen verwerkt. Alles loopt over de standaard-API's van Common Ground, dus elk onderdeel is vervangbaar — en de scheiding tussen forensisch werk en zaakbehandeling wordt door de registratie zelf afgedwongen.

  1. Melding Een burger meldt; het loket registreert een zaak Consumentenmelding met het bewijs als document, adviseert of verwijst door, en legt de melding vast als signaal. Meerdere meldingen over dezelfde partij worden samen een signaal.
  2. Onderzoek Een zaak Signaalonderzoek ontstaat met de meldingen eraan gekoppeld. De behandelaar doet de triage en vraagt het forensisch team om gegevens bij een leverancier te vorderen — zelf vordert de behandelaar niet.
  3. Vordering Het forensisch team opent een zaak Vordering op het niveau geheim, registreert de ruwe dataset en filtert die op relevantie en rechtmatigheid. De behandelaar die de vorderingszaak probeert te openen krijgt van de API een 403.
  4. Vrijgave De gefilterde set wordt als vrijgegeven bewijsstuk aan het onderzoek gehangen, met bron, ontvangstdatum en een vrijgaveverklaring. De behandelaar ziet één nieuw document en de audittrail; de ruwe data blijft waar hij was.
  5. Beoordeling De beslisser legt het resultaat vast en sluit het onderzoek; de archiefnominatie komt uit de selectielijst.

compliance

Wat de Haven-checker toetst

De checker is het enige verplichte onderdeel van Haven. Vijftien checks, waarvan de categorie "Haven+" er drie telt. Zo haalt dit lab ze.