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.