Cron-eindpunten
Overzicht
Klantel heeft elf HTTP-eindpunten die periodiek worden aangeroepen door de VPS-root-crontab (zie ADR-0014). Coolify Scheduled Tasks worden niet gebruikt.
Beveiliging
Alle cron-eindpunten vereisen een Authorization: Bearer-header met het CRON_SECRET:
Authorization: Bearer <CRON_SECRET>
Stel CRON_SECRET in als omgevingsvariabele. Genereer een sterk geheim:
openssl rand -hex 32
Nooit het CRON_SECRET in code, logs of platte-tekst crontab-regels opslaan. Beheer het via
/etc/klantel-cron.env (chmod 600) op de VPS — elke crontab-regel source-t deze file.
Eindpunten
POST /api/cron/weekrapport
Verstuurt een wekelijks samenvattingsrapport per e-mail aan alle beheerders van elke actieve tenant.
Schema (VPS-crontab): iedere zondag om 18:00 UTC (19:00 Belgische wintertijd)
0 18 * * 0
Aanroepvoorbeeld:
curl -X POST https://app.klantel.be/api/cron/weekrapport \
-H "Authorization: Bearer $CRON_SECRET" \
-H "Content-Type: application/json"
Respons bij succes:
{ "verstuurd": 12, "fouten": 0 }
Foutrespons:
{ "error": "Onbevoegd" }
HTTP 401 bij ontbrekende of ongeldige token.
POST /api/cron/audit-retentie
Verwijdert AuditEntry-rijen ouder dan AUDIT_RETENTIE_DAGEN dagen (default 2555 = 7 jaar).
Voldoet aan GDPR-opslagbeperking: audit-logboek niet langer bewaren dan wettelijk vereist.
Omgevingsvariabele: AUDIT_RETENTIE_DAGEN (optioneel, default 2555)
Schema (VPS-crontab): jaarlijks op 1 januari om 02:00 UTC
0 2 1 1 *
Aanroepvoorbeeld:
curl -X POST https://app.klantel.be/api/cron/audit-retentie \
-H "Authorization: Bearer $CRON_SECRET"
Respons bij succes:
{ "ok": true, "verwijderd": 42, "retentieDagen": 2555, "grens": "2017-01-01T02:00:00.000Z" }
Na opschoning blijft de hashketen-verificatie (/api/cron/audit-verificatie) groen: de
verificatie-cron gebruikt de oudste resterende entry als nieuw ankerpunt.
POST /api/cron/beveiligingslog-retentie
Verwijdert BeveiligingsLog-rijen (inlogpogingen) ouder dan BEVEILIGINGSLOG_RETENTIE_DAGEN dagen
(default 90).
Omgevingsvariabele: BEVEILIGINGSLOG_RETENTIE_DAGEN (optioneel, default 90)
Schema (VPS-crontab): dagelijks om 03:00 UTC
0 3 * * *
Aanroepvoorbeeld:
curl -X POST https://app.klantel.be/api/cron/beveiligingslog-retentie \
-H "Authorization: Bearer $CRON_SECRET"
Respons bij succes:
{ "ok": true, "verwijderd": 5, "retentieDagen": 90, "grens": "2026-03-24T03:00:00.000Z" }
POST /api/cron/audit-verificatie
Verifieert de SHA-256 hashketen van alle AuditEntry-records per tenant. Alarmeert bij een
gebroken keten (mogelijke manipulatie).
Schema (VPS-crontab): dagelijks om 01:00 UTC
0 1 * * *
Aanroepvoorbeeld:
curl -X POST https://app.klantel.be/api/cron/audit-verificatie \
-H "Authorization: Bearer $CRON_SECRET"
Respons bij succes (keten intact): HTTP 200
{ "gecontroleerd": 3, "aantalGebroken": 0, "resultaten": [...], "tijdstip": "..." }
Respons bij gebroken keten: HTTP 409
{ "gecontroleerd": 3, "aantalGebroken": 1, "resultaten": [...] }
POST /api/cron/backup-status
Rapporteer-eindpunt voor de host-cron (scripts/backup.sh → /opt/klantel/backup.sh). De host-cron
stuurt na elke back-up-run de exit-status en bestandsgrootte door. Het resultaat wordt bewaard
(BackupStatus) zodat het dagrapport de back-up-status als vaste rubriek kan tonen. Bij een mislukte
run (exitCode ≠ 0) volgt een Sentry-event met tag type: backup-failure — zo wordt stille
faling alsnog gemeld (KLANTEL-354).
Body (JSON):
{ "exitCode": 0, "bestandsnaam": "klantel_20260629.dump", "grootte": 20480, "foutmelding": "" }
exitCode is verplicht; bestandsnaam, grootte (bytes) en foutmelding zijn optioneel.
Aanroepvoorbeeld:
curl -X POST https://app.klantel.be/api/cron/backup-status \
-H "Authorization: Bearer $CRON_SECRET" \
-H "Content-Type: application/json" \
-d '{"exitCode":0,"bestandsnaam":"klantel.dump","grootte":20480}'
Respons bij succes:
{ "ok": true, "gelukt": true }
HTTP 400 bij ongeldige body, 401 bij ontbrekende/ongeldige token.
POST /api/cron/dagrapport
Dagelijks operationeel rapport voor de beheerder. Toont de back-up-status als vaste rubriek
(datum + grootte + OK/FOUT), gevoed door BackupStatus. Wordt gemaild naar DAGRAPPORT_EMAIL
(val terug op SUPPORT_EMAIL). Zonder ontvanger wordt het rapport niet verstuurd maar wel als JSON
teruggegeven (KLANTEL-354).
Schema (VPS-crontab): dagelijks om 06:00 UTC
0 6 * * *
Aanroepvoorbeeld:
curl -X POST https://app.klantel.be/api/cron/dagrapport \
-H "Authorization: Bearer $CRON_SECRET"
Respons bij succes:
{ "ok": true, "verzonden": true, "backup": { "resultaat": "OK", "gelukt": true, "datum": "29/06/2026 08:00", "grootte": "20.0 KB", "bron": "host-cron" } }
VPS-crontab-configuratie
Alle cron-endpoints worden aangeroepen vanuit de root-crontab op de VPS (zie ADR-0014 en DEPLOYMENT_OVH_COOLIFY.md §3.9 voor de volledige regelset).
Maak /etc/klantel-cron.env aan als root met CRON_SECRET=<geheim> en stel de rechten in:
chmod 600 /etc/klantel-cron.env
Voer crontab -e uit als root. Elke regel source-t de env-file:
0 18 * * 0 . /etc/klantel-cron.env; curl -s -X POST https://klantel.be/api/cron/weekrapport -H "Authorization: Bearer $CRON_SECRET" >> /var/log/klantel-cron.log 2>&1
Zie DEPLOYMENT_OVH_COOLIFY.md §3.9 voor de volledige regelset van alle negen endpoints.
Roep het endpoint manueel aan en controleer de log:
. /etc/klantel-cron.env && curl -s -X POST https://klantel.be/api/cron/weekrapport \
-H "Authorization: Bearer $CRON_SECRET"
tail -f /var/log/klantel-cron.log