Onze technische infrastructuur

Op welke fundering ContactPortaal is gebouwd

Een transparant overzicht van de architectuur — en hoe diezelfde architectuur eruit ziet wanneer u ContactPortaal liever volledig binnen uw eigen Microsoft Azure-omgeving draait. Bedoeld voor opdrachtgevers, inkoop en IT-afdelingen die het platform evalueren.

Gehost binnen de EUAVG / GDPR-conformSaaS of on-premise

Huidige functionaliteit

Identiek in beide varianten

ContactPortaal is een multi-tenant SaaS voor omgevingsmanagement bij infrastructuur- en waterprojecten. Alle modules onder één dak — geen losse tools, geen losse logins.

  • Stakeholderregister met contactpersonen, contactmomenten, GIS-locatie en kracht/belang-matrix (1–5 schaal).
  • Issues & klachten met GIS-locatie, statusworkflow, deadlines, escalaties en KPI-dashboard (open klachten boven KPI, openstaande issues per impact).
  • Klanteneisen (customer requirements) — van intake tot oplevering, met aanvraag-, beoordelings- en goedkeuringsstatus.
  • Documentenbeheer en nieuwsbrieven naar deelnemers; versionering en bewaartermijn per documenttype.
  • Publiek bewonersportal — burgers melden klachten, stellen vragen en zien projectnieuws via een eigen account.
  • Taken & contactmomenten met audit-trail; per project gescheiden.
  • Optionele tweezijdige synchronisatie met Relatics (RWS-standaard); standaard uitgeschakeld, per project te activeren.
  • Volledig meertalig (Nederlands en Engels); per gebruiker instelbaar.
  • Responsive op desktop, tablet en mobiel; geen aparte app nodig.
  • Tweefactor-authenticatie (TOTP) per account in te schakelen; voor beheerders aanbevolen.

Twee deploymentvarianten, identieke architectuur

Elke laag heeft een 1-op-1 equivalent in uw eigen Azure-tenant. De codebase blijft ongewijzigd.

Cloud Stack

ContactPortaal as a Service

Door ons gehost binnen de EU. Standaardconfiguratie — direct te gebruiken.

Frontend
Backend
EindgebruikerBezoeker / medewerker
Edge & beveiligingVercel Edge & WAF
Applicatie-runtimeVercel Functions (Next.js)
Identiteit & SSOSupabase Auth (TOTP)
Database (Postgres)Supabase PostgreSQL
BestandsopslagSupabase Storage
Kaarten & GISEsri ArcGIS
Transactionele e-mailResend
Externe koppelingRelatics
Stippellijn = optionele integratie
On-Premise Stack

In uw eigen Azure-tenant

Dezelfde architectuur, gehost binnen uw eigen Microsoft Azure-abonnement. Volledig onder uw beheer.

Frontend
Backend
EindgebruikerBezoeker / medewerker
Edge & beveiligingAzure Front Door + WAF
Applicatie-runtimeAzure Container Apps
Identiteit & SSOMicrosoft Entra ID (SSO)
Database (Postgres)Azure Database for PostgreSQL
BestandsopslagAzure Blob Storage
Kaarten & GISEsri ArcGIS
Transactionele e-mailAzure Communication Services (Email)
Externe koppelingRelatics
Stippellijn = optionele integratie

Datalocatie & hosting

Alle persoonsgegevens en projectinhoud worden binnen de Europese Unie opgeslagen en verwerkt.

  • Persistente data (stakeholders, klachten, issues, documenten) staat in Supabase PostgreSQL in Frankfurt (EU).
  • De webapplicatie draait op Vercel Fluid Compute in EU-regio's; verzoeken worden niet naar buiten de EU geleid.
  • Kaartbasismateriaal komt van Esri/OpenStreetMap. Locaties van stakeholders en klachten blijven in onze eigen database — ze worden niet bij Esri opgeslagen.
  • Synchronisatie met Relatics gebeurt alleen wanneer de klant deze integratie zelf activeert; standaard staat deze uit.

BIO / overheidscompliance

Mapping op de Baseline Informatiebeveiliging Overheid (BIO). Eisen die uit de codebase volgen (SSD, Privacy) zijn in beide deploymentvarianten identiek. Authenticatie, infrastructuur en leveranciersbeheer verschillen — die staan hieronder per variant. Verificatiebewijs (testen, internet.nl-score, SOC 2-rapporten, pentest-rapport) op aanvraag beschikbaar.

Veilige software-ontwikkeling (SSD) — codebase-eigenschap

Identiek in beide varianten
  • SSD-1, SSD-31 — applicatie draait op een managed gehard PaaS-platform; stack formeel gespecificeerd in package.json met pinned versies.
  • SSD-2, U.06 — gegevens in PostgreSQL met versleuteling at rest (AES-256). Bijzondere persoonsgegevens worden alleen verzameld waar functioneel noodzakelijk.
  • SSD-3 — actief onderhouden externe componenten; automatische updates via Renovate; npm audit + SCA-scan in CI op elke build.
  • SSD-4 — alle verkeer TLS 1.2+ met HSTS-preload; DNSSEC op productiedomein. Internet.nl-score: gericht op 100%.
  • SSD-24, SSD-33 — Content-Security-Policy, X-Frame-Options, Referrer-Policy, Permissions-Policy en Strict-Transport-Security actief; serverheaders gemaskeerd.
  • SSD-26 — alleen GET/POST/PATCH/PUT/DELETE; TRACE en OPTIONS-onthulling geblokkeerd op edge-niveau.
  • SSD-32 — geen XML-parser in request-pad; alle API-endpoints JSON.
  • SSD-19, SSD-20, SSD-22 — invoervalidatie via Zod-schema's per server action; output-encoding via React (automatische XSS-escape); geen dangerouslySetInnerHTML.
  • SSD-21 — alle queries via Supabase JS client (prepared statements); geen string-concatenatie in SQL.
  • SSD-27, SSD-28 — productie-foutmeldingen zonder stack trace; client-bundles bevatten geen broncommentaar (Turbopack-build).
  • SSD-29 — directory listing onmogelijk; geen filesystem-exposure in het serverless platform.
  • SSD-23 — geen dynamische file includes; module-resolutie is static-imported.
  • SSD-17 — beheerinterface (/admin) gescheiden van eindgebruikersinterface; alleen platform_admin-rol heeft toegang.
  • SSD-15 — strikte scheiding presentatie (React Server Components) / applicatie (Server Actions) / data (Postgres + RLS).
  • SSD-30, 12.4.2.1/.2 — applicatie- en accesslog naar managed log-platform; bewaartermijn 30 dagen standaard, configureerbaar; toegang gelogd op gebruikersniveau.

Privacy (AVG / SSD Privacy-supplement) — codebase-eigenschap

Identiek in beide varianten
  • SSD P.01 — gegevens alleen verzameld waar functioneel noodzakelijk; analytics-cookies met expliciete opt-in (cookie-consent banner).
  • SSD P.02 — betrokkene kan via het bewonersportal eigen gegevens inzien, corrigeren en exporteren; verwijderingsverzoeken via /portal/profile.
  • SSD P.03 — publieke privacy policy, cookieverklaring en disclaimer (/privacy, /cookies, /disclaimer); waarschuwing bij toegang tot bijzondere persoonsgegevens.
  • SSD P.05 — audit-trail logt per gebruiker welke gegevens zijn opgevraagd, ingezien of gewijzigd; doorzoekbaar via /admin/audit.
  • SSD P.06 — DPIA-template beschikbaar; bewaartermijn per record-type vastgelegd (klachten 5 jaar, contactmomenten 3 jaar, configureerbaar).
  • SSD P.07 — KPI-dashboards tonen geaggregeerde cijfers (per impact-klasse, status, etc.); geen individuele identificatie nodig voor sturing.
  • SSD P.08 — projecten end-to-end gescheiden: aparte JWT-claims, RLS-policy, bestandsopslag-prefix en (optioneel) eigen domeinnaam per project_id.
  • SSD P.09 — bijzondere velden onzichtbaar voor staff zonder expliciet recht; database-level encryptie + applicatie-level masking; toegang gelogd.
  • APO P.01 — geen productiedata in test/preview-omgevingen; demo-dataset is volledig fictief (zie supabase/migrations/...seed_demo_dataset.sql).

Authenticatie & toegangsbeveiliging (SSD-5..14, TBV)

Cloud SaaS
  • SSD-5 — Supabase Auth als centrale authenticatievoorziening; wachtwoord-login en magic-link standaard.
  • SSD-7, U.10, TBV P.01 — rolgebaseerde rechten: member / staff / admin / superuser / platform_admin via membership-tabel per project.
  • SSD-8 — autorisatie afgedwongen door PostgreSQL Row-Level Security (RLS) op rijniveau; database weigert zelf onbevoegde queries.
  • SSD-9 — geslaagde én mislukte inlogpogingen geregistreerd in Supabase auth.audit_log_entries.
  • SSD-12, SSD-14, U.05 — onvoorspelbare JWT (256-bit) met korte levensduur (1u); auto-refresh; uitlogtoets beëindigt sessie server-side.
  • SSD-13 — JWT's HMAC-getekend (HS256); audit-trail per write-actie met gebruiker, tijd en oude/nieuwe waarde.
  • Verzwaring SSD-5 — TOTP-MFA per account inschakelbaar (zie /profile/security); door beheerder af te dwingen.
  • TBV P.02, TBV P.03 — toegang op rol- en taakniveau; bewonersportal heeft een aparte rol-class met minimale rechten.
  • TBV P.07 — geo-IP-restrictie via Vercel WAF op aanvraag instelbaar.
  • TBV P.08 — bij contractbeëindiging worden accounts gedeactiveerd, sessies ingetrokken; data binnen 30 dagen verwijderd.
On-Premise Azure
  • SSD-5 — Microsoft Entra ID (Azure AD) als centrale authenticatievoorziening; SSO via OIDC/SAML met uw eigen tenant.
  • SSD-7, U.10, TBV P.01 — rolgebaseerde rechten: Entra ID-groepen mappen op applicatierollen (member/staff/admin/superuser/platform_admin) per project.
  • SSD-8 — zelfde RLS-pattern: PostgreSQL Row-Level Security op Azure Database for PostgreSQL Flexible Server.
  • SSD-9 — Entra ID sign-in logs (geslaagd + mislukt) in Azure Monitor; behoud volgens uw eigen log-retentiebeleid.
  • SSD-12, SSD-14, U.05 — JWT uitgegeven door Entra ID; levensduur en refresh configureerbaar via Conditional Access policies.
  • SSD-13 — Entra-getekende JWT (RS256); applicatie audit-trail per write-actie blijft bestaan.
  • Verzwaring SSD-5 — Entra MFA (TOTP / FIDO2 / Microsoft Authenticator), afdwingbaar via Conditional Access.
  • TBV P.02, TBV P.03 — zelfde rol- en taakmodel in applicatie; Entra-groepen verzorgen de bredere toegangsbeperking.
  • TBV P.07 — geo-restrictie via Entra Conditional Access location policies.
  • TBV P.08 — Entra account-disable triggert sessie-intrekking via token-revocation; verloopt volgens uw eigen offboarding-proces.

Infrastructuur & clouddiensten (Thema Clouddiensten)

Cloud SaaS
  • B.01 — verwerking binnen de EU (Frankfurt). Geen doorgifte buiten EU.
  • B.04 — managed PaaS (Vercel + Supabase) gekozen op basis van EU-locatie, SOC 2/ISO 27001-certificering en open data-export.
  • B.03 — exit: standaard PostgreSQL-dump + S3-compatible bestandsexport + JSON-export van metadata binnen 5 werkdagen.
  • U.03, B.08 — Supabase Point-in-Time Recovery (7 dagen standaard, uitbreidbaar tot 30); Vercel global edge met automatische failover.
  • U.05, U.11, B.05 — AES-256 at rest; TLS 1.3 in transit; sleutels door Supabase/AWS KMS beheerd (EU-region).
  • U.07, U.17 — multi-tenancy via project_id + RLS; geen shared data tussen tenants.
  • U.09 — managed platform: geen filesystem-write voor aangeleverde bestanden; uploads via signed URL's.
  • U.10 — alle endpoints achter Vercel WAF; rate-limiting; bot-detectie via Vercel BotID.
  • U.12, 13.1.2.4 — alle externe interfaces (API, webhook) authenticated; allowlist op CORS-origins per project.
  • U.15, 12.4.1.x — Vercel Logs + Supabase log-explorer; doorzending naar opdrachtgever-SIEM mogelijk via syslog/HTTP.
On-Premise Azure
  • B.01 — alles binnen uw eigen Azure-tenant; regio door u gekozen (West Europe / North Europe).
  • B.04 — Azure PaaS-componenten (Container Apps, PostgreSQL Flexible Server, Blob Storage, Front Door); alle SOC 2/ISO 27001 onder uw Microsoft EA.
  • B.03 — geen exit nodig van ons: u behoudt eigendom van database, opslag en infra. Standaard PostgreSQL-dump bij decommissioning.
  • U.03, B.08 — Azure Database for PostgreSQL Flexible Server: PITR tot 35 dagen, zone-redundant HA optioneel. Container Apps multi-replica.
  • U.05, U.11, B.05 — Azure Storage Service Encryption (256-bit AES); TLS 1.3 in transit; Azure Key Vault voor sleutelbeheer (BYOK/HSM optioneel).
  • U.07, U.17 — multi-tenancy via project_id + RLS; geen shared data tussen tenants (zelfde pattern als cloud-variant).
  • U.09 — Microsoft Defender for Cloud aanbevolen; Defender for Storage scant uploads.
  • U.10 — Azure Front Door + WAF; Private Endpoints voor database/storage; toegang via private link.
  • U.12, 13.1.2.4 — alle externe endpoints achter Front Door WAF; private endpoints voor backend-componenten.
  • U.15, 12.4.1.x — Azure Monitor + Log Analytics + (optioneel) Microsoft Sentinel als SIEM. Logs in uw eigen workspace.

Leveranciersbeheer & wijzigingsbeheer

Cloud SaaS
  • B.02, 15.1.1.1 — verwerkersovereenkomsten met sub-processors (Supabase, Vercel, Resend) beschikbaar; jaarlijkse actualisering.
  • U.01 — Next.js 16 + React 19 + Supabase: alle componenten actief onderhouden; ondersteunde versies van leveranciers.
  • C.02, 12.1.2.1, 14.2.2.1 — Git-flow met PR-review, semantische versionering, CHANGELOG per release; staging-omgeving voor acceptatie.
  • C.03, 12.6.1.1 — automatische dependency-updates via Renovate; kritieke security-patches binnen 24u, overige binnen 7 dagen; managed platform-laag patcht zelf.
  • C.04 — jaarlijkse pentest door erkende partij; doorlopende SCA-scan in CI; rapport onder NDA.
  • C.05 — security-incidenten gemeld binnen 24u; kwartaalrapportage open bevindingen.
  • SOC 2 Type II en ISO 27001 op platform-laag (Vercel, Supabase) via sub-processors; eigen jaarlijkse pentest op de applicatie.
On-Premise Azure
  • B.02, 15.1.1.1 — uw bestaande Microsoft EA dekt Azure; wij sluiten een aparte onderhouds- en supportovereenkomst voor de applicatie.
  • U.01 — applicatie-componenten (Next.js 16, Supabase JS, ArcGIS) actief door ons onderhouden.
  • C.02, 12.1.2.1, 14.2.2.1 — releases via uw eigen CI/CD-pijplijn (Azure DevOps / GitHub Actions); wij leveren signed release-artifacts + CHANGELOG.
  • C.03, 12.6.1.1 — wij leveren security-patches binnen 24u (kritiek) / 7 dagen; uw IT roleert ze uit in Container Apps. Azure-laag patcht automatisch.
  • C.04 — jaarlijkse pentest op de applicatie; uw eigen pentest dekt de Azure-infra.
  • C.05 — wij rapporteren applicatie-incidenten en open vulnerabilities; uw IT monitort de infra.
  • Microsoft EA dekt SOC 2 / ISO 27001 / FedRAMP / NEN 7510 voor de Azure-laag; wij leveren applicatie-security-assessment + jaarlijks pentest-rapport.

Dienstverlening & SLA

In de cloud-variant draagt ContactPortaal operationele en applicatie-verantwoordelijkheid. In on-premise wordt uw IT-afdeling operator (L1/L2) en blijven wij applicatie-leverancier (L3) en patch-eigenaar.

Cloud SaaS — wij hosten en exploiteren
  • Uptime-doel: 99,9% per kalendermaand (≈ 43 min downtime/maand). Onderliggende SLA's: Vercel 99,99%, Supabase 99,9%.
  • Onderhoud buiten kantooruren (NL); 48u vooraf aangekondigd, behalve kritieke security-patches (best-effort melding).
  • Incident response — Kritiek: ≤ 1u. Hoog: ≤ 4u. Normaal: ≤ 1 werkdag. 24/7 voor kritiek op aanvraag.
  • Support via ticket (e-mail) en telefoon op kantooruren (ma–vr 09:00–17:00); calamiteitenlijn voor kritieke incidenten.
  • Point-in-time recovery (7 dagen standaard, uitbreidbaar tot 30); dagelijkse off-site back-up; RPO ≤ 1u, RTO ≤ 4u.
  • Disaster recovery: Supabase multi-AZ in Frankfurt; jaarlijkse restore-oefening met bewijsstuk.
  • Patch-management: kritieke security-patches binnen 24u, overige binnen 7 dagen; managed platform-laag update automatisch.
  • Kwartaalrapportage: uptime, incident-overzicht, gebruiksstatistieken en open security-bevindingen.
  • Bij contractbeëindiging: volledige PostgreSQL-dump + bestandsexport binnen 5 werkdagen; verwijdering binnen 30 dagen met bewijsstuk.
On-Premise Azure — uw IT exploiteert, wij onderhouden
  • Uptime-doel afhankelijk van uw Azure-configuratie: met zone-redundante PostgreSQL Flexible Server + Container Apps multi-replica realiseerbaar tot 99,95%–99,99%.
  • Applicatie-releases gepland in overleg; wij leveren signed release-artifacts, uw CI/CD-pijplijn voert deployment uit.
  • Applicatie-bugs — Kritiek: ≤ 4u. Hoog: ≤ 1 werkdag. Normaal: ≤ 5 werkdagen. Infra-incidenten vallen onder uw eigen IT-SLA.
  • L3 applicatie-support per ticket; kantooruren NL (ma–vr 09:00–17:00); calamiteitenlijn op aanvraag. L1/L2 verzorgt uw eigen servicedesk.
  • Backups vallen onder uw IT: Azure Database for PostgreSQL Flexible Server biedt PITR tot 35 dagen + GRS-backup via Azure Backup vault.
  • Disaster recovery: Azure paired regions (bv. West Europe ↔ North Europe); failover-strategie door u te configureren.
  • Wij leveren applicatie-updates (security-patches kritiek binnen 24u, overige binnen 7d); uw CI/CD past ze toe. Managed Azure-laag patcht zelf.
  • Wij rapporteren applicatie-changes, releases en open vulnerabilities; uw IT levert operational reporting (uptime, capacity, incidenten).
  • Geen data-overdracht bij beëindiging — u behoudt eigendom van database, opslag en infra. Wij stoppen enkel met applicatie-onderhoud.

Verwerkersovereenkomst & sub-processors

In beide varianten sluit u als opdrachtgever een verwerkersovereenkomst (AVG art. 28) met ons. De rol van sub-verwerkers en de verwerkingslocatie verschillen echter wezenlijk.

Cloud SaaS — wij zijn verwerker, vier sub-processors
  • Wij zijn verwerker (AVG art. 28); u bent verwerkingsverantwoordelijke.
  • Supabase Inc. — database, auth, storage. Verwerking binnen EU (Frankfurt). SOC 2 Type II + ISO 27001. DPA via supabase.com/legal/dpa.
  • Vercel Inc. — applicatie-runtime, edge en WAF. Verwerking binnen EU. SOC 2 Type II + ISO 27001. DPA via vercel.com/legal/dpa.
  • Resend — uitsluitend transactionele e-mail (inlog- en notificatiemails). EU-routing. DPA op aanvraag.
  • Esri (ArcGIS) — alleen kaartbasismateriaal (tegels). Locatie-coördinaten blijven in onze database en worden niet aan Esri doorgegeven.
  • Geen doorgifte buiten de EU in standaardconfiguratie.
  • Wijziging van sub-processors vooraf gemeld; bezwaartermijn 30 dagen.
  • Auditrecht: jaarlijkse ISAE 3402 / SOC 2-rapporten op aanvraag onder NDA.
  • Datalek-meldplicht: incidenten binnen 24u gemeld, root cause + herstelmaatregelen binnen 5 werkdagen (AVG-termijn 72u).
  • Bij beëindiging: data binnen 30 dagen geëxporteerd en daarna onomkeerbaar verwijderd; verwijderingsverklaring op aanvraag.
On-Premise Azure — u bent verwerker, wij hebben enkel onderhoudstoegang
  • U bent zelf verwerkingsverantwoordelijke én (technisch) verwerker. Wij zijn alleen verwerker voor onderhouds- en supporttoegang.
  • Microsoft (Azure) is sub-processor onder uw eigen Microsoft EA — niet onder onze overeenkomst. DPA tussen u en Microsoft van toepassing.
  • Esri (ArcGIS) — sub-processor voor kaartbasismateriaal. Locatie-coördinaten blijven in uw eigen database.
  • Relatics (optioneel): u sluit zelf een DPA met Relatics; wij faciliteren alleen de koppeling.
  • Verwerking volledig binnen uw eigen Azure-tenant (regio door u gekozen).
  • Onze toegang voor support/onderhoud is beperkt, geautoriseerd via uw Entra ID en gelogd in Azure Monitor.
  • Wij voegen geen sub-processors toe zonder uw expliciete toestemming.
  • Auditrecht op onze processen volledig bij u; alle access-logs zichtbaar in uw eigen Azure-omgeving.
  • Datalek-melding van applicatie-bevindingen binnen 24u; infra-incidenten lopen via uw eigen IT-proces.
  • Geen data-overdracht bij beëindiging — u behoudt alle data; wij houden geen kopie.

Geen vendor lock-in

Uw data staat in een standaard PostgreSQL-database en is op elk moment volledig exporteerbaar. Wilt u ContactPortaal volledig binnen uw eigen IT-omgeving draaien? Dan deployen we dezelfde codebase op Microsoft Azure met PostgreSQL Flexible Server, Entra ID voor single sign-on en Container Apps voor de runtime — zie de On-Premise Stack hierboven. De Relatics-koppeling is in beide varianten opt-in.

Pagina bijgewerkt: mei 2026.