Docker Logo

Mailserver mit Docker aufbauen

Die Tage stand der Aufbau eines neuen Mailserver an, da die alte Hardware abgeschaltet werden musste. Der alte Server war doch sehr individuell aufgebaut mit Vimbadmin/MySQL und andere Dinge.
Das Setup lief über einige Jahre sehr stabil und er wurde auch nicht von Hackern übernommen oder andere unangenehme Dinge sind nicht auf dem Server passiert.

Nun war es an der Zeit einen neuen aufzubauen in einer virtuellen Maschine auf Proxmox. Die neue Maschine mit einer eigene IP-Adresse war schnell aufgebaut mit Ubuntu 20.04. Da ich die letzten Monate sehr viel mit Docker gemacht hatte, lag es ja schon fast auf der Hand, einen Server auf Basis von Docker Container aufzubauen. Es ging die Sucherei los im Netz und bin dann auf mailu.io aufmerksam geworden.

Die Funktionsbeschreibung aus Github:

  • Standard email server, IMAP and IMAP+, SMTP and Submission
  • Advanced email features, aliases, domain aliases, custom routing
  • Web access, multiple Webmails and administration interface
  • User features, aliases, auto-reply, auto-forward, fetched accounts
  • Admin features, global admins, announcements, per-domain delegation, quotas
  • Security, enforced TLS, Letsencrypt!, outgoing DKIM, anti-virus scanner
  • Antispam, auto-learn, greylisting, DMARC and SPF
  • Freedom, all FOSS components, no tracker included

Was benötigen wir :

  • Einen VServer mit ca. 2GB RAM besser 4GB mit ROOT Zugriff (Siehe Screenshot unten)
  • Eine IPV4 IP-Adresse
  • Einen MX-Record Eintrag für exemplarisch  mail.<DeineDomain.de>
  • Software Docker und Docker Compose 
  • Ein Linux Server mit Ubuntu oder andere Distribution

Hinweis zum Schwierigkeitsgrad: Wer das ganze auf einer virtuellen Maschine im Heimnetz aufbauen möchte, braucht gute Kenntnisse über Portforwarding am Router (z.B. Fritzbox) und DNS-Namensauflösung. Der Aufbau im Heimnetz ist nicht unproblematisch. Besser man mietet sich einen einfach VServer im Netz und probiert es damit mal aus. Hier wäre Amazon AWS oder Google Cloud klar im Vorteil was die erfolgreiche Umsetzung betrifft.  

Was mir gut gefallen hat dass es einen Online Konfigurator gibt mit dem sich zwei Dateien automatisiert erstellen lassen, erreichbar unter dieser URL: https://setup.mailu.io/1.7/ 

Darüber hinaus gibt es ein sehr tolles Admintool zur Verwaltung der Maildomains, Mailkonten, Benutzerpasswörter, Aliases und noch mehr. Somit ist kein Plesk, cPanel oder anderer kostenpflichtiger Kram nötig. Die SPAM-Erkennung war mir ebenfalls sehr wichtig und diese sollte automatisiert SPAM aus den JUNK-Ordner der Mailbox erlernen können. 

Zur Auswahl steht :

  • Docker Compose
  • Docker Stack

Hinweis:

Werde in diesen Artikel nicht mehr auf die Installation von Docker eingehen. Es gibt hierzu viel Dokumentation im Netz. Hier ein paar Links :

Setup für Docker-Compose

Am Ende der Webseite dann “Setup” klicken. Es werden 2 Dateien generiert die dann per Command Line im Linux Shell einfach mit Copy+Paste übergeben werden.

Mailu Setup Datei herunterladen
# Mailu main configuration file   /mailu.env 
#
# This file is autogenerated by the configuration management wizard for compose flavor.
# For a detailed list of configuration variables, see the documentation at
# https://mailu.io

###################################
# Common configuration variables
###################################

# Set to a randomly generated 16 bytes string
SECRET_KEY=XXXXXXXXXX

# Subnet of the docker network. This should not conflict with any networks to which your system is connected. (Internal and external!)
SUBNET=192.168.203.0/24

# Main mail domain
DOMAIN=example.de

# Hostnames for this server, separated with comas
HOSTNAMES=mail.example.de,mail.example.com,mail.example.net

# Postmaster local part (will append the main mail domain)
POSTMASTER=admin

# Choose how secure connections will behave (value: letsencrypt, cert, notls, mail, mail-letsencrypt)
TLS_FLAVOR=letsencrypt

# Authentication rate limit (per source IP address)
AUTH_RATELIMIT=10/minute

# Opt-out of statistics, replace with "True" to opt out
DISABLE_STATISTICS=False

###################################
# Optional features
###################################

# Expose the admin interface (value: true, false)
ADMIN=true

# Choose which webmail to run if any (values: roundcube, rainloop, none)
WEBMAIL=roundcube

# Dav server implementation (value: radicale, none)
WEBDAV=none

# Antivirus solution (value: clamav, none)
ANTIVIRUS=clamav

###################################
# Mail settings
###################################

# Message size limit in bytes
# Default: accept messages up to 50MB
# Max attachment size will be 33% smaller
MESSAGE_SIZE_LIMIT=50000000

# Networks granted relay permissions
# Use this with care, all hosts in this networks will be able to send mail without authentication!
RELAYNETS=

# Will relay all outgoing mails if configured
RELAYHOST=

# Fetchmail delay
FETCHMAIL_DELAY=600

# Recipient delimiter, character used to delimiter localpart from custom address part
RECIPIENT_DELIMITER=+

# DMARC rua and ruf email
DMARC_RUA=admin
DMARC_RUF=admin

# Welcome email, enable and set a topic and body if you wish to send welcome
# emails to all users.
WELCOME=false
WELCOME_SUBJECT=Welcome to your new email account
WELCOME_BODY=Welcome to your new email account, if you can read this, then it is configured properly!

# Maildir Compression
# choose compression-method, default: none (value: bz2, gz)
COMPRESSION=
# change compression-level, default: 6 (value: 1-9)
COMPRESSION_LEVEL=

# IMAP full-text search is enabled by default. Set the following variable to off in order to disable the feature.
# FULL_TEXT_SEARCH=off

###################################
# Web settings
###################################

# Path to redirect / to
WEBROOT_REDIRECT=/

# Path to the admin interface if enabled
WEB_ADMIN=/admin

# Path to the webmail if enabled
# Path to redirect / to
WEBROOT_REDIRECT=/

# Path to the admin interface if enabled
WEB_ADMIN=/admin

# Path to the webmail if enabled
WEB_WEBMAIL=/webmail

# Website name
SITENAME=Mail

# Linked Website URL
WEBSITE=https://mail.example.de



###################################
# Advanced settings
###################################

# Log driver for front service. Possible values:
# json-file (default)
# journald (On systemd platforms, useful for Fail2Ban integration)
# syslog (Non systemd platforms, Fail2Ban integration. Disables `docker-compose log` for front!)
# LOG_DRIVER=json-file

# Docker-compose project name, this will prepended to containers names.
COMPOSE_PROJECT_NAME=mailu

# Default password scheme used for newly created accounts and changed passwords
# (value: PBKDF2, BLF-CRYPT, SHA512-CRYPT, SHA256-CRYPT)
PASSWORD_SCHEME=PBKDF2

# Header to take the real ip from
REAL_IP_HEADER=

# IPs for nginx set_real_ip_from (CIDR list separated by commas)
REAL_IP_FROM=

# choose wether mailu bounces (no) or rejects (yes) mail when recipient is unknown (value: yes, no)
REJECT_UNLISTED_RECIPIENT=

# Log level threshold in start.py (value: CRITICAL, ERROR, WARNING, INFO, DEBUG, NOTSET)
LOG_LEVEL=WARNING

###################################
# Database settings
###################################
DB_FLAVOR=sqlite
Hinweis zur Datei mailu.env :

In der Zeile HOSTNAME muss als erster Eintrag der Hostname eingetragen werden, wie er im MX-Record des DNS-Server eingetragen ist. Außerdem meldet sich der SMTP-Server mit diesen Hostnamen bei anderen Mailservern, ein sogenannter der SMTP Banner. Wichtig ist hier: Werden mehrere Domains auf dem Docker Container betrieben, müssen diese alle unter HOSTNAME mit dem MX-Record Namen eingetragen werden. Beim starten des Containers werden für ALLE eingetragenen Domains ein Letsencrypt Zertifikat erstellt:

Dh: “mail.example.de” ist die Hauptdomain und der Container erstellt ein Letsencrypt Zertifikat. Der Mailserver ist dann per IMAP/POP3/SMTP mit einem gültigen Zertifikat für mail.example.de erreichbar.

Zweites Beispiel mit einer weiteren Domain “mail.example.com”. Beim Starten des Containers erstellt Letsencrypt ein Zertifikat für die Domain “mail.example.com”. Der Server ist dann ebenfalls mit IMAP/POP3/SMTP mit einen gültigen Zertifikat für mail.example.com erreichbar. 

Dies ist wichtig das so einzurichten und zu verstehen, da Mailprogramme wie z.B. Thunderbird beim einrichten eines Mailkonto automatisch für die Domain die passend Server suchen. Anhand der Mailadresse als Beispiel “info@example.com” findet Thunderbird die dazugehörigen Mailserver für IMAP/POP3/SMTP automatisch und das mit Verschlüsselung (TLS/SSL/STARTTLS). Ja ich weiss , es halten sich nicht alle Programme daran und das unter Windows/Mac, Smartphone und Tablet mit OSX und Android. Nur Thunderbird macht es richtig gut und wurde erfolgreich von mir so getestet. 

Wenn die Dateien “docker-compose.yml + mailu.env”  auf dem lokalen Rechner nun heruntergeladen wurden, kann man es einfach starten.

Folgenden Befehl zum starten der Container ausführen:

cd /mailu
docker-compose -p mailu up -d

 

 

 

 

 

 

Um sich an der Webadmin Zugang anmelden zu können müssen wir noch einen Benutzer anlegen:

docker-compose -p mailu exec admin flask mailu admin admin example.de PASSWORD

Erst jetzt ist es möglich auf der Admin Webseite sich anzumelden und weitere Unterseiten wie /webmail und /admin/antispam sind erreichbar. Anbei ein paar Screenshots der Anwendungen.

 

Anmeldung am Adminzugang zur Verwaltung
Domain Übersicht inkl. Konten
SPAM-Filter Aktivität
Webmail mit Roundcube

Sehr hilfreich ist auch die Webseite /admin/ui/client , die hilft zur Einrichtung der Mailclients wenn es automatisiert nicht klappen sollte.

Mailclient Einrichtungshilfe
Speicher und Prozessorauslastung
Speicher- und Prozessorauslastung

Der Mailserver ist nun Online und es können Mailkonten eingerichtet werden. Es gibt dann noch ein paar Dinge die gemacht werden müssen für SPF/DMARC/DKIM, diese beschreibe ich in einem weiteren Artikel.

Hinweis und Randnotiz: Dieser Artikel beschreibt genau eine Möglichkeit von vielen wie man einen Mailserver aufbaut und in den Betrieb nimmt. Er soll keinen Anspruch erheben dass diese Methode, Installation, Aufbau und Konfiguration der ultimative Tipp ist. Jeder darf frei entscheiden was er tut oder nicht tut und ist dafür auch selbst verantwortlich. Eine Haftung ist ausgeschlossen. In diesen Artikel geht es um Wissen zu teilen und für die Allgemeinheit zur Verfügung zu stellen.

Ich bekomme auch immer wieder Mails auf meinem Blog, dass ich von bestimmten Dingen keine Ahnung habe. Ja stimmt , ich bin nicht allwissend und wenn ein Experte meinen Artikel liest wundert er sich. Ich selbst erhebe nicht den Anspruch alles zu wissen oder alles zu können. Aber zu vielen Anderen hab ich keine Angst mich mit neuen Themen zu beschäftigen und mein Wissen hier “kostenlos ohne Werbung” zu Teilen. Etwas mehr Wertschätzung und Demut würde den einen oder anderen Menschen gut tun.

Beste Grüße , Joachim 

Kommentar hinterlassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.