Wer einen eigenen Mailserver betreibt, kennt das Problem: Alles scheint zu funktionieren — bis plötzlich keine Mails mehr ankommen. Festplatte voll, Zertifikat abgelaufen, Spamfilter falsch konfiguriert — die Ursachen sind vielfältig und oft nicht sofort sichtbar. Genau dafür habe ich eine Überwachungslösung entwickelt: Sie prüft automatisch alle 60 Sekunden ob der Mailserver gesund ist und schlägt Alarm, bevor etwas ausfällt. 246 Prüfpunkte, 19 fertige Dashboards, komplett Open Source — und in 5 Minuten installiert.
Voraussetzung ist neben einem laufenden Mailcow-Server ein Zabbix-Monitoring-Server — ein weit verbreitetes Open-Source-Tool zur Serverüberwachung. Der Zabbix Agent wird auf dem Mailserver installiert und meldet die gesammelten Daten an den Zabbix Server, der sie speichert, auswertet und bei Problemen benachrichtigt.
Was steckt drin?
Ein einziger Python-Collector läuft alle 60 Sekunden, sammelt 246 Metriken aus 22 Modulen und schreibt sie in eine JSON-Datei. Der Zabbix Agent liest nur noch — kein Docker-Zugriff, kein sudo, keine Sicherheitslücke.
Das wird überwacht:
- Postfix: Queue-Größe, Connections, Deferred/Bounced, Log-Analyse (SASL-Fehler, Relay-Denied, TLS-Probleme)
- Postscreen: Pass/Reject/DNSBL/Pregreet — automatisch erkannt, zeigt 0 wenn nicht aktiv
- Dovecot: Verbindungen, Login-Fehler, IMAP-Disconnects, Quota-Warnungen
- Rspamd: Spam vs. Ham, Greylist, Reject-Rate — und neu: Bayes-Training-Status. Zeigt dir ob dein Spamfilter überhaupt trainiert wird (untrained/low/unbalanced/good/excellent)
- ClamAV: Signatur-Alter, DB-Größe, Version
- Watchdog: Health-Status für alle 15 Mailcow-Services
- Docker: CPU, RAM, Restarts pro Container via Low-Level-Discovery
- TLS/Zertifikate: HTTPS, IMAPS, Submission — Tage bis Ablauf
- DNS & Security: SPF, DKIM, DMARC plus Security Audit Score (0-7) mit DANE/TLSA, MTA-STS, TLS-RPT und BIMI
- Mailboxen & Domains: Quota-Nutzung pro Mailbox und Domain (LLD)
- Backup: Alter, Größe, Anzahl, fehlende Backups
- Weitere Module: Quarantine, Queue, Sync Jobs, SOGo/Memcached, Updates
Anomalie-Erkennung statt fester Schwellwerte
Klassisches Problem: Ein fester Trigger „Alarm bei >100 Mails“ alarmiert am Montagmorgen grundlos, übersieht aber einen Spam-Angriff am Sonntag.
Die Lösung: Baseline-Trigger mit trendavg(). Das Monitoring lernt automatisch was normal ist und alarmiert erst bei Abweichungen — z.B. 5× mehr Received als üblich oder unter 20% des Wochendurchschnitts (→ DNS-Problem?). Braucht eine Woche Anlernzeit, funktioniert danach ohne manuelle Pflege.
| Metrik | Spike-Alarm | Drop-Alarm |
|---|---|---|
| Received | >5× Wochenschnitt | <20% Wochenschnitt |
| Rejected | >10× Wochenschnitt | — |
| Bounced | >5× Wochenschnitt | — |
| Deferred | >5× Wochenschnitt | — |
Security Audit Score
Neben den klassischen DNS-Checks (SPF, DKIM, DMARC) prüft das Monitoring auch die erweiterten Mail-Security-Standards. Pro bestandenem Check gibt es einen Punkt — maximal 7:
| Check | DNS-Record |
|---|---|
| SPF | TXT auf Domain |
| DKIM | TXT auf dkim._domainkey.domain |
| DMARC | TXT auf _dmarc.domain |
| DANE/TLSA | TLSA auf _25._tcp.hostname |
| MTA-STS | TXT auf _mta-sts.domain |
| TLS-RPT | TXT auf _smtp._tls.domain |
| BIMI | TXT auf default._bimi.domain |
Trigger warnt automatisch bei einem Score unter 3.
Bayes-Training im Blick
Viele Mailcow-Nutzer wissen nicht, ob ihr Rspamd-Bayes-Filter überhaupt trainiert wird. Das Monitoring zeigt dir auf einen Blick:
- Ham/Spam gelernt: Wieviele Nachrichten hat der Filter als Ham bzw. Spam gelernt?
- Ratio: Ist das Training ausgewogen? (Ideal: 40-60% Ham)
- Status:
untrained→low→unbalanced→good→excellent
Rspamd empfiehlt mindestens 200 Ham + 200 Spam für zuverlässige Erkennung — ein Trigger warnt automatisch wenn das nicht erreicht ist.
19 Dashboard-Pages
Jedes Modul hat eine eigene Dashboard-Page mit vorkonfigurierten Graphen — vom Mail-Volumen über Bayes-Training bis zu Postscreen-Blocks. Template importieren, Host zuweisen, fertig.
Architektur
systemd Timer (60s) → mailcow-collector.py (ROOT)
↓
JSON-Dateien (world-readable)
↓
Zabbix Agent 2 → mailcow-reader.sh → JSON lesen
Sauber getrennt: Der Collector braucht Root für Docker/MySQL. Der Zabbix Agent liest nur JSON — kein UnsafeUserParameters, kein AllowRoot. MySQL-Passwörter werden über Environment-Variablen übergeben statt auf der Kommandozeile.
Installation in 5 Minuten
sudo ./install.sh
# Template in Zabbix importieren, Host zuweisen
systemctl start mailcow-monitor.service
systemctl restart zabbix-agent2
Zahlen auf einen Blick
| UserParameters | 246 |
| Template Items | 303 + 21 LLD-Prototypen |
| Trigger | 71 (inkl. 5 Baseline-Anomalie) |
| LLD Discovery Rules | 4 (Domains, Mailboxen, Sync Jobs, Docker) |
| Dashboard-Pages | 19 |
| Collector | 1 Python-Script, 1831 Zeilen |
| Zabbix-Version | 7.0 |
Das Projekt ist Open Source (GPLv3) und auf GitHub verfügbar:
https://github.com/linuser/Mailcow-Zabbix-Monitoring
Created with Open Source and ❤ — Alexander Fox | PlaNet Fox





