Benachrichtigungen Daily Watchdog eingerichtet
Benachrichtigungen repariert und Daily Watchdog eingerichtet
Datum: 1. Februar 2026 | Lesezeit: 12 Minuten | Kategorie: Infrastructure & Reliability Engineering
Das Problem: Stille Alarme
Eine Monitoring-Infrastruktur ist nur so gut wie ihre Benachrichtigungen. Bei einer Routine-Analyse unserer matzka.cloud-Infrastruktur stellten wir fest, dass sechs von acht Benachrichtigungskanälen fehlerhaft oder unzuverlässig waren:
| Kanal | Status vorher | Problem |
|---|---|---|
| AlertManager Email | Kaputt | Direkte SMTP-Verbindung zu Mailcow fragil |
| Backup Notifications | Kaputt | Falsche Konfigurationsparameter |
| Backup Prometheus WAL | Fehler | WAL-Dateien ändern sich während Backup |
| Watchtower Notifications | Kaputt | Case-sensitive Shoutrrr-Parameter |
| Wazuh-Exporter Metriken | Kaputt | DNS-Auflösung Timing-Problem |
| Wazuh Gotify Alerts | OK | Funktionierte bereits |
| Diun Notifications | OK | Funktionierte bereits |
| Täglicher Watchdog | Nicht vorhanden | Kein Dead Man's Switch |
Ausgangssituation
AlertManager war so konfiguriert, dass er E-Mails direkt über mail.matzka.cloud:587 mit STARTTLS und Authentifizierung sendete:
Schwachstellen dieser Konfiguration:
- DNS-Auflösung aus Docker heraus – Container müssen den externen Hostnamen auflösen
- TLS-Handshake – Zusätzliche Fehlerquelle bei Zertifikatsproblemen
- Passwort-Synchronisation – Ändert sich das Mailcow-Passwort, bricht AlertManager
- Sicherheitsrisiko – SMTP-Passwort im Klartext in der Konfigurationsdatei
smtp-relay Container. AlertManager wird ebenfalls umgestellt – kein Auth, kein TLS, nur internes Netzwerk.
Problem 1: Prometheus WAL-Fehler
lstat /backup/prometheus_data/wal/00000507: no such file or directoryPrometheus WAL-Dateien rotieren kontinuierlich und verschwinden zwischen Scan und Kopiervorgang.
Problem 2: Backup-Benachrichtigungen
Die proprietaeren BACKUP_NOTIFICATION_EMAIL_* Variablen werden von neueren Versionen nicht mehr unterstützt. Umstellung auf Shoutrrr-Format:
4 Container aktualisiert), sendete aber keine Benachrichtigungen: notify=no, Skipping notification due to empty message
Ursache: Shoutrrr-Parameter sind teilweise case-sensitive:
| Parameter | Falsch | Richtig |
|---|---|---|
| Authentifizierung | auth=None | auth=none |
| TLS-Start | useStartTLS=No | startTLS=no |
| TLS deaktivieren | disableTLS=yes | disabletls=yes |
| Gotify-Pfad | /TOKEN? | /TOKEN/? |
Failed to resolve 'wazuh.manager' ([Errno -2] Name or service not known)Beide Container im selben Netzwerk, aber DNS-Auflosung schlug fehl.
depends_on-Liste:
Konzept
Die Lösung: Ein täglicher Gesundheitsbericht, der immer kommen muss. Bleibt er aus, ist das selbst der Alarm.
Was der Watchdog prüft
Täglich um 07:00 UTC (08:00 Wien) werden systematisch alle kritischen Systeme geprüft:
Container-Status
- 29 kritische Container laufend?
- Health-Check Status OK?
- 10+ Mailcow Container aktiv?
Backup-Status
- Backup vorhanden?
- Jünger als 26 Stunden?
- Retention korrekt?
Benachrichtigungskanäle
- SMTP-Relay: Postfix läuft?
- Gotify: Health-Endpoint OK?
- Mailcow Postfix aktiv?
- AlertManager erreichbar?
Sicherheitssysteme
- Wazuh: Agenten verbunden?
- Wazuh Exporter: Metriken?
- Fail2ban aktiv?
- Auditd aktiv?
Systemressourcen
- Festplatte < 85%?
- RAM < 90%?
- Load Average normal?
- Uptime
SSL-Zertifikate
- Let's Encrypt Zertifikate verwaltet?
- acme.json vorhanden?
Benachrichtigungsformat
Der Watchdog sendet immer zwei Benachrichtigungen:
- E-Mail: HTML-Bericht mit farbkodierten Zeilen (grün/gelb/rot)
- Gotify Push: Kurze Zusammenfassung mit Priority-Mapping (3=OK, 5=Warn, 8=Fehler)
Cron-Job und Logging
Zentrale Designprinzipien
smtp-relay:25 – kein Service verbindet direkt zu Mailcow.2. Kein Auth intern: SMTP-Relay akzeptiert Mails aus dem
smtp-internal Netzwerk ohne Authentifizierung.3. Dual-Channel: Kritische Alerts gehen sowohl per Email als auch per Gotify Push.
4. Dead Man's Switch: Der tägliche Watchdog ist die Absicherung für alle anderen Kanäle.
Änderungen im Überblick
| Datei | Änderung |
|---|---|
monitoring/docker-compose.yml | AlertManager: smtp-internal Netzwerk |
alertmanager/alertmanager.yml | SMTP auf smtp-relay:25, Auth entfernt |
compose/docker-compose-traefik.yml | Backup: Shoutrrr-Notifications, Prometheus entfernt |
updates/docker-compose.yml | Watchtower: Shoutrrr-Parameter korrigiert |
security/docker-compose.yml | Wazuh-Exporter: depends_on mit Health-Condition |
updates/scripts/daily-watchdog.sh | NEU: Täglicher Watchdog (~200 Zeilen) |
/etc/cron.d/matzka-watchdog | NEU: Cron-Job (07:00 UTC) |
/etc/logrotate.d/watchdog | NEU: Log-Rotation |
Lessons Learned
auth=None funktioniert nicht, auth=none schon.
depends_on mit condition: service_healthy. Ein einfaches depends_on wartet nur auf den Container-Start, nicht auf dessen Gesundheit.
Geschrieben am 1. Februar 2026 | matzka.cloud Infrastructure Blog