Mailcow Installation

Aus Laub-Home Wiki

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.

  1. Domainen anlegen
  2. Posfächer anlegen
  3. 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.