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.)
Table 1. DNS Einstellungen
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

mailcow konfiguration 1

Admin - Zugangsdaten ändern - Schritt 2

mailcow konfiguration 2

Domain erstellen und danach dafür die

DKIM Keys erstellen - Schritt 1

mailcow konfiguration 3

DKIM Keys erstellen - Schritt 2

mailcow konfiguration 4

dkim._domainkey.offbase.de

Table 2. DNS Einstellungen - um DKIM Key erweitern
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

DNS Zone Settings Contabo

Docker volumes

clamd-db-vol-1
crypt-vol-1
mysql-socket-vol-1
mysql-vol-1
postfix-vol-1
redis-vol-1
rspamd-vol-1
sogo-userdata-backup-vol-1
sogo-web-vol-1
solr-vol-1
vmail-index-vol-1
vmail-vol-1