Mailcow Installation
Vorbereitungen
Als erstes müssen wir prüfen ob bereits etwas auf den von Mailcow verwendeten Ports läuft:
netstat -tulpn | grep -E -w '25|80|110|143|443|465|587|993|995'
sollte hier wie bei mir etwas angezeigt werden:
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 573/exim4
müssen wir den service runterfahren. In meinem Fall möchte ich sowieso postfix nutzen und diesem ein Relayen über den mailcow postfix erlauben, also installiere ich als erstes postfix nach:
apt-get install postfix
Ich wähle bei der ersten Frage "Local Only" aus, dann ist es wichtig, das der abgefragte Hostname nicht der selbe ist, den ihr bei Mailcow als Hostname verwenden wollt. Ich nutze hier den Servernamen plus local vornedran (local.vs.example.tld) und mailcow bekommt den eigentlichen Servernamen (vs.example.tld). Die restlichen Fragen, außer der nach der Root und Postmaster Mailadresse habe ich einfach den Standard belassen.
Nun muss man Postfix sagen, das er nicht auf Port 25 lauschen soll. Dies geschieht in dem man in der folgenden Datei die Zeile auskommentiert:
/etc/postfix/master.cf
#smtp inet n - y - - smtpd
nun richten wir schoneinmal den Relay ein:
postconf -e 'relayhost = 172.22.1.1'
postconf -e "mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128"
postconf -e "inet_interfaces = loopback-only"
postconf -e "relay_transport = relay"
postconf -e "default_transport = smtp"
Nach einem
systemctl restart postfix
sollte dann der Befehl
netstat -tulpn | grep -E -w '25|80|110|143|443|465|587|993|995'
nichts mehr anzeigen.
DNS Konfiguration
Jeder Mail Server funktioniert nur mit den richtigen DNS Einträgen. Deshalb müssen nun ein Paar Einträge erstellt werden. Als erstes muss der Reverse DNS Eintrag gesetzt werden. Dieser muss dem Mailcow Hostname entsprechen. In Meinem Fall ist das vs.example.tld . Die IP des Servers muss nun mittels:
dig -x IPADRESSE
auf den Servernamen zeigen: vs.example.tld Nun noch die DNS Einträge selbst einrichten, erstmal minimal:
# Name Type Value vs IN A 1.2.3.4(IPADRESSE) mx IN CNAME vs autodiscover IN CNAME mx autoconfig IN CNAME mx @ IN MX 10 mx @ IN TXT "v=spf1 a mx ~all"
Installation
Ist nun alles vorbereitet, geht es los mit dem Setup.
cd /opt
git clone https://github.com/mailcow/mailcow-dockerized
cd mailcow-dockerized
./generate_config.sh
Bei der Abfrage des Hostnamen bitte vs.example.tld, also euren gewählten A Record eintragen. Die TimeZone sollte stimmen und kann einfach bestätigt werden.
Nun richten wir noch die Benachrichtungsmailadresse von Watchdog ein:
mailcow.conf
WATCHDOG_NOTIFY_EMAIL=yourmail@example.tld
Da wir sonst erstmal nichts einrichten müssen, können wir nun einfach per docker compose das ganze hochfahren:
docker-compose pull
docker-compose up -d
Im Anschluss sollte unter https://vs.example.tld das Webinterface von Mailcow aufrufbar sein. Das erste. Einloggen erreicht ihr mit dem Benutzer admin
und als Passwort moohoo
. Dieses am besten als allererstes ändern.
Konfiguration
Um nun loslegen zu können, einfach als admin einloggen und eine Mail Domain anlegen. Zu jeder Domain kann man dann Postfächer einrichten, oder einfach aliase auf bestehende E-Mail Adresse konfigurieren.
- Domainen anlegen
- Posfächer anlegen
- Aliases einrichten
und schon kann ein erster Mailingtest stattfinden. Das Tool selbst ist sehr mächtig deshalb am besten, falls es nicht selbsterklärend ist einfach die Dokumentation lesen.
Feintuning
DKIM
Als erstes kann man für jede Domain unter Konfiguration/Konfiguration einen DKIM Key generieren. Der Output kann dann einfach als DNS TXT Record verwendet werden.
dkim._domainkey IN TXT "v=DKIM1; k=rsa; t=s; s=email; p=..."
DMARC
Im DNS kann nun noch ein DMARC Record eingetragen werden:
_dmarc IN TXT "v=DMARC1; p=reject; rua=mailto:postmaster@example.tld"
Testing
Testen kann man alles dann am besten mit
einfach eine E-Mail von eurem neuen Postfach des Mailcow Servers an die angezeigte E-Mail Adresse senden. Eine Score von 10/10 sollte mit den oben stehenden Dingen funktionieren!
Update von Mailcow
Das Update ist dank eine Update Skriptes sehr einfach.
cd /opt/mailcow-dockerized/
./update.sh
NGINX als Reverse Proxy
Wenn man mehr als nur eine Webseite auf dem Docker Host betreiben möchte, muss man mit einem Reverse Proxy arbeiten. Um mailcow über einen Reverse Proxy verfügbar zu machen muss als erstes das Port Mapping umkonfiguriert werden.
/opt/mailcow-dockerized/mailcow.conf
# You should use HTTPS, but in case of SSL offloaded reverse proxies: # Might be important: This will also change the binding within the container. # If you use a proxy within Docker, point it to the ports you set below. HTTP_PORT=8080 HTTP_BIND=127.0.0.1 HTTPS_PORT=8443 HTTPS_BIND=127.0.0.1
das bindet die Ports auf localhost.
nun die Konfiguration aktivieren:
cd /opt/mailcow-dockerized
docker-compose up -d
Nun kann der Nginx Reverse Proxy eingerichtet werden:
Die richtige vhost Konfiguration für mailcow sieht wie folgt aus:
/opt/nginxproxy/data/nginx/conf/vs.laub-home.de.conf
server { listen 80 default_server; listen [::]:80 default_server; server_name mx.example.tld autodiscover.* autoconfig.*; return 301 https://$host$request_uri; } server { listen 443 ssl; listen [::]:443 ssl default_server; server_name mx.example.tld autodiscover.* autoconfig.*; ssl_certificate /etc/ssl/mail/cert.pem; ssl_certificate_key /etc/ssl/mail/key.pem; include /etc/nginx/conf.d/includes/site-defaults.conf; expires $expires; location /Microsoft-Server-ActiveSync { proxy_pass http://127.0.0.1:8080/Microsoft-Server-ActiveSync; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_connect_timeout 75; proxy_send_timeout 3650; proxy_read_timeout 3650; proxy_buffers 64 256k; client_body_buffer_size 512k; client_max_body_size 0; } location / { proxy_pass http://127.0.0.1:8080/; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; client_max_body_size 0; proxy_buffer_size 128k; proxy_buffers 64 512k; proxy_busy_buffers_size 512k; } }
Achtung!!! Da hier die Zertifikate von mailcow benutzt werden, müssen diese in den Container gemappt werden, also in der docker-compose.yml
folgende Zeile bei den Volumes eingefügt werden:
volumes: - /opt/mailcow-dockerized/data/assets/ssl:/etc/ssl/mail/:ro
Nach einem Neustart des Nginxproxy Containers sollte mailcow wieder wie gewohnt von extern verfügbar sein.
Mailcow Backup einrichten
Mailcow bringt von Haus aus schon ein Backup Script mit.
cd /opt/mailcow
mkdir /backup/mailcow
MAILCOW_BACKUP_LOCATION=/backup/mailcow ./helper-scripts/backup_and_restore.sh backup all --delete-days 3
Um das Ganze automatisch einzurichten, erstellen wir einfach einen cronjob:
/etc/cron.d/mailcow-backup
# # Regular cron job for the Mailcow Backup # 0 1 * * * root MAILCOW_BACKUP_LOCATION=/backup/mailcow /opt/mailcow-dockerized/helper-scripts/backup_and_restore.sh backup all --delete-days 3 > /dev/null
Restore
Der Restore geht dann ebenfalls über das Script:
./helper-scripts/backup_and_restore.sh restore
IMAP Postfächer von altem Server migrieren
Wer sein E-Mail Postfach von einem anderen Server mitbringt, kann dieses, dank integriertem imapsync
direkt aus der Mailcow Admin GUI migrieren. Dies geht einfach unter:
Konfiguration --> E-Mail-Setup --> Synchronisation
Hier einfach einen neuen Synchronisationsjob anlegen und warten bis dieser startet.