mailcow dockerized
Was ist mailcow?
Wo sind die Quellen zu finden?
Voraussetzungen
Docker
Check ob benötigte Ports offen und verfügbar sind
sudo netstat -tulpn | grep -E -w '25|80|110|143|443|465|587|993|995|4190'
tcp 0 0 0.0.0.0:993 0.0.0.0:* LISTEN 2992583/docker-prox
tcp 0 0 0.0.0.0:995 0.0.0.0:* LISTEN 2992570/docker-prox
tcp 0 0 0.0.0.0:587 0.0.0.0:* LISTEN 2991739/docker-prox
tcp 0 0 0.0.0.0:110 0.0.0.0:* LISTEN 2992611/docker-prox
tcp 0 0 0.0.0.0:143 0.0.0.0:* LISTEN 2992596/docker-prox
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 3723553/docker-prox
tcp 0 0 0.0.0.0:465 0.0.0.0:* LISTEN 2991768/docker-prox
tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN 2991791/docker-prox
tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN 3723540/docker-prox
tcp 0 0 0.0.0.0:4190 0.0.0.0:* LISTEN 2992557/docker-prox
Datum und Uhrzeit prüfen
timedatectl status
Local time: Sat 2024-04-06 16:36:43 CEST
Universal time: Sat 2024-04-06 14:36:43 UTC
RTC time: Sat 2024-04-06 14:36:44
Time zone: Europe/Berlin (CEST, +0200)
System clock synchronized: yes
NTP service: active (1)
RTC in local TZ: no
| 1 | NTP muss aktiviert und synchronisiert sein (NTP service: active means that timesyncd is enabled and running.) |
| Name | TTL | Typ | Priority | Daten |
|---|---|---|---|---|
mail.<yourdomain>.<tld> |
86400 |
A |
0 |
<your-ip> |
autodiscover.<yourdomain>.<tld> |
86400 |
CNAME |
0 |
mail.<yourdomain>.<tld> |
autoconfig.<yourdomain>.<tld> |
86400 |
CNAME |
0 |
mail.<yourdomain>.<tld> |
<yourdomain>.<tld> |
86400 |
MX |
10 |
mail.<yourdomain>.<tld> |
<yourdomain>.<tld> |
86400 |
TXT |
0 |
v=spf1 mx a -all |
_dmarc.<yourdomain>.<tld> |
86400 |
TXT |
0 |
v=DMARC1; p=reject; rua=mailto:mailauth-reports@<yourdomain>.<tld> |
Installation
Change to su and check that umask gleich 0022 ist
~$ sudo su
# umask
# 0022
Wechsel in den Projektordner und Clone das offizielle Repo
# cd ~/home/<user>/docker
# git clone https://github.com/mailcow/mailcow-dockerized
Wechsel in den mailcow ordner und starte das Initialisierungsskript
# cd mailcow-dockerized
# ./generate_config.sh
Found Docker Compose Plugin (native).
Setting the DOCKER_COMPOSE_VERSION Variable to native
Notice: You´ll have to update this Compose Version via your Package Manager manually!
Press enter to confirm the detected value '[value]' where applicable or enter a custom value.
Mail server hostname (FQDN) - this is not your mail domain, but your mail servers hostname: mail.offbase.de
Timezone [Europe/London]: Europe/Berlin
Which branch of mailcow do you want to use?
Available Branches:
- master branch (stable updates) | default, recommended [1]
- nightly branch (unstable updates, testing) | not-production ready [2]
Choose the Branch with it´s number [1/2] 1
Already on 'master'
Your branch is up to date with 'origin/master'.
Generating snake-oil certificate...
..+....+...+......+.....+....+...........+.++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
...
..............+......+...+.....+...+...............+..................+.+.........+..+..........+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
...
Copying snake-oil certificate...
Detecting if your IP is listed on Spamhaus Bad ASN List...
Check completed! Your IP is clean
Konfiguration anpassen (Port-Einstellungen für Reverse Proxy)
# nano mailcow.conf
...
HTTP_BIND=127.0.0.1
HTTP_PORT=8080
HTTPS_BIND=127.0.0.1
HTTPS_PORT=8443
...
Check welcher MTA bzw. ob bereits ein MTA läuft bzw. auf Port 25 lauscht
# lsof -i :25 (1)
| 1 | OK … kein response bedeutet, dass kein Dienst auf Port 25 lauscht |
Docker compose anpassen
version: '2.1'
services:
nginx-mailcow:
networks:
# Traefiks Netzwerk hinzufügen
public: # <---------- von web nach public anpassen
labels:
- traefik.enable=true
# Erstellt einen Router namens "moo" für den Container und richtet eine Regel ein, um den Container mit einer bestimmten Regel zu verknüpfen,
# in diesem Fall eine Host-Regel mit unserer MAILCOW_HOSTNAME-Variable.
- traefik.http.routers.moo.rule=Host(`${MAILCOW_HOSTNAME}`)
# Aktiviert tls über den zuvor erstellten Router.
- traefik.http.routers.moo.tls=true
# Gibt an, welche Art von Cert-Resolver wir verwenden werden, in diesem Fall le (Lets Encrypt).
- traefik.http.routers.moo.tls.certresolver=le
# Erzeugt einen Dienst namens "moo" für den Container und gibt an, welchen internen Port des Containers
# Traefik die eingehenden Daten weiterleiten soll.
- traefik.http.services.moo.loadbalancer.server.port=${HTTP_PORT}
# Gibt an, welchen Eingangspunkt (externer Port) traefik für diesen Container abhören soll.
# Websecure ist Port 443, siehe die Datei traefik.toml wie oben.
- traefik.http.routers.moo.entrypoints=websecure
# Stellen Sie sicher, dass traefik das Web-Netzwerk verwendet, nicht das mailcowdockerized_mailcow-network
- traefik.docker.network=traefik_web
certdumper:
image: humenius/traefik-certs-dumper
command: --restart-containers ${COMPOSE_PROJECT_NAME}-postfix-mailcow-1,${COMPOSE_PROJECT_NAME}-nginx-mailcow-1,${COMPOSE_PROJECT_NAME}-dovecot-mailcow-1
network_mode: none
volumes:
# Binden Sie das Volume, das Traefiks `acme.json' Datei enthält, ein
- ${TRAEFIK_ACME_VOLUME}/letsencrypt:/traefik:ro
# SSL-Ordner von mailcow einhängen
- ./data/assets/ssl/:/output:rw
# Binden Sie den Docker Socket ein, damit traefik-certs-dumper die Container neu starten kann
- /var/run/docker.sock:/var/run/docker.sock:ro
restart: always
environment:
# Ändern Sie dies nur, wenn Sie eine andere Domain für mailcows Web-Frontend verwenden als in der Standard-Konfiguration
- DOMAIN=${MAILCOW_HOSTNAME}
networks:
public:
external: true
# Name des externen Netzwerks
#name: public
#volumes:
# acme:
# external: true
# Name des externen Docker Volumes, welches Traefiks `acme.json' #Datei enthält
# name: traefik_acme
Add Traefik ACME Volume/Folder to .env resp. mailcow.conf
# TRAEFIK ACME VOLUME . add 06.04.2024
TRAEFIK_ACME_VOLUME=/home/<username>/<project-folder>/<traefik-container-folder>
Docker Images herunterladen
docker compose pull
mailcow starten
docker compose up -d
Mailcow Konfiguration
Erster Login
https://mail.<your-domain>.<tld>
user: admin
password: moohoo
| 1. Admin-Passwort ändern und 2. DCIM erstellen und in der DNS Zonenverwaltung hinterlegen! |
Admin - Zugangsdaten ändern - Schritt 1

Admin - Zugangsdaten ändern - Schritt 2

Domain erstellen und danach dafür die
DKIM Keys erstellen - Schritt 1

DKIM Keys erstellen - Schritt 2

dkim._domainkey.offbase.de
| Name | TTL | Typ | Priority | Daten |
|---|---|---|---|---|
dkim._domainkey.<yourdomain>.<tld> |
86400 |
TXT |
0 |
v=DKIM1;k=rsa;t=s;s=email;p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA173Z … … … |
Die DNS Zonen-Einträge sollten nun folgende Werte enthalten
