Mailu individuell konfigurieren

Hinweis

Falsche Konfigurationen können zu Problemen beim Versand, oder Empfang durch Dritte führen!

Diese Anleitung wurde ursprünglich für Version 1.9 geschrieben und für 2.0 aktualisiert.
Ich möchte aber nicht ausschließen, dass ich etwas vergessen habe. Augen auf bei der Konfiguration!

Hinweis

Die Anleitung geht davon aus, dass Mailus Daten unter /srv/docker/mailu/data/ liegen.
Das ist kein muss, sollte nur bei Abweichungen berücksichtigt werden!

Vorwort

Mailu ist eine komplette E-Mailserver-Lösung basierend auf Docker. Hierbei werden alle nötigen Funktionen wie zum Beispiel SMTP (Postfix) , IMAP / POP3 (Dovecot), Filterregeln (Sieve), Antispam (Rspamd), Antivirus (ClamAV), Webmail (Roundcube), Fetchmail und auch ein modernes Verwaltungstool (Mailu Admin) bereitgestellt.
Alle Dienste laufen in eigenen Containern und kommunizieren über das Netzwerk miteinander. Weitere Details werden auf der Projektseite aufgezeigt.

Im Standardfall wird Mailu bereits durchaus gut und sinnvoll konfiguriert, womit die größten Anwendungsfälle bereits im Vorfeld abgedeckt sind. Allerdings ist der Wille nach nach individueller Konfiguration durchaus gerechtfertigt und darum soll es in diesem Artikel gehen.
Wie werden einzelne Dienste von Mailu konfiguriert, welche Möglichkeiten gibt es und was gibt es zu beachten.

Allgemeines zur Konfiguration

Die meisten Einstellungen die Mailu bereits unterstützt werden durch Umgebungsvariablen gesetzt und können hier eingesehen werden:

https://mailu.io/2.0/configuration.html

Für weitergehende Einstellungen die hierdurch nicht abgedeckt sind, bietet Mailu ein sehr gut nutzbares Verfahren von Überschreibungen an. Hierfür wird in den Docker-Containern ein Overrides Ordner angezogen. Je nach Containerart kann dies ggf. ein unterschiedlicher Pfad sein. Hierzu möchte ich im folgenden die einzelnen Container und Möglichkeiten der Konfiguration kurz und bündig beschreiben. Grundsätzlich finden sich alle override Verzeichnisse unterhalb von data.
Liegt das Data Verzeichnis zum Beispiel unter /srv/docker/mailu/data/, finden sich die override hier: /srv/docker/mailu/data/overrides.
Die Container mit override Support sind im docker-compose.yml File mit einem Mountpoint versehen…

Konfiguration der Komponenten

Redis

Weil es sich um das Standard Alpine Docker Image von Redis handelt, kann eine individuelle Konfigurationsdatei als Startparameter angegeben werden. Der Pfad ist hierbei frei zu wählen und die Datei muss noch eingehängt werden.

Dovecot (IMAP / POP3)

Pfad: /srv/docker/mailu/data/overrides/dovecot/dovecot.conf

Über die Datei /overrides/dovecot.conf können Anpassungen vorgenommen werden.
In der Standard-Konfigurationsdatei /etc/dovecot/dovecot.conf wird durch die unten stehende Zeile versucht die override Datei einzulesen. Existiert diese nicht, gibt es auch keinen Fehler.

!include_try /overrides/dovecot.conf

Postfix (SMTP)

Pfad: /srv/docker/mailu/data/overrides/postfix/

In Postfix können alle Einstellungen über den Ordner /overrides vorgenommen werden. Hierbei werden Einstellungen aus den Dateien /overrides/postfix.cf und /overrides/postfix.cf gelesen und mittels “postconf -e” gesetzt:

# File: /start.py

if os.path.exists("/overrides/postfix.cf"):
    for line in open("/overrides/postfix.cf").read().strip().split("\n"):
        os.system('postconf -e "{}"'.format(line))

if os.path.exists("/overrides/postfix.master"):
    for line in open("/overrides/postfix.master").read().strip().split("\n"):
        os.system('postconf -e "{}"'.format(line))

Zusätzlich werden im /overrides Ordner alle Maps mittels postmap kompiliert. Somit können Maps ebenfalls dort abgelegt werden, müssen lediglich die Endung .map im Dateinamen haben. Beim Start werden diese dann verarbeitet:

for map_file in glob.glob("/overrides/*.map"):
    destination = os.path.join("/etc/postfix", os.path.basename(map_file))
    shutil.copyfile(map_file, destination)
    os.system("postmap {}".format(destination))
    os.remove(destination)

Alle Maps bekommen nach der Bearbeitung eine .db-Endung, allerdings müssen die Dateien in der postfix.cf ohne die .db-Endung konfiguriert werden. Hier ein Beispiel:

# File: postfix.cf

transport_maps =  hash:/etc/postfix/transport.map
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd.map

smtp_sasl_auth_enable = yes
smtp_sasl_security_options = noanonymous

Rspamd

Pfad: /srv/docker/mailu/data/overrides/rspamd

Im override Ordner können Dateien abgelegt werden, welche zum Containerstart vom start.py Script nach /etc/rspamd/local.d kopiert werden.

Clamav

Hier gibt es keine Überschreibungsoptionen, allerdings können die Dateien freshclam.conf und clamd.conf des Ordners /etc/clamav überschrieben (gemountet) werden. Hier die Schritte wie es zum Beispiel gemacht werden kann:

Datei laden und editieren
# Datei aus dem Container laden
mkdir -p /srv/mailu/override/antivirus/clamd.conf
docker cp mailu_antivirus_1:/etc/clamav/clamd.conf /srv/mailu/override/antivirus/

# Anpassungen vornehmen
vim clamd.conf

In der docker-compose.yml muss die Datei nun hinterlegt werden:

  antivirus:
    ...
    volumes:
      - "/srv/mailu/data/filter:/data"
      - "/srv/mailu/override/antivirus/clamd.conf:/etc/clamav/clamd.conf"

Ein Neuerstellen des Containers ist notwendig!

Webmail (Roundcube)

Pfad: /srv/docker/mailu/data/overrides/roundcube

Roundcube ist nicht verpflichtend, aber hat man diesen Webmailer gewählt, können Einstellungen vorgenommen werden, indem die folgenden Dateien kopiert, editiert und eingehangen (mounted) werden:

/php.ini
/var/www/html/config/config.inc.php

Nachwort zur Konfiguration

Hinweis

Wenn man sich dazu entscheidet, Konfigurationsdateien aus den Containern zu kopieren und im Anschluss zu überlagern (mounten), kann dies zu Fehlern, oder nachgelagerten Problemen führen, weil sich das Verhalten der Container ändert.

Anpassungen die im Upstream Image passieren, können dann in den eigenen Dateien nicht mehr enthalten sein. Dies betrifft vor allem wichtige Sicherheitseinstellungen. Deshalb hier ein möglicher Weg damit umzugehen, der bei jedem Update (Image-Update) durchgeführt werden sollte:

  • Update der Container (docker-compose pull && docker-compose up -d)
  • Kopieren der Dateien aus den Containern
  • Anhängen neuer Einstellungen oder Überschreiben der Optionen
  • Einhängen der neuen Dateien durch Neustart der Docker-Container

Docker Compose anpassen

Mit einer docker-compose.override.yml können alle Werte des originalen Compose Files überschrieben / angepasst werden.
Dies ist dann sinnvoll, wenn man beispielsweise die Ports vom Front Container entfernen, Volumes an Container hängen möchte oder die IP-Adressen / Netze der Container statisch setzen.

Ein denkbares Beispiel könnte sein, dass der Front Container eine feste IP-Adresse erhalten soll, damit ein vorgelagerter Nginx eine feste IP-Adresse zum verbinden kennt.

Deshalb hier ein Beispiel Override File. Das Subnetz des default Netzes steht bereits im docker-compose.yml File (10.33.0.0/24), aber die anderen bridges (webmail, noinet sollen erweitert werden)

version: "3.4"

services:
  front:
    # remove uneeded port bindings
    ports: !reset []
    networks:
      default:
        ipv4_address: 10.33.0.253


# set static ip addresses / static bridge names
networks:
  default:
    driver_opts:
      com.docker.network.bridge.name: br_mailu
  webmail:
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: 10.33.1.0/24
    driver_opts:
      com.docker.network.bridge.name: br_mailu_web
  noinet:
    driver: bridge
    internal: true
    ipam:
      driver: default
      config:
        - subnet: 10.33.2.0/24
    driver_opts:
      com.docker.network.bridge.name: br_mailu_noinet

Beim Hochfahren werden die docker-compose.yml und docker-compose.override.yml zusammengeführt (merged).
Da Listenelemente wie die Ports nur ergänzt, aber nicht entfernt werden können, gibt es in neueren Compose versionen die !reset Funktion. Nähere Informationen finden sich hier: https://docs.docker.com/compose/compose-file/13-merge/#reset-value

Setup-Tool zum genrieren eines Docker-Compose Files für Mailu https://setup.mailu.io/2.0/setup/

Dokumentation von Mailu https://mailu.io/2.0/

Github Projekt https://github.com/Mailu/Mailu