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.
Huidige functionaliteit
Identiek in beide variantenContactPortaal 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.
ContactPortaal as a Service
Door ons gehost binnen de EU. Standaardconfiguratie — direct te gebruiken.
In uw eigen Azure-tenant
Dezelfde architectuur, gehost binnen uw eigen Microsoft Azure-abonnement. Volledig onder uw beheer.
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)
- 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.
- 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)
- 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.
- 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
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.