5.6 KiB
5.6 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
- Zet
IMAP_ENABLED=0om lockout of herhaalde fouten te beperken. - Controleer host, poort, TLS, mailboxnaam en app-password.
- Verifieer dat de mailbox niet is hernoemd en het account niet is vergrendeld.
- Test eerst read-only met
IMAP_MARK_SEEN=0. - Een reeds verwerkte mail is idempotent via message identity; verwijder geen
EmailMessageRecordom opnieuw te proberen zonder analyse.
Digest ontbreekt of dubbel
- Controleer actief profiel, digesttijd/zone en
DIGEST_RECIPIENT. - 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.