Aller au contenu principal

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
attention

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" }
remarque

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).

Env-file aanmaken

Maak /etc/klantel-cron.env aan als root met CRON_SECRET=<geheim> en stel de rechten in:

chmod 600 /etc/klantel-cron.env
Crontab-regels toevoegen

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.

Testen

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

Verwante pagina's