Postfix gehört vermutlich immer noch zu den am weitesten verbreiteten freien SMTP-Servern. Wer einen Emailserver selber hostet und die Menge an ein- und ausgehenden Emails im Blick haben möchte, stößt schnell auf das Tool Mailgraph von David Schweikert. Mailgraph besteht aus einem Perl-Skript, das die Logfiles von Postfix auswertet und eine RRDtool-Datenbank befüllt und einem CGI-Skript, welches die Daten in Form von Grafiken übersichtlich im Browser darstellt.

Mailgraph Screenshot

Neben der Anzahl der gesendeten und empfangenen Emails gibt es auch eine Grafik zu Spam und Viren.

Dank eines Patches von Sebastian van de Meer informiert Mailgraph auch darüber, ob die einliefernden Server SPF, DMARC oder DKIM unterstützen. Hierfür ist natürlich erforderlich, dass diese Mechanismen auf eurer Postfix-Instanz konfiguriert sind.

SPF, DKIM, DMARC

Docker Container

Um Mailgraph und dazu einen entsprechenden Webserver nicht direkt auf seinem Emailserver installieren zu müssen, kann man es natürlich in einem Docker Container betreiben.

Dazu habe ich ein Dockerfile erstellt, welches alle Abhängigkeiten enthält und sofort eingesetzt werden kann. Als Volumes gibt man den Pfad zum Mail-Logfile sowie einen Ordner zum Speichern der RRD-Dateien an. Alternativ kann man hierzu natürlich auch ein Docker Volume verwenden.

Über das -v Flag hängt man Host-Pfade oder Volumes in den Container ein: -v [Host-Path]:[Container-Path]

Die Log-Datei wird im Container unter dem Pfad /var/log/mail/mail.log erwartet, die RRD-Dateien unter /var/www/mailgraph/rrd/.

Das Image liefert standardmäßig auf Port 80 und Pfad /mailgraph die Mailgraph-Webseite aus.

docker run --rm \
  -v /var/log/mail/mail.log:/var/log/mail/mail.log \
  -v /var/data/mailgraph/rrd/:/var/www/mailgraph/rrd/ \
  davidullrich/mailgraph:latest

Ruft man nun http://localhost:80/mailgraph/ im Browser auf, bekommt man schon die ersten Grafiken angezeigt.

Docker Compose

Nutzt man zur Orchestrierung Docker Compose, sieht eine entsprechende Konfiguration etwa so aus:

version: '3'

services:
  mailgraph:
    image: davidullrich/mailgraph:latest
    hostname: mail.example.com
    volumes:
      - /var/log/mail/mail.log:/var/log/mail/mail.log
      - /var/data/mailgraph/rrd/:/var/www/mailgraph/rrd/
      - /etc/localtime:/etc/localtime:ro
    restart: unless-stopped

Reverse Proxy mit Traefik

Möchte man seine Mailgraph-Webseite nicht öffentlich zugänglich sehen, kann man mittels Reverse Proxy eine Authentifizierung einrichten. Eine einfache Möglichkeit bietet Traefik, ein Reverse Proxy, der sich sehr schön in Docker Compose integrieren lässt. Hat man Traefik auf seinem System eingerichtet, ist die Konfiguration für Mailgraph über Labels sehr einfach.

version: '3'

services:
  mailgraph:
    image: davidullrich/mailgraph:latest
    hostname: mail.example.com
    volumes:
      - /var/log/mail/mail.log:/var/log/mail/mail.log
      - /var/data/mailgraph/rrd/:/var/www/mailgraph/rrd/
      - /etc/localtime:/etc/localtime:ro
    restart: unless-stopped
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.mailgraph-router.rule=Host(`mail.example.com`) && PathPrefix(`/mailgraph`)"
      - "traefik.http.routers.mailgraph-router.entryPoints=websecure"
      - "traefik.http.routers.mailgraph-router.service=mailgraph-service"
      - "traefik.http.services.mailgraph-service.loadBalancer.server.scheme=http"
      - "traefik.http.services.mailgraph-service.loadBalancer.server.port=80"
      - "traefik.http.routers.mailgraph-router.middlewares=mailgraph-middleware-auth"
      - "traefik.http.middlewares.mailgraph-middleware-auth.basicauth.users=user:[password-hash]"

Dovecot-Erweiterung

Da ich als IMAP-Server Dovecot einsetze, habe ich Mailgraph um die Möglichkeit erweitert, die Anzahl der erfolgreichen und fehlgeschlagenen IMAP-Logins anzuzeigen.

Dovecot Logins

Sourcecode und Docker Image

Den Sourcecode zu dem Docker Image findet ihr auf GitHub, das fertige Image im Docker Hub.