7.1 KiB
7.1 KiB
Operationeel runbook
Dagelijkse controle
Controleer bij voorkeur automatisch en minstens wekelijks handmatig:
/health/ready/is 200;- web, worker, scheduler, PostgreSQL en Redis zijn actief;
- vrije ruimte op database-, media-, log- en back-upvolume;
- bronnen in
quarantined,pausedof met oplopendefailure_count; DigestOutboxmet statusfailedof langdurigpending;- meest recente geslaagde back-up en laatste hersteltest;
- onverwachte login- of policyfouten in logs.
Incidentprioriteiten
| Niveau | Voorbeeld | Eerste actie |
|---|---|---|
| P1 | datalek, secret gepubliceerd, ongeautoriseerde netwerkfetch | stop web/worker/scheduler, isoleer netwerk, roteer secrets |
| P2 | database niet beschikbaar, imports corrupt, herhaalde mail | stop schrijvende processen, behoud bewijs, maak snapshot |
| P3 | één adapter kapot, digest vertraagd, bron in quarantaine | pauzeer bron/functie, herstel met fixture en test |
| P4 | copy/layout/probleem zonder datarisico | registreer backlogtaak en plan normale release |
Web niet ready
- Controleer liveness. Faalt die ook, inspecteer webcontainer/proces en poortbinding.
- Bij
database=error:*: controleer PostgreSQL-status, disk, credentials en netwerknaam. - Test vanuit webcontainer of DNS
postgresresolveert en poort 5432 bereikbaar is. - Draai geen migraties herhaald blind; lees eerst de laatste stacktrace.
- Herstart alleen de falende laag. Een volledige stackrestart kan diagnostiek wissen.
Worker verwerkt niets
- Controleer Redis en
CELERY_BROKER_URL. - Controleer workerqueues
high,default,low. - Inspecteer actieve en gereserveerde taken:
celery -A config inspect ping
celery -A config inspect active
celery -A config inspect reserved
- Kijk naar timeouts, policyblokkades en retryloops.
- Start niet meerdere schedulers; dat kan dubbele planning veroorzaken, ook al zijn imports idempotent.
Bron faalt of gaat in quarantaine
- Laat quarantaine staan; forceer geen fetch.
- Lees alleen categorie, status, URL-host en beperkte foutmelding in
SourceRun. - Controleer of het domein, redirectdoel, robots-/voorwaardenstatus of contenttype veranderde.
- Download geen pagina met een onbeveiligde shellopdracht vanaf de productiehost.
- Reproduceer met een gesaneerde fixture in een ontwikkelomgeving.
- Werk parser/policy en securitytests bij.
- Zet bron pas terug op
trial, voer één begrensde run uit en promoveer daarna eventueel naaractive.
IMAP-import stopt
- Pauzeer alleen de falende platformmailbox op de bronpagina; andere mailboxen blijven werken.
- Controleer provider, publieke IMAP-host, poort 993, mailboxmap, account en app-wachtwoord.
- Verifieer dat
MAILBOX_CREDENTIAL_KEYSaanwezig is en dat bij een rotatie de oude sleutel nog achter de nieuwe staat. - Verifieer dat de mailbox niet is hernoemd en het account niet is vergrendeld.
- Alle polls selecteren de mailbox read-only; een reeds verwerkte mail is per mailbox idempotent via message identity.
- Controleer het gekozen interval en
next_poll_at; de scheduler zoekt iedere vijf minuten naar verschuldigde koppelingen. - Controleer
IMAP_MAX_MESSAGES_PER_POLLenIMAP_MAX_MESSAGE_BYTES. Vergroot die niet om een onverwacht groot of verdacht bericht blind te verwerken. - Controleer bij een leeg resultaat of het jobboardmailformaat nog gelabelde HTTPS-vacaturelinks op het gekozen platformdomein bevat; versoepel de domeinfilter niet zonder fixture en securitytest.
- Activeer de mailbox opnieuw, kies Nu synchroniseren en controleer
last_success_at. Verwijder geenEmailMessageRecordom zonder analyse te herhalen.
Mailboxsleutel roteren
- Maak een nieuwe Fernet-sleutel en zet die als eerste in
MAILBOX_CREDENTIAL_KEYS; behoud de oude sleutel erachter. - Herstart web, worker en scheduler zodat alle processen dezelfde sleutellijst gebruiken.
- Draai
python manage.py rotate_mailbox_credentials. - Synchroniseer één mailbox en controleer dat geen ciphertext, app-wachtwoord of volledige mailpayload in logs staat.
- Verwijder daarna de oude sleutel en herstart opnieuw.
Digest ontbreekt of dubbel
- Controleer actief profiel, digesttijd/zone en
DIGEST_RECIPIENT. - Microsoft 365 gebruikt uitsluitend app-only OAuth. Configureer
M365_TENANT_ID,M365_CLIENT_ID,M365_CLIENT_SECRET,M365_MAILBOX_USERenEMAIL_BACKEND=apps.notifications.backends.Microsoft365OAuthEmailBackend. Verleen alleenIMAP.AccessAsAppenSMTP.SendAsApp, admin consent en mailboxscope; Basic Auth en Microsoft 365-app-wachtwoorden worden niet ondersteund. - Controleer
DigestOutboxop datum en status. - Bij SMTP-fout: corrigeer configuratie en retry dezelfde outbox gecontroleerd.
- Maak geen tweede outboxrecord handmatig; uniciteit per profiel/datum is de duplicaatbarrière.
- Een lege digest is toegestaan wanneer geen vacature boven de ingestelde drempel valt.
Verdachte of kwaadaardige vacature-inhoud
- Open de originele bron niet automatisch in een ingelogde browser.
- Zet bij twijfel het raw document op
quarantinedzodat retentie het bewijs niet wist. - Controleer opgeslagen gesaniteerde tekst en veldherkomst.
- Voeg de payload als geanonimiseerde fixture toe wanneer een parser/sanitizerfout bestaat.
- Laat AI-output nooit een commando, URL-fetch of configuratiemutatie veroorzaken.
Sollicitatiedossier exporteren en opschonen
- Open de sollicitatielijst in een ingelogde gebruiker-sessie en ga naar het dossier.
- Controleer dat de timeline alleen mutaties voor dat dossier bevat (status, notities, contact, snapshot).
- Exporteer met het dossier-exportendpoint om een zip met
application.json,timeline.csv,application_print.htmlte controleren. - Controleer het zipbestand lokaal op:
- correcte dossier-ID;
- geen raw e-mailbody of bron-payload;
- geen externe assets of scriptrequests in HTML.
- Verwijderen mag alleen op gebruikersniveau (
deleteendpoint); herhaalde delete-aanroepen moeten zonder fout uitkomen.
Schijfruimte laag
- Stop scheduler en worker wanneer de database- of PostgreSQL-volume kritiek vol is.
- Controleer oude back-ups, containerlogs, raw-documentretentie en Ollama-modellen.
- Verwijder nooit willekeurig PostgreSQL-bestanden.
- Laat
cleanup_raw_documentsalleen niet-gequarantaineerde verlopen documenten opruimen. - Vergroot volume of herstel rotatie, start daarna database, web, worker en scheduler in die volgorde.
Secret vermoedelijk gelekt
- Stop externe toegang en disable betrokken account/token.
- Roteer Django secret, adminwachtwoord, database-, SMTP-, IMAP- en registrycredentials voor zover betrokken.
- Trek oude sessies in door sessies te verwijderen of het secret te wijzigen.
- Controleer logs en source-runs op misbruik, zonder gevoelige payload verder te kopiëren.
- Maak een incidentnotitie met exacte tijden, scope, rotaties en herstelvalidatie.
Herstelvalidatie
Na ieder incident:
python manage.py check
python manage.py migrate --plan
python manage.py shell -c "from apps.core.health import readiness; print(readiness())"
Controleer daarna login, één fixture-import, scoreberekening, bronlijst, sollicitatielijst en mailbackend. Start live polling pas nadat deze controles slagen.