Skip to main content

Beheerbeleid, monitoring, backup/restore en operatie

21.1 Doel en scope

Dit hoofdstuk beschrijft de technische operationele inrichting van OefenHub. Het hoofdstuk legt vast hoe de applicatie beheerd, gemonitord, geback-upt, hersteld, uitgerold en operationeel bewaakt wordt. De uitwerking hoort bij het Technisch Ontwerp en beschrijft geen nieuwe functionele eisen voor eindgebruikers.

De operationele baseline sluit aan op de gekozen middel-zware modulaire monoliet:

  • één deploybare .NET/Blazor-applicatie;
  • één relationele database;
  • één applicatieconnectionstring in de eerste baseline;
  • meerdere moduleprojecten met eigen DbContext en schema waar zij persistente data bezitten;
  • TickerQ voor geplande en retrybare achtergrondverwerking;
  • technische oefenmodules als afzonderlijke moduleprojecten;
  • geen aparte basisprojecten voor Audit, Security, Workflows of centrale ReadModels.

Operationeel beheer moet de modulegrenzen respecteren. Monitoring, logging, backup, restore en incidentanalyse mogen domeinoverstijgend inzicht bieden, maar mogen geen tweede functionele bron van waarheid worden naast de domeinmodules en database-informatie.

21.2 Afbakening ten opzichte van andere hoofdstukken binnen het Technisch Ontwerp

OnderwerpPrimaire plek binnen Technisch OntwerpRol van dit hoofdstuk
Solution- en projectopbouw02-architectuuroverzicht-en-solution-opbouwOperationele gevolgen voor deployment, monitoring en beheer
Projectstructuur en dependency-richting03-applicatielagen-projectstructuur-en-dependency-richtingBeheerbaarheid van modulegrenzen en runtimeconfiguratie
Identity, login en provisioning04-identiteit-authenticatie-en-rolcontextOperationele controle op providerkoppeling, loginfouten en provisioningincidenten
Autorisatie en contextcontrole05-autorisatie-policies-en-server-side-contextcontroleMonitoring van access denied, verdachte toegangspogingen en beheerherstel
Database, migrations en seeddata07-databaseontwerp-migraties-seeddata-en-constraintsBackup/restore, migratievolgorde, rollback en operationele databasechecks
TickerQ en background jobs18-background-jobs-tickerq-en-periodieke-verwerkingOperationeel beheer, interne dashboardtoegang, failed jobs en jobherstel
Logging en foutafhandeling19-logging-audit-securitylogging-en-technische-foutafhandelingLogretentie, monitoring, incidentanalyse en operationele escalatie
Security infrastructuur20-security-infrastructuur-secrets-en-omgevingenOperationeel beheer van secrets, headers, rate limiting, omgevingen en interne tooling
Teststrategie23-teststrategie-acceptatieherleidbaarheid-en-kwaliteitsgrenzenSmoke tests, releasechecks, restoretests en operationele kwaliteitsgrenzen
Privacy en retentie25-privacy-retentie-anonimisering-en-gegevensbeschermingOperationele borging van bewaartermijnen, exports, logs en anonimisering

Dit hoofdstuk beschrijft operationele afspraken. Wanneer tijdens beheer blijkt dat een functionele regel ontbreekt of anders moet werken, wordt die wijziging niet alleen hier aangepast maar ook beoordeeld op impact voor Functioneel Ontwerp, Software Requirements Specification, database-informatie, schermdocumentatie en usecases.

21.3 Operationele uitgangspunten

UitgangspuntTechnische betekenis
Beheer is veilig standaardgedragInterne dashboards, jobbeheer, logs en technische beheeracties zijn nooit publiek toegankelijk.
Observability is verplichtIedere relevante request-, workflow-, job- en foutstroom moet herleidbaar zijn met correlation-id's.
Backup is pas bruikbaar na restoretestEen backupstrategie is niet compleet zonder periodiek bewezen herstel.
Migrations zijn onderdeel van releasebeheerDatabasewijzigingen worden niet los of handmatig buiten releasecontrole uitgevoerd, behalve bij expliciete incidentprocedure.
Geen stille half-afgeronde beheeractiesFailed jobs, mislukte workflows en migratiefouten moeten zichtbaar, herleidbaar en herstelbaar zijn.
Geen persoonsgegevens in technische logsOperationele logs bevatten identifiers en context, maar geen wachtwoorden, tokens, antwoorden, volledige payloads of onnodige persoonsgegevens.
Beheeracties blijven auditbaar in het eigenaardomeinDomeinspecifieke beheer- en historiegegevens blijven bij het domein dat eigenaar is van de bronmutatie.
Operationele tooling volgt autorisatieAlleen bevoegde beheerders of technisch beheer krijgen toegang tot interne dashboards en herstelacties.

21.4 Omgevingen en operationele scheiding

OefenHub werkt minimaal met gescheiden omgevingen voor lokale ontwikkeling, test/acceptatie en productie. Iedere omgeving heeft eigen configuratie, secrets, identity-providerconfiguratie, database, TickerQ-persistence en operationele logging.

OmgevingDoelBelangrijke regels
DevelopmentLokale ontwikkeling en moduleontwikkelingMag ontwikkelseeddata bevatten. Mag geen productiedata gebruiken.
TestTechnische integratietests en CI-validatieWegwerpbaar. Database mag automatisch worden opgebouwd en verwijderd.
AcceptanceAcceptatie, smoke tests en releasevalidatieBenadert productieconfiguratie. Geen echte leerling-/gebruikersdata tenzij expliciet toegestaan en geanonimiseerd.
ProductionWerkelijke applicatieomgevingStrikte secrets, backup, monitoring, logging, rate limiting, interne dashboardafscherming en change control.

Configuratieverschillen tussen omgevingen worden expliciet beheerd via environment variables voor niet-geheime configuratie, secretbestanden, Docker Compose secrets, Docker/Portainer Swarm secrets wanneer Swarm wordt gebruikt, of omgevingseigen configuratiebronnen. Gevoelige waarden staan niet in broncode, containerimages, Dockerfiles, appsettings in de repository of gedeelde documentatie.

De V1.0-secretbaseline volgt het huidige inzicht dat productie initieel in een Dockeromgeving live gaat. Daarom is file-based secretbeheer buiten repository en image de operationele voorkeur. De exacte route blijft afhankelijk van de gekozen Docker-/Portainer-modus; wanneer die route bij implementatie anders uitpakt, wordt de veiligste gelijkwaardige file-based oplossing gekozen of wordt een nieuw Technisch Ontwerp-besluit gevraagd.

21.4.1 Minimale omgevingconfiguratie

ConfiguratiegebiedVoorbeeldenOperationele controle
Databaseconnectionstring, command timeout, migrationmodusApplicatie start niet zonder geldige configuratie.
Identity providerauthority, client-id, callback, issuer, audienceSmoke test op login/provisioningflow.
Cookie/securitycookie flags, SameSite, secure policy, HSTSVerificatie in security smoke tests.
TickerQpersistence, schema, dashboardbeschikbaarheid, retryinstellingenJobdashboard intern bereikbaar en niet publiek.
Loggingsink, niveau, retentie, correlation, maskingTest op correlation-id en geen gevoelige logging.
PDF/exportOefenHub:Reporting:TempExportPath, maximale bestandsgrootte, cleanuptermijnLocatie buiten webroot, standaardretentie 24 uur, cleanup minimaal iedere 6 uur en achterstandsignalering vanaf 48 uur.
SignalRreconnectbeleid, hubroutes, transportinstellingenLive-meekijk smoke test.
Rate limitinglimieten per endpointgroep/contextTest op begrensde misbruikscenario's.
Secretsdatabasewachtwoorden, client secrets, SMTP- of storagecredentialsSecretbestanden/Compose secrets/Swarm secrets buiten repository en image; waarden niet loggen.

21.5 Operationele rollen en toegang

Operationele toegang is niet hetzelfde als functionele beheerdertoegang binnen OefenHub. Een functionele beheerder kan applicatiebeheer uitvoeren volgens de beheerfunctionaliteit, maar krijgt niet automatisch toegang tot hosting, database, logs, secrets of interne jobdashboards.

RoltypeVoorbeeldenToegang
Functionele beheerderOefenHub-beheerder in de applicatieApplicatiebeheer binnen Admin, supportflows, contentbeheer, accountbeheer volgens autorisatie.
Technisch beheerderHosting/applicatiebeheerderDeployment, configuratie, logs, TickerQ-dashboard, backup/restore, incidentanalyse.
DatabasebeheerderDBA of technisch beheer met DB-rechtenBackup, restore, migratieanalyse, performanceanalyse. Geen inhoudelijke gebruikersacties.
OntwikkelaarDeveloper/maintainerBroncode, tests, CI/CD, lokale/testomgevingen. Productietoegang alleen volgens beheerbeleid.
Auditor/analistControle of incidentanalyseAlleen noodzakelijke logging/history, bij voorkeur read-only en geminimaliseerd.

Operationele toegang moet minimaal voldoen aan:

  • least privilege;
  • gescheiden accounts waar mogelijk;
  • MFA waar ondersteund;
  • geen gedeelde persoonlijke accounts;
  • logging van beheeracties;
  • periodieke controle op toegang;
  • directe intrekking bij rolwijziging of vertrek.

21.6 Monitoringstrategie

Monitoring moet aantonen of OefenHub beschikbaar, veilig, performant en consistent draait. Monitoring is niet alleen infrastructuurmonitoring, maar omvat ook applicatiesignalen, domeinprocessen, background jobs en functionele kernstromen.

21.6.1 Monitoringlagen

LaagTe bewaken signalenVoorbeelden
InfrastructuurCPU, geheugen, opslag, netwerk, certificatenSchijfruimte bijna vol, certificaat verloopt, hoge CPU.
ApplicatieHTTP-statussen, latency, exceptions, startup healthToename 500-fouten, trage login, falende PDF-export.
Databaseconnectiviteit, querylatency, locks, migratiestatus, backupstatusLangzame historyquery, migration niet toegepast.
Identity providerbereikbaarheid, loginfouten, tokenvalidatieKeycloak niet bereikbaar, issuer mismatch.
Mailproviderbereikbaarheid, verzendfouten, timeoutpercentages, failed maildelivery jobsProvider niet bereikbaar, authenticatiefout, te veel retries.
TickerQ/jobspending, running, failed, retries, stale jobsCleanup faalt, verlopen uitnodigingen blijven pending.
SignalRconnecties, reconnects, hubfoutenVeel reconnect failures bij live meekijken.
Securityaccess denied, rate limiting, verdachte patronenVeel IDOR-pogingen of brute-force-achtig verkeer.
ExportsPDF-generatie, tijdelijke bestanden, cleanupExportlocatie loopt vol.

21.6.2 Health checks

De applicatie krijgt health checks die onderscheid maken tussen eenvoudige beschikbaarheid en diepere readiness.

CheckDoelVerwachte inhoud
LivenessIs het proces actief?Minimale check zonder externe afhankelijkheden.
ReadinessKan de app verkeer verwerken?Databaseconnectie, essentiële configuratie, identity provider basisbereikbaarheid waar passend.
Database healthIs de database bereikbaar en consistent genoeg?Connectie, eventueel migrationversie.
Scheduling healthKan TickerQ jobs verwerken?Persistence bereikbaar, geen structurele failed backlog boven grens.
Export healthIs tijdelijke exportlocatie bruikbaar?Locatie bestaat, schrijfbaar, voldoende ruimte.
SignalR healthIs de realtime-laag beschikbaar?Hubregistratie en basisconnectiviteit.

Health checks mogen geen gevoelige configuratie of persoonsgegevens teruggeven. Publieke of semi-publieke health endpoints geven hoogstens globale status. Detailinformatie hoort alleen in interne monitoring.

21.6.3 Alertcategorieën

ErnstBetekenisVoorbeeldenActie
InfoRelevante operationele gebeurtenisRelease gestart, job batch voltooidGeen directe actie.
WarningMogelijk probleem of verslechteringRetrybacklog groeit, veel 403's, exportcleanup te laatControle door technisch beheer.
ErrorFout met gebruikers- of dataverwerkingsimpactPDF-export faalt structureel, login provisioning faaltActieve opvolging vereist.
CriticalBeschikbaarheid, dataverliesrisico of securityincidentDatabase onbereikbaar, backup mislukt, verdachte toegangspiekDirecte escalatie.

21.7 Logging, correlation en operationele herleidbaarheid

Operationele herleidbaarheid is noodzakelijk bij cross-module workflows, background jobs, provisioning, live meekijken, exports en beheeracties. Iedere relevante request en iedere jobuitvoering krijgt een correlation-id die wordt doorgegeven aan alle betrokken modulecontracten.

Serilog en Seq vormen de baseline voor gestructureerde technische logging en operationele loganalyse. Serilog levert de gestructureerde logevents via de .NET loggingabstractie; Seq wordt gebruikt als centrale viewer voor zoeken, filteren en incidentanalyse. Toegang tot Seq is intern/beheerd, volgt least privilege en mag geen functionele brondata of onbeperkte persoonsdata ontsluiten.

De concrete Serilog-/Seq-configuratie, minimale logniveaus, sinkkeuze, scrubbing en retentietermijnen staan in Technisch Ontwerp: logging, audit, securitylogging en technische foutafhandeling. Operationeel beheer controleert of de Seq-retentiepolicies, toegang en opslaggrenzen daarmee overeenkomen.

21.7.1 Verplichte operationele contextvelden

VeldGebruik
CorrelationIdVerbindt request, workflow, job, databaseactie en logregels.
RequestIdTechnische requestherleiding binnen Web/API.
JobIdHerleiding naar TickerQ/jobpersistence.
JobTypeType achtergrondtaak of retrybare verwerking.
ModuleNameModule die logregel of actie produceert.
ActionNameFunctionele of technische actie.
UserIdAlleen als nodig en bij voorkeur als interne identifier, geen naam/e-mail.
RoleContextActieve rolcontext wanneer relevant.
EntityTypeDomeinobjecttype, zoals Ticket, ExerciseRun, RelationshipInvitation.
EntityIdInterne identifier of soft link naar betrokken object.
ResultSucceeded, Failed, Denied, Retried, Skipped.
ErrorCodeGestandaardiseerde technische of domeinfoutcode.

21.7.2 Wat niet gelogd mag worden

Niet loggenReden
Wachtwoorden, tokens, refresh tokens, cookiesCredentials/geheime waarden.
Volledige identity-providerresponsesKan tokens of persoonsgegevens bevatten.
Volledige oefenantwoorden of vraagpayloadsLeerlingdata en modulepayloads zijn inhoudelijk gevoelig.
Volledige PDF-inhoudExportinhoud is geen logdata.
Vrije berichtinhoud of ticketdiscussiesPersoons- en communicatiedata.
Volledige stacktraces naar gebruikerInformatiebeveiliging. Intern mag beperkt en gemaskeerd gelogd worden.
Secrets of connectionstringsConfiguratiegeheimen.

21.8 Backupstrategie

Backup is verplicht voor de relationele database en voor operationele configuratie die nodig is om OefenHub te herstellen. Omdat PDF-bestanden tijdelijke output zijn en opnieuw gegenereerd worden vanuit databasegegevens, zijn tijdelijke exports geen primaire backupbron.

21.8.1 Backupscope

ObjectBackup nodig?Toelichting
Relationele databaseJaPrimaire bron voor accounts, catalogus, oefenruns, berichten, tickets, jobs en beheerdata.
TickerQ/jobpersistenceJaOnderdeel van database of scheduling-schema; nodig om pending/failed jobs niet kwijt te raken.
ApplicatieconfiguratieJaNiet de secrets zelf in documentatie, maar reproduceerbare configuratie per omgeving.
SecretsJa, via secret store/beheerprocesNiet in applicatiebackup of logs.
UploadsVooralsnog beperktVrije uploads zijn in eerste versie niet leidend; eventuele toegestane bestanden krijgen eigen beleid.
Tijdelijke PDF-bestandenNeeWorden periodiek opgeschoond en opnieuw opgebouwd uit brondata.
LogsAfhankelijk van beleidNodig voor incidentanalyse, maar geen brondata voor functionele restore.
Build artifactsJa, via CI/CD-artifactopslagNodig voor rollback naar vorige applicatieversie.

21.8.2 Backupfrequentie en bewaartermijnen

Exacte frequenties worden operationeel vastgesteld, maar de technische baseline moet ten minste deze categorieën ondersteunen:

Type backupDoelRichting
Volledige databasebackupHerstel na groot incidentMinimaal dagelijks voor productie.
Transaction/log backup of equivalentBeperken van dataverliesNiet vereist voor de V1.0-baseline zolang de RPO van 5 × 24 uur aantoonbaar wordt gehaald; mag platformmatig worden gebruikt.
Pre-deployment backupRollback bij releaseproblemenVoor databasewijzigingen met migratierisico.
ConfiguratiebackupReproduceerbare omgevingBij configuratiewijzigingen.
RestoretestbackupPeriodieke herstelvalidatieOp acceptatie of aparte restoreomgeving.

21.8.3 Recovery point objective en recovery time objective

OefenHub is in de V1.0-baseline geen kritieke 24/7-dienst en kent geen hoge-beschikbaarheidseis. Backup en restore zijn daarom gericht op aantoonbare herstelbaarheid en gegevensbehoud, niet op near-zero downtime of continue beschikbaarheid.

HersteldoelV1.0-baselineToelichting
Recovery point objective (RPO)Maximaal 5 × 24 uur dataverliesDe backupinrichting moet kunnen herstellen naar een bruikbaar herstelpunt van maximaal vijf dagen oud. Dagelijkse databasebackups zijn voldoende wanneer retentie, opslag en monitoring dit aantoonbaar ondersteunen.
Recovery time objective (RTO)Maximaal 3 werkdagen na besluit tot restoreDe RTO loopt vanaf het expliciete besluit om een restore uit te voeren, niet vanaf eerste incidentmelding of analysefase.
BeschikbaarheidsniveauGeen high-availability baselineHot standby, active-active, multi-region failover en zero-downtime restore vallen buiten de V1.0-baseline.
RestorevalidatiePeriodiek en releasegericht aantonenRestoretests tonen aan dat database, configuratie, secretsproces, applicatieversie en basale smoke tests samen herstelbaar zijn.

De RPO/RTO-baseline geldt voor productiegegevens in de database, beheerbare configuratie/content en eventuele productieuploads die als brondata zijn toegestaan. Tijdelijke PDF-bestanden, build artifacts en technische logs zijn geen primaire functionele brondata, maar worden wel meegenomen in operationeel beheer voor rollback, analyse of compliance waar dat nodig is.

21.9 Restorestrategie

Een backup is pas operationeel betrouwbaar wanneer herstel periodiek getest is. Restoreprocedures moeten niet alleen de database terugzetten, maar ook controleren of de applicatie na herstel functioneel veilig kan starten.

21.9.1 Restoretypen

RestoretypeDoelProcedurele aandachtspunten
Volledige omgevingsrestoreProductie herstellen na groot incidentDatabase, configuratie, secrets, applicatieversie, jobs en smoke tests.
Point-in-time restoreHerstel naar moment vóór foutVereist logbackup of platformequivalent.
Selectieve analyse-restoreIncidentonderzoek zonder productie te rakenAlleen in afgeschermde omgeving met privacymaatregelen.
Pre-release rollbackrestoreTerug naar situatie vóór migratieApplicatieversie en databaseschema moeten compatibel zijn.
RestoretestBewijzen dat backups bruikbaar zijnPeriodiek uitvoeren en resultaat vastleggen.

21.9.2 Restorevalidatie

Na restore worden minimaal de volgende controles uitgevoerd:

ControleVoorbeeld
Applicatie startStartup zonder configuratie- of migrationfouten.
Database bereikbaarHealth check en basisquery slagen.
Migrationstatus kloptGeen half toegepaste migrations.
Identitykoppeling werktLogin/provisioning smoke test op testaccount.
Autorisatie werktLeerling/docent/ouder/beheerder contextchecks.
TickerQ werktPending jobs zichtbaar en verwerkbaar.
Jobs niet dubbel uitgevoerdIdempotentie en jobstatussen controleren.
PDF-export werktTijdelijke export kan opnieuw worden gegenereerd.
SignalR werktBasis live-update of hubconnectie smoke test.
Logs/correlation werkenNieuwe acties hebben correlation-id.

21.10 Databasebeheer en migrations in operatie

Databasebeheer volgt de modulegrenzen uit het Technisch Ontwerp. Iedere module met eigen persistentie heeft een eigen DbContext en schema. Migrations worden niet handmatig los uitgevoerd buiten het releaseproces, tenzij sprake is van een expliciete incidentprocedure.

21.10.1 Releasevolgorde bij databasewijzigingen

StapDoel
1. PreflightControleer configuratie, databaseconnectie, migratieplan en beschikbare backup.
2. BackupMaak pre-deployment backup wanneer schemawijzigingen of datamigraties risico geven.
3. MigrationsVoer modulemigrations uit in vastgelegde volgorde.
4. Seed/migratiedataVoer alleen idempotente en expliciet bedoelde seed- of datamigratiestappen uit.
5. ApplicatiereleaseDeploy applicatieversie die bij schema hoort.
6. Smoke testsControleer login, frontpage, oefeningstart, jobdashboard, PDF en kernflows.
7. MonitoringBewaak fouten, performance, migrations en jobstatussen na release.

21.10.2 Backward-compatible migrations

Waar mogelijk worden databasewijzigingen backward-compatible ontworpen:

  • nieuwe nullable kolommen vóór verplicht maken;
  • nieuwe tabellen zonder bestaande flows te breken;
  • oude kolommen pas verwijderen na overgangsrelease;
  • data backfill als expliciete migratie- of jobstap;
  • featuretoggle of codepad pas activeren nadat schema en data gereed zijn.

Cross-module harde FK's zijn uitzondering. Wanneer zo'n uitzondering toch wordt geïntroduceerd, moet de migratievolgorde en rollbackimpact expliciet worden vastgelegd.

21.11 Seeddata en beheerbare configuratie in operatie

Seeddata is module-eigen en idempotent. Operationeel beheer moet voorkomen dat beheerbare content onbedoeld wordt teruggezet door een release.

Type dataVoorbeeldOperationeel gedrag
Technische referentiedataticketstatussen, resolutietypenIdempotent controleren en aanvullen.
Initiële beheercontentpopupdefinities, systeemberichttemplatesAlleen initieel of via expliciete migratie aanpassen.
Modulemetadatatechnische oefenmodulebeschrijvingenVia modulehost/catalogproces actualiseren.
Testdataontwikkelaccounts, voorbeeldrunsAlleen development/test, nooit productie.
Featuretogglessitebrede schakelaarsBeheerd via expliciet beheerdomein, niet stil overschrijven.

Seedmechanismen mogen niet blind iedere deployment bestaande beheeraanpassingen overschrijven.

21.12 TickerQ en joboperatie

TickerQ is onderdeel van de operationele basis. Jobs mogen niet verloren gaan bij applicatieherstart. Daarom wordt TickerQ-persistence gebruikt, bij voorkeur in schema scheduling.

21.12.1 Operationele verantwoordelijkheden van OefenHub.Scheduling

VerantwoordelijkheidToelichting
JobaannameDomeinen plannen jobs via publieke schedulingcontracten.
JobpersistenceJobs, status, pogingen en foutinformatie blijven bewaard.
TriggeringTickerQ triggert jobs volgens planning.
RetrybeleidRetryconfiguratie wordt per jobtype bepaald.
Failed statusJobs eindigen na begrensde retries in beheerbare foutstatus.
DashboardInterne jobinterface voor technisch beheer.
CorrelationJoblogs zijn gekoppeld aan request/workflow via correlation-id.
DomeinuitvoeringUitvoering gebeurt via publieke contracten van eigenaarmodules.

21.12.2 TickerQ-dashboard

Het TickerQ-dashboard wordt alleen intern beschikbaar gemaakt. Het dashboard mag niet publiek bereikbaar zijn via internet of reguliere eindgebruikersroutes.

Minimale maatregelen:

  • afschermen achter intern netwerk, VPN of streng beheerpad;
  • extra autorisatie voor technisch beheer;
  • geen toegang voor reguliere applicatiegebruikers;
  • geen weergave van gevoelige payloadinhoud;
  • logging van beheeracties zoals retry, cancel of manual trigger;
  • expliciete configuratie per omgeving.

21.12.3 Failed jobs

Failed jobs zijn operationele incidenten of herstelpunten, geen normale eindtoestand die genegeerd mag worden.

Failed-job aspectVereiste
ZichtbaarheidFailed jobs zijn zichtbaar in intern beheer/monitoring.
Begrensde retriesGeen oneindige retryloops.
Laatste foutFoutcode en samenvatting worden opgeslagen zonder gevoelige payload.
CorrelationHerleidbaar naar request, workflow of initiërende module.
IdempotentieHandmatige retry mag geen dubbele domeinmutatie veroorzaken.
EscalatieStructurele failed jobs leiden tot alert.

21.13 Interne beheerinterfaces

Interne beheerinterfaces zijn technische hulpmiddelen voor beheer en operatie. Zij zijn geen onderdeel van de publieke applicatie-ervaring.

InterfaceDoelBescherming
TickerQ-dashboardJobs bekijken, failed jobs analyseren, retries beherenIntern + technisch beheerautorisatie.
Health detail viewDiepere statusinformatieAlleen intern.
Log/monitoringdashboardFout- en performanceanalyseAlleen technisch beheer.
DatabasebeheerconsoleDatabaseonderhoudBuiten applicatie, strikt beperkt.
Hosting/deploymentconsoleReleases en configuratieAlleen technisch beheer.

Als een interne interface toch binnen dezelfde webhost draait, moet routing en autorisatie expliciet voorkomen dat reguliere gebruikers deze kunnen bereiken.

21.14 Incidentafhandeling

Incidentafhandeling volgt een vast technisch patroon: detecteren, stabiliseren, analyseren, herstellen, controleren en documenteren.

21.14.1 Incidentfasen

FaseActiviteit
DetectieAlert, gebruikersmelding, failed job, logpiek of health-check failure.
TriageImpact, ernst, betrokken modules, correlation-id's en datarisico bepalen.
StabilisatieVerkeer beperken, feature uitschakelen, job pauzeren of rollback voorbereiden.
AnalyseLogs, domeinhistorie, jobstatussen, databasechecks en configuratie controleren.
HerstelRetry, fix, rollback, restore, hotfix of handmatige beheeractie volgens procedure.
ValidatieSmoke tests, monitoring en domeincontrole.
NazorgRoot cause, documentatie-impact, tests en eventuele Functioneel Ontwerp-, Software Requirements Specification-, Technisch Ontwerp- of database-informatie-aanpassing.

21.14.2 Incidentclassificatie

Type incidentVoorbeeldenEerste focus
BeschikbaarheidApp of database onbereikbaarStabilisatie, rollback/restore, communicatie.
DataconsistentieHalve workflow, failed kritieke jobCorrelation, transactionstatus, domeinhistorie.
SecurityVerdachte toegang, token/configuratiefoutBeperken, loganalyse, secrets/identity controleren.
PrivacyOnbedoelde dataweergave of exportToegang stoppen, impactanalyse, logging minimaliseren.
PerformanceTrage dashboards, database locksQueryanalyse, indexen, caching/readmodels.
Background processingFailed jobs of groeiende backlogTickerQ-dashboard, retrybeleid, jobpayload, domeincontract.
Export/storagePDF-generatie faalt, opslag volTijdelijke opslag, cleanup, Reporting/Practice checks.

21.15 Release-, deployment- en rollbackbeleid

Releases worden gecontroleerd uitgevoerd. Een release bestaat uit applicatiecode, moduleversies, configuratie, migrations, seed-/datamigratiestappen en smoke tests.

21.15.1 Release-artifacts

ArtifactVoorbeelden
ApplicatiebuildDeploybare OefenHub.Web-applicatie en gekoppelde assemblies.
ModuleassembliesConcrete oefenmodules zoals OefenHub.Modules.Arithmetic.Addition.
Database migrationsModule-eigen EF Core migrations.
ConfiguratieschemaVerwachte environment variables en options.
Seed-/referentiedataIdempotente datawijzigingen per module.
TestresultatenCI, architecture tests, migration tests, security/config checks.
Release notesTechnische wijzigingen, migraties, rollbackrisico's.

21.15.2 Deploymentflow

21.15.3 Smoke tests na deployment

Minimaal:

  • applicatie start en health checks slagen;
  • databaseconnectie werkt;
  • migrationstatus is correct;
  • login via identity provider werkt;
  • mailproviderconfiguratie valideert zonder secrets te tonen, wanneer mail in de omgeving is geactiveerd;
  • interne accountcontext wordt opgebouwd;
  • server-side autorisatie wijst ongeldige toegang af;
  • leerling kan toegankelijke oefening openen of veilige lege toestand zien;
  • eenvoudige oefenrun kan starten en voortgang opslaan in test/acceptatie;
  • TickerQ-dashboard is intern bereikbaar en jobs kunnen draaien;
  • PDF-export werkt op testdata;
  • SignalR-basistest werkt;
  • securityheaders zijn aanwezig;
  • logs bevatten correlation-id's.

21.15.4 Rollbackstrategie

Rollback wordt vooraf beoordeeld per release. Applicatiecode kan vaak sneller teruggedraaid worden dan databasewijzigingen. Daarom moeten databasewijzigingen zoveel mogelijk backward-compatible zijn.

RollbacktypeGebruik
Applicatie rollbackVorige applicatieversie herdeployen wanneer schema compatibel is.
Feature rollbackFeaturetoggle uitschakelen of codepad deactiveren.
Job rollbackJobtype pauzeren, failed jobs markeren of retry blokkeren.
Database restoreAlleen bij ernstig incident; vereist impactanalyse op nieuwere data.
DatafixAlleen via expliciete procedure, logging en indien nodig review.

Handmatige datacorrecties in productie zijn uitzonderlijk en moeten herleidbaar zijn.

21.16 Operationele securitychecks

Security is geen apart project, maar wordt operationeel wel expliciet beheerd.

CheckFrequentie/richtingToelichting
HSTS/HTTPSBij release en periodiekAlleen veilige verbindingen in productie.
Securityheaders/CSPBij releaseHeaders aanwezig en niet te ruim.
CookieflagsBij releaseSecure, HttpOnly en SameSite correct.
Rate limitingBij release en incidentenLimieten werken op relevante endpoints.
Identity provider configBij release en providerwijzigingAuthority, callback, issuer en clientconfig correct.
SecretsrotatiePeriodiek en bij incidentSecrets niet in logs of broncode.
Access-denied spikesMonitoringMogelijk misbruik of autorisatiefout.
TickerQ-dashboard exposureBij releaseDashboard niet publiek bereikbaar.
Dependency scanningCI/CDKwetsbare packages signaleren.

21.17 Logretentie en operationele dataretentie

Logretentie wordt gescheiden van functionele dataretentie. Functionele data blijft volgens domeinregels bewaard of geanonimiseerd. Technische logs worden korter bewaard en bevatten geen volledige persoonsgegevens of inhoudelijke payloads.

DatatypeEigenaarschapRetentierichting
DomeinhistorieEigen domeinmoduleVolgens functionele/auditregels van het domein.
DevelopmentlogsOperationele loggingBest effort, maximaal 7 dagen.
Test-/acceptatielogsOperationele logging14 dagen.
Productie Debug/VerboseOperationele logging192 uur (8 dagen), alleen wanneer tijdelijk ingeschakeld.
Productie reguliere technische logsOperationele logging120 dagen.
Productie securityrelevante technische logsOperationele/securitymonitoring360 dagen, geminimaliseerd en zonder gevoelige payloads.
Critical incidentselectieOperationele/securitymonitoringMaximaal 720 dagen na expliciete incidentregistratie.
JobhistorieSchedulingLang genoeg voor retry, analyse en audit van verwerking.
Tijdelijke PDF-bestandenReporting/SchedulingStandaard 24 uur; cleanup minimaal iedere 6 uur; achterstandsignalering vanaf 48 uur.
Health/metricsMonitoringplatformGeaggregeerd waar mogelijk.

Deze termijnen zijn de V1.0-baseline. Kortere termijnen zijn toegestaan wanneer privacy-, hosting- of opslagbeleid dat vereist. Nog langere generieke logretentie vereist een nieuw besluit.

21.18 Performance- en capaciteitsbeheer

Operationeel beheer bewaakt of de gekozen modulaire monoliet binnen acceptabele grenzen blijft presteren.

Belangrijke indicatoren:

  • responstijd per rolcontext en hoofdflow;
  • queryduur voor geschiedenis, resultaten, dashboards en mailbox;
  • aantal actieve SignalR-connecties;
  • tijd tussen antwoordbevestiging en live-update;
  • PDF-generatietijd en bestandsgrootte;
  • jobbacklog en gemiddelde jobduur;
  • database locks en connection pool-gebruik;
  • memorygebruik bij exports en grote readmodels;
  • opslaggroei van logs, jobs, exercise payloads en tijdelijke bestanden.

Wanneer performanceproblemen ontstaan, wordt eerst gekeken naar queryscoping, indexen, readmodelstrategie, paging, materialisatie en caching voordat modulegrenzen worden doorbroken.

21.19 Backup/restore en privacy

Restore naar niet-productieomgevingen mag niet automatisch betekenen dat echte persoonsgegevens beschikbaar worden voor ontwikkeling of test. Wanneer productiedata nodig is voor analyse, geldt minimaal:

  • toegang beperken tot strikt noodzakelijke personen;
  • waar mogelijk anonimiseren of maskeren;
  • geen export naar lokale onbeveiligde machines;
  • logs en analysebestanden opruimen na incident;
  • geen productiedata gebruiken voor reguliere developmenttests;
  • documenteren waarom restore/analyse nodig was.

Bij privacyincidenten wordt logging zorgvuldig gebruikt: genoeg voor reconstructie, maar zonder verdere verspreiding van gevoelige inhoud.

21.20 Operationele beheeracties per domein

DomeinOperationele beheeractiesLet op
IdentityProvisioningfouten analyseren, accountstatus controlerenGeen wachtwoorden of providercredentials wijzigen in OefenHub.
AuthorizationPolicy/configuratiefouten analyserenClientstate nooit als bewijs gebruiken.
RelationshipsVerlopen uitnodigingen, conflictanalyse, geforceerde ontkoppeling via beheerflowRelatiehistorie behouden.
CatalogModulemetadata, categoriemigratie, oefeningstatussenHistorische runs niet herschrijven.
PracticeTestrun-cleanup, runanalyse, voortgangsconsistentieLeerlingresultaten niet handmatig corrigeren zonder expliciete procedure.
CommunicationFailed systeemberichten, threadretentie, badge/readmodelherstelGeen vrije inhoud in technische logs.
SupportVerlopen heropentermijnen, failed doorzetacties, ticketanalyseInterne en externe discussie scheiden.
LiveMonitoringLiveViewAudit, connectieproblemen, SignalR-foutenMeekijken blijft read-only.
ReportingPDF-exportfouten, tijdelijke bestandsopruimingPDF opnieuw genereren uit brondata.
SchedulingFailed jobs, retries, jobdashboard, stale jobsJobpayloads veilig houden.
AdminBeheercontent, templates, features, instellingenBeheerhistory vastleggen.

21.21 Documentatie-impact bij operationele wijzigingen

Operationele wijzigingen kunnen documentatie-impact hebben. Bij iedere wijziging in deployment, jobs, database, security, logging, backup of monitoring wordt minimaal beoordeeld:

VraagMogelijke documentatie-impact
Wijzigt de functionele werking?Functioneel Ontwerp, Software Requirements Specification, usecases en schermdocumentatie.
Wijzigt het datamodel?Database-informatie, ERD, Technisch Ontwerp-hoofdstuk 06/07.
Wijzigt de modulegrens?Technisch Ontwerp-hoofdstuk 02/03/06.
Wijzigt autorisatie of security?Technisch Ontwerp-hoofdstuk 05/19/20 en mogelijk Software Requirements Specification.
Wijzigt een job of retryflow?Technisch Ontwerp-hoofdstuk 18/21.
Wijzigt logging of retentie?Technisch Ontwerp-hoofdstuk 19/21/25.
Wijzigt test- of releasebeleid?Technisch Ontwerp-hoofdstuk 21/23.

21.22 Implementatiechecklist

ControlepuntVerwachting
OmgevingsconfiguratiePer omgeving expliciet en gevalideerd.
SecretsNiet in broncode, logs of documentatie.
Health checksLiveness, readiness en relevante dependencychecks.
MonitoringApplicatie, database, jobs, SignalR, exports en securitysignalen.
LoggingCorrelation-id's en veilige inhoud.
BackupDatabasebackup en configuratieherstel ingericht binnen de RPO van maximaal 5 × 24 uur.
RestoretestPeriodiek uitgevoerd en vastgelegd; herstelpad past binnen de RTO van maximaal 3 werkdagen na restorebesluit.
MigrationsModule-eigen, gecontroleerd en onderdeel van releaseproces.
SeeddataIdempotent en niet blind overschrijvend.
TickerQPersistence, schema, retries volgens de jobtype-defaultmatrix en intern dashboard ingericht.
Failed jobsZichtbaar, begrensd retrybaar en beheerbaar.
Interne dashboardsNiet publiek bereikbaar.
Smoke testsNa deployment uitgevoerd.
RollbackplanPer release beoordeeld.
SecuritychecksHeaders, HSTS, cookies, rate limiting en dashboardafscherming getest.
LogretentieTermijnen en privacygrenzen vastgelegd.
Documentatie-impactBij operationele wijzigingen beoordeeld.

21.23 Implementatieverificaties

PuntTe bepalen / te verifiëren
RPO/RTOVerifiëren dat de productiebackup aantoonbaar voldoet aan RPO 5 × 24 uur en RTO 3 werkdagen na restorebesluit.
BackupfrequentieDefinitieve frequentie en bewaartermijnen per omgeving toetsen aan de vastgelegde RPO.
RestoretestfrequentiePeriodieke restoretest plannen, eigenaar bepalen en resultaat vastleggen.
TickerQ-schemaVerifiëren hoe TickerQ-tabellen in schema scheduling worden geplaatst.
Tijdelijke PDF-opslagOefenHub:Reporting:TempExportPath, rechten, monitoring, 24-uursretentie en cleanupjob minimaal iedere 6 uur controleren.
Serilog/SeqConfiguratie, opslag, toegang, retentie, masking/scrubbing en exportmogelijkheden toetsen aan de vastgelegde baseline.
TickerQ-dashboardExacte afscherming, route en beheerautorisatie bepalen.
LogretentieSeq-retentiepolicies en opslagmonitoring inrichten volgens de vastgelegde termijnen.
MonitoringplatformMetrics, dashboards en alerts concreet selecteren.
Securityheaders/CSPCSP en headerconfiguratie toetsen aan de vastgelegde baseline na frontenduitwerking.
Secrets Docker V1.0Secretbestanden, Docker Compose secrets of Docker/Portainer Swarm secrets toetsen op rechten, mountlocatie, geen waarden in logs en geen waarden in repository/image.
ReleasepipelineCI/CD-tooling, artifactopslag en environment promotion concretiseren.
MigrationrunnerBepalen of migrations door applicatie, pipeline of apart toolingproces worden uitgevoerd.
DatafixprocedureProcedure voor uitzonderlijke productiedatacorrecties vastleggen.
Interne beheeraccountsTechnische beheerrollen, MFA en toegangsreviewproces vastleggen.