Subsections of Mailu
Mails über Relayhost versenden
Falsche Konfigurationen, oder die Wahl eines unpassenden Relayhosts können zu Problemen beim Versand, oder Empfang durch Dritte führen!
Vorwort
Um E-Mails über einen externen Server zu versenden, bietet Mailu native Umgebungsvariablen für den SMTP Docker-Container an.
Mit diesen kann festgelegt werden über welchen Server versendet werden soll und ob eine Authentifizierung erfolgen muss.
allgemeiner Versand via Relayhost
# File: mailu.env
# Adresse / IP des Relay Hosts
RELAYHOST=1.2.3.4
# user:password
RELAYUSER=user@my-domain.de:mein_passwort
Manche Hoster nutzen auch keine E-Mailadresse zum Authentifizieren
RELAYUSER=postfach1234:mein_passwort
In diesem Beispiel werden alle E-Mails die nicht lokal zugetellt werden können über den Relay-Host versendet!
bestimmte Ziele per Relay
In manchen Fällen möchte man nur bestimmte Domains über einen Relay versenden, weil ein Hoster E-Mails von der eigenen IP-Adresse nicht akzeptiert. In diesem Fall funktioniert die Anleitung oben nicht, sondern man muss etwas mehr konfigurieren.
Folgende Schritte sind notwendig
- Postfix Map mit Transport pro Domain und Relay Host konfigurieren
- Postfix zum nutzen der Map konfigurieren
- Authentifizierung hinterlegen (falls notwendig)
#File: postfix.cf
# Transport-Ziele in transport.map hinterlegen
transport_maps = hash:/etc/postfix/transport.map
# Passwort pro Relay-Server
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd.map
# Authentifizierung aktivieren
smtp_sasl_auth_enable = yes
# deaktivieren von verschlüsselten Passwörtern, die Transport-Verschlüsselung ist aktiviert, Passwörter müssen oft im Klartext genutzt werden
smtp_sasl_security_options = noanonymous
# File: transport.map
t-online.de smtp:irgend.ein.smtp-server.com
test.de smtp:1.2.3.4
# File: sasl_passwd.map
irgend.ein.smtp-server.com myuser@smtp-xy.com:mein_p4ssword
1.2.3.4 postfachx:super_sicher!
Nach der Konfiguration
Im Anschluss muss der SMTP Container neugestartet werden, oder sogar neu erstellt werden, falls die Option mit Docker Variablen genutzt wurde:
# Fall: Docker Variablen, Neubau des Containers
docker-compose up -d
# Fall: postfix.cf und Maps
docker-compose restart smtp
Mailu individuell konfigurieren
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!
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
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
Links
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