Wie bewaakt de bewakers?
De klassieke vraag van de Romeinse dichter Juvenalis is bijzonder relevant voor IT-systemen: als n8n onze workflows monitort, wie monitort dan n8n? Als Mattermost onze alerts stuurt, wat gebeurt er als Mattermost down is?
Dit hoofdstuk beschrijft de monitoring-architectuur van ASD-PMA en de strategieen om single points of failure te minimaliseren.
Elke service heeft een ingebouwde healthcheck in docker-compose.yml:
| Service | Healthcheck Endpoint | Interval |
|---|---|---|
| Zammad | HTTP GET / | 30s |
| Redmine | HTTP GET / | 30s |
| ERPNext | HTTP GET / | 30s |
| Mattermost | HTTP GET /api/v4/system/ping | 30s |
| n8n | HTTP GET / | 30s |
| Superset | HTTP GET /health | 30s |
| Wiki.js | HTTP GET / | 30s |
Wat gebeurt bij failure:
unhealthydocker ps of asd netBeperking: Docker healthchecks detecteren alleen container-level problemen, niet applicatie-logica issues.
Detecteert en herstelt "bevroren" schedule triggers:
Configuratie:
Gemonitorde Workflows:
| Workflow | Normaal Interval | Stale Alert |
|---|---|---|
| Redmine to Mattermost | 10s | 120s |
| Zammad to Mattermost | 10s | 120s |
Preventief resetten van schedule workflows:
Een aparte container die n8n monitort van buitenaf:
Configuratie:
Monitor voor SSH tunnels naar externe endpoints:
Werkwijze:
.asd/workspace/tunnels/ps -p PID)asd net-apply --tunnelInstallatie:
# Als cron job (aanbevolen)
*/5 * * * * /path/to/scripts/watchdog/tunnel-watchdog.sh
# Als daemon
./scripts/watchdog/tunnel-watchdog.sh --daemon
Real-time overzicht via terminal:
asd net
Features:
Alle alerts komen samen in Mattermost channels:
| Channel | Alerts |
|---|---|
| #alerts | Systeem notificaties |
| #support | Zammad escalaties |
| #development | Redmine updates |
| Kwetsbaarheid | Impact | Huidige Mitigatie |
|---|---|---|
| Mattermost down | Geen alerts ontvangen | Geen |
| n8n down | Geen workflow monitoring | n8n-watchdog container |
| Alle tunnels down | Geen externe toegang | tunnel-watchdog script |
| Host machine down | Complete outage | Geen |
| Database corrupt | Data loss | Docker volumes |
Probleem: Als de hele stack down is, weet niemand het.
Oplossing: Externe monitoring service
Opties:
Implementatie:
# Endpoints om te monitoren
- https://mattermost-gwkh.cicd.eu1.asd.engineer/api/v4/system/ping
- https://n8n-gwkh.cicd.eu1.asd.engineer/healthz
- https://zammad-gwkh.cicd.eu1.asd.engineer/api/v1/monitoring/health_check
Probleem: Mattermost down = geen alerts.
Oplossing: Multi-channel alerting
| Primary | Backup |
|---|---|
| Mattermost | |
| Mattermost | SMS (Twilio) |
| Mattermost | Telegram |
n8n Implementatie:
// Multi-channel alert pattern
async function sendAlert(message) {
// Primary: Mattermost
try {
await sendMattermost(message);
} catch (e) {
// Backup: Email
await sendEmail(message);
}
}
Probleem: Alleen failure detection, geen "still alive" confirmation.
Oplossing: Heartbeat naar externe service
Implementatie:
# Healthchecks.io setup
curl -fsS --retry 3 https://hc-ping.com/YOUR-UUID-HERE
Probleem: Database corruptie wordt niet gedetecteerd.
Oplossing: Automated backup verification
| Database | Backup | Verify |
|---|---|---|
| PostgreSQL (Zammad, Redmine) | pg_dump daily | Restore test weekly |
| MariaDB (ERPNext) | mysqldump daily | Restore test weekly |
| SQLite (n8n) | File copy daily | Integrity check |
n8n Workflow:
// Backup verification workflow
// 1. Create backup
// 2. Restore to test container
// 3. Run sanity queries
// 4. Alert if failed
Probleem: We weten niet hoe het systeem reageert op failures.
Oplossing: Geplande failure tests
| Test | Frequentie | Actie |
|---|---|---|
| Container kill | Maandelijks | docker kill asd-zammad |
| Network partition | Maandelijks | docker network disconnect |
| Resource exhaustion | Kwartaal | Memory/CPU limits |
Runbook:
Probleem: Logs verspreid over containers.
Oplossing: Log aggregatie
Opties:
| Prioriteit | Verbetering | Effort | Impact |
|---|---|---|---|
| 1 | External Uptime Monitor | Laag | Hoog |
| 2 | Heartbeat Monitoring | Laag | Hoog |
| 3 | Redundant Alert Channel | Middel | Hoog |
| 4 | Database Backup Monitoring | Middel | Middel |
| 5 | Centralized Logging | Hoog | Middel |
| 6 | Chaos Engineering | Hoog | Laag |
1. Healthchecks.io Setup:
# Gratis account: https://healthchecks.io
# Voeg toe aan n8n Schedule Monitor workflow:
# - Ping URL na succesvolle check
2. Email Backup Alert:
// Voeg toe aan alert workflows
const emailBackup = process.env.ALERT_EMAIL;
if (mattermostFailed && emailBackup) {
await sendEmail(emailBackup, subject, body);
}
3. Docker Events Monitor:
# Simpele container death detector
docker events --filter 'event=die' | while read event; do
curl -X POST "$MATTERMOST_WEBHOOK" \
-d "{\"text\": \"Container died: $event\"}"
done
De vraag "Quis custodiet ipsos custodes?" heeft geen perfecte oplossing. De strategie is:
De beste monitoring is die je nooit nodig hebt, maar altijd klaar staat.