## 1. Project Overview & Quickstart (mailcow/mailcow-dockerized)

## File: README.md

# mailcow: dockerized - 🐮 + 🐋 = 💕

[](https://translate.mailcow.email/engage/mailcow-dockerized/)
[](https://twitter.com/mailcow_email)



## Want to support mailcow?

Please [consider a support contract with Servercow](https://www.servercow.de/mailcow?lang=en#support) to support further development. _We_ support _you_ while _you_ support _us_. :)

You can also [get a SAL](https://www.servercow.de/mailcow?lang=en#sal) which is a one-time payment with no liabilities or returning fees.

Or just spread the word: moo.

## Many thanks to our GitHub Sponsors ❤️
A big thank you to everyone supporting us on GitHub Sponsors—your contributions mean the world to us! Special thanks to the following amazing supporters:

### 100$/Month Sponsors
  <a href="https://www.colba.net/" target=_blank></a>
  <a href="https://www.maehdros.com/" target=_blank></a>
  <a href="https://garske-systems.de/" target=_blank></a>

### 50$/Month Sponsors
  <a href="https://github.com/vnukhr" target=_blank></a><a href="https://github.com/humiico" target=_blank></a>

## Info, documentation and support

Please see [the official documentation](https://docs.mailcow.email/) for installation and support instructions. 🐄

🐛 **If you found a critical security issue, please mail us to [info at servercow.de](mailto:info@servercow.de).**

## Cowmunity

[mailcow community](https://community.mailcow.email)

[Telegram mailcow channel](https://telegram.me/mailcow)

[Telegram mailcow Off-Topic channel](https://t.me/mailcowOfftopic)

[Official 𝕏 (Twitter) Account](https://twitter.com/mailcow_email)

[Official Mastodon Account](https://mailcow.social/@doncow)

Telegram desktop clients are available for [multiple platforms](https://desktop.telegram.org). You can search the groups history for keywords.

## Misc

**Important**: mailcow makes use of various open-source software. Please assure you agree with their license before using mailcow.
Any part of mailcow itself is released under **GNU General Public License, Version 3**.

mailcow is a registered word mark of The Infrastructure Company GmbH, Parkstr. 42, 47877 Willich, Germany.

The project is managed and maintained by The Infrastructure Company GmbH.

Originated from @andryyy (André)

---

## File: data/hooks/README.md

Place executable scripts in each directory to run a hook at the end of a docker-entrypoint.sh script.

Only images with a docker-entrypoint are covered.

## 2. Official Technical Reference & Guides (mailcow/mailcow-dockerized-docs)

## File: README.md

# mailcow-docs | [](https://github.com/mailcow/mailcow-dockerized-docs/actions/workflows/pages/pages-build-deployment)
The official mailcow docs based on mkdocs-material

## Introduction:
The mailcow documentation has been redesigned from scratch based on the original (legacy-1.0 branch).

Advantages compared to the legacy version:
- Full translation support (English and German are officially supported by Servercow/tinc).
- New folder structure for better overview/ordering of sub-pages.
- Switches for Command Syntax (Docker Compose especially)


## Contributions:

### About contributions:
The documentation lives (just like the actual mailcow project) from community contributions.

Of course, we will also make our contributions to the documentation, but especially the new translation support naturally brings some scope for multiple community supported languages.

To contribute new pages/translations simply clone the repository and then work with your cloned repository.
Once you are done with your work start a pull request, if approved this will then be implemented into the actual documentation.


### Use the Compose Switch in a new/edited Page:
If you plan to contribute to our docs please make sure to always specify **both** docker compose syntaxes! This can be done by using a "switch". Example:

```
=== "docker compose (Plugin)"

    ``` bash
    docker compose exec rspamd-mailcow bash
    ```

=== "docker-compose (Standalone)"

    ``` bash
    docker-compose exec rspamd-mailcow bash
    ```
```

Simply change the content of these two cases according to your desired needs.


### Translations
#### About Translations:

So you want to provide a new translation for the documentation? Great, thanks for that <3

There are a few things to keep in mind, which are essential for a smooth process:

#### Add the new Language to the Language selector:
As a start for possible translations, the language must first be added to the language selection. To add it, edit the mkdocs.yml file and add the language in the "translations" section (under the already existing languages):
```
[...]
  - i18n: # <--- Translation plugin
      default_language: en
      languages:
        en: English
        de: Deutsch
        [...] <--- Add the languages here.
[...]
```
The new language will now appear in the language selector once the mkdocs are rebuilt (see [Testing](#Testing)).

The i18n plugin for mkdocs (see [here](https://github.com/ultrabug/mkdocs-static-i18n) is used for our documentation, so the standard notations of the plugin apply (see [here](https://github.com/ultrabug/mkdocs-static-i18n#referencing-localized-content-in-your-markdown-pages)) i.e. each language of a page will be a separate `.md` file which is composed of the `filename.languagecode.md`.

**The filenames must remain the same for the other languages, only the country code in front of the .md extension is set to the desired language.**

If a page does **NOT** exist in a language, the English version of the page will be used by default, because English is set as default_language in mkdocs.yml.

Images can also be "translated"! These are distinguished (similar to the pages) by the country codes.


#### Translate the menu:
The menu is **NOT** translated by default and must be translated by hand, this is also done in the mkdocs.yml:
```
[...]
- i18n: # <--- Translation plugin
      default_language: en
      languages:
        en: English
        de: Deutsch
      nav_translations:
      #### Begin of german translation
        de: #<--- Language code here
          'Information & Support': 'Informationen & Support'
          ### Prerequisites Section
          'Prerequisites': 'Voraussetzungen'
          'Prepare your system': 'Systemvoraussetzungen'
          'DNS setup': 'DNS Einstellungen'
[...]          
```
The preceding English variant **MUST be kept**, otherwise the translation will **not work**.


### Folder structure:
```
docs <-- Root Folder
├── assets
│   └── images <-- Folder where the images are located (sorted by main chapter)
│       ├─ topic1
|       │   ├── image.en.png
|       │   ├── image.de.png
|       │   ├── image.XX.png
|       ├─ topic2
|       │   ├── image.en.png
|       │   ├── image.de.png
|       │   ├── image.XX.png
|       ├─ topicX
|           ├── image.en.png
|           ├── image.de.png
|           ├── image.XX.png
| 
├── topic1 <-- Folder where the documentation sites are located (sorted by main chapter)
│    ├── file.en.md
|    ├── file.de.md
│    ├── file.XX.md
| 
├── topic2
│    ├── subtopic1 <-- Some Chapters are divided into multiple subtopics 
|    |    ├── file.en.md
|    |    ├── file.de.md
|    |    ├── file.XX.md
│    ├── subtopicX
|         ├── file.en.md
|         ├── file.de.md
|         ├── file.XX.md
| 
├── topicX
│    ├── file.en.md
|    ├── file.de.md
│    ├── file.XX.md
```

## Testing

To build and test it locally, you need the [Material theme for MkDocs](https://squidfunk.github.io/mkdocs-material/), [MkDocs](https://www.mkdocs.org/) itself and [Pygments](http://pygments.org/). To install these with [pip](https://pip.pypa.io/en/stable/) and get it up and running, fire up your terminal and enter

```
git clone https://github.com/mailcow/mailcow-dockerized-docs.git
pip install -r requirements.txt
mkdocs serve
```


The Placeholder values get replaced by the JavaScript in the file docs/assets/javascript/client.js.

If you want to test how the documentation looks like with the placeholder values filled in, you can set the values via url parameters.

For Example: 
```
http://127.0.0.1:8000/client/client-manual/#host=mail.test.org&email=mail@example.org&name=mail&ui=mail.example.org&port=443
```

## Misc

mailcow is a registered word mark of The Infrastructure Company GmbH, Parkstr. 42, 47877 Willich, Germany.

The project is managed and maintained by The Infrastructure Company GmbH.

Originated from @andryyy (André)

---

## File: docs/getstarted/install.de.md

# Installation von mailcow

## Voraussetzungen

### Systempakete

Die folgenden Linux-Pakete sind für die Nutzung von mailcow erforderlich und müssen je nach Ihrer Distribution gegebenenfalls nachinstalliert werden:

- git
- openssl
- curl
- awk
- sha1sum
- grep
- cut
- jq (**neu ab [2025-09](https://mailcow.email/posts/2025/release-2025-09/#2025-09-release-10th-september-2025)**)

### Docker und Docker Compose

Für die Installation benötigen Sie:

- **Docker**: Version `>= 24.0.0`
- **Docker Compose**: Version `>= 2.0`

Anleitungen zur Installation finden Sie hier:

- [Docker installieren](https://docs.docker.com/install/)
- [Docker Compose installieren](https://docs.docker.com/compose/install/)

### Schnellinstallation

#### Systempakete

##### Debian/Ubuntu:

``` bash
apt update
apt install -y git openssl curl gawk coreutils grep jq
```

##### RHEL-basierte Systeme (z.B. Rocky Linux 9):
``` bash
dnf install -y git openssl curl gawk coreutils grep jq
```

##### Alpine Linux (bspw. 3.22):
```bash
apk add --no-cache --upgrade sed findutils bash git openssl curl gawk coreutils grep jq
```

!!! info "Hinweis"
    Alle Programme, die nicht explizit im Installationsprozess aufgeführt sind, sind bereits als Unterprogramme in `coreutils` enthalten.

#### Docker

!!! danger "Wichtig"
    Verwenden Sie die **neueste verfügbare Docker-Engine** und nicht die Version aus den Paketquellen Ihrer Linux-Distribution.

##### Debian/Ubuntu:

```bash
curl -sSL https://get.docker.com/ | CHANNEL=stable sh
systemctl enable --now docker
```

##### RHEL-basierte Systeme (z. B. Rocky Linux 9):

```bash
dnf config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo
dnf install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
systemctl enable --now docker
```

##### Alpine Linux (bspw. 3.22):

```bash
apk --no-cache --upgrade add docker
rc-update add docker default
rc-service docker start
```

!!! info "Hinweis"
    Das `get.docker.com`-Skript funktioniert auf RHEL und Alpine Linux Systemen nicht zuverlässig oder gar nicht. Verwenden Sie stattdessen die manuelle Methode.

#### Docker Compose

!!! danger "Achtung"
    **mailcow benötigt Docker Compose in Version `>= 2.0`.**

##### Installation über Paketmanager (Plugin)

!!! info "Hinweis"
    Diese Methode setzt voraus, dass das Docker-Repository eingebunden wurde (siehe [Docker](#docker)).

###### Debian/Ubuntu:

```bash
apt update
apt install docker-compose-plugin
```

###### RHEL-basierte Systeme:

```bash
dnf update
dnf install docker-compose-plugin
```

###### Alpine Linux (bspw. 3.22):

```bash
 apk add --no-cache --upgrade docker-cli-compose
```

!!! danger "Achtung"
    Bei der Plugin-Variante lautet der Befehl **`docker compose`** (ohne Bindestrich).

##### Installation als Standalone-Version

```bash
LATEST=$(curl -Ls -w %{url_effective} -o /dev/null https://github.com/docker/compose/releases/latest) && \
LATEST=${LATEST##*/} && \
curl -L https://github.com/docker/compose/releases/download/$LATEST/docker-compose-$(uname -s)-$(uname -m) > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
```

!!! danger "Achtung"
    Bei der Standalone-Version lautet der Befehl **`docker-compose`** (mit Bindestrich).

---

## SELinux-Konfiguration (optional)

Auf SELinux-aktivierten Systemen (z. B. CentOS 7):

1. Prüfen Sie, ob das Paket `container-selinux` installiert ist:

    ```bash
    rpm -qa | grep container-selinux
    ```

2. Aktivieren Sie die SELinux-Unterstützung in Docker:

    - Bearbeiten Sie `/etc/docker/daemon.json` und fügen Sie `"selinux-enabled": true` hinzu:

      ```json
      {
        "selinux-enabled": true
      }
      ```

    - Starten Sie den Docker-Daemon neu.

Weitere Informationen finden Sie in der [container-selinux-Readme](https://github.com/containers/container-selinux).

---

## Installation von mailcow

1. Klonen Sie das Repository:

    ```bash
    su
    umask 0022
    cd /opt
    git clone https://github.com/mailcow/mailcow-dockerized
    cd mailcow-dockerized
    ```

2. Generieren Sie die Konfigurationsdatei:

    ```bash
    ./generate_config.sh
    ```

3. Passen Sie die Konfiguration bei Bedarf an:

    ```bash
    nano mailcow.conf
    ```

---

## Starten von mailcow

Laden Sie die Images herunter und starten Sie die Container:

=== "Docker Compose (Plugin)"

    ```bash
    docker compose pull
    docker compose up -d
    ```

=== "Docker Compose (Standalone)"

    ```bash
    docker-compose pull
    docker-compose up -d
    ```

Geschafft!

Sie können nun unter  **`https://${MAILCOW_HOSTNAME}/admin`**  mit den Standard-Zugangsdaten `admin` und dem Passwort `moohoo` zugreifen.

---

## Problembehandlung

### MTU ungleich 1500 (z. B. OpenStack)

Passen Sie die Netzwerkeinstellungen in `docker-compose.yml` an:

```yaml
networks:
  mailcow-network:
    driver_opts:
      com.docker.network.driver.mtu: 1450
```

### Kein IPv6 auf dem Hostsystem

Deaktivieren Sie IPv6 für das mailcow-Netzwerk, falls Ihr Hostsystem kein IPv6 unterstützt. Weitere Informationen finden Sie [hier](../post_installation/firststeps-disable_ipv6.de.md).

---

## Wichtige Hinweise

- **Datenpersistenz**: Ihre Daten werden in Docker-Volumes gespeichert und bleiben erhalten, auch wenn Sie Container neu erstellen oder löschen.
- **Reverse Proxy**: Wenn Sie keinen Reverse Proxy verwenden, sollten Sie [HTTP auf HTTPS umleiten](../manual-guides/u_e-80_to_443.md).

---

## File: docs/getstarted/install.en.md

# Installation of mailcow

## Prerequisites

### System Packages

The following Linux packages are required for using mailcow and may need to be installed depending on your distribution:

- git
- openssl
- curl
- awk
- sha1sum
- grep
- cut
- jq (**new as of [2025-09](https://mailcow.email/posts/2025/release-2025-09/#2025-09-release-10th-september-2025)**)

### Docker and Docker Compose

For the installation, you will need:

- **Docker**: Version `>= 24.0.0`
- **Docker Compose**: Version `>= 2.0`

Installation guides can be found here:

- [Install Docker](https://docs.docker.com/install/)
- [Install Docker Compose](https://docs.docker.com/compose/install/)

### Quick Installation

#### System Packages

##### Debian/Ubuntu:

```bash
apt update
apt install -y git openssl curl gawk coreutils grep jq
```

##### RHEL-based systems (e.g., Rocky Linux 9):
```bash
dnf install -y git openssl curl gawk coreutils grep jq
```

##### Alpine Linux (e.g., 3.22):
```bash
apk add --no-cache --upgrade sed findutils bash git openssl curl gawk coreutils grep jq
```

!!! info "Note"
    All programs not explicitly listed in the installation process are already included as subprograms in `coreutils`.

#### Docker

!!! danger "Important"
    Use the **latest available Docker Engine** and not the version from your Linux distribution's package sources.

##### Debian/Ubuntu:

```bash
curl -sSL https://get.docker.com/ | CHANNEL=stable sh
systemctl enable --now docker
```

##### RHEL-based systems (e.g., Rocky Linux 9):

```bash
dnf config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo
dnf install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
systemctl enable --now docker
```

##### Alpine Linux (e.g., 3.22):

```bash
apk --no-cache --upgrade add docker
rc-update add docker default
rc-service docker start
```

!!! info "Note"
    The `get.docker.com` script does not work reliably or at all on RHEL and Alpine Linux systems. Use the manual method instead.

#### Docker Compose

!!! danger "Warning"
    **mailcow requires Docker Compose version `>= 2.0`.**

##### Installation via Package Manager (Plugin)

!!! info "Note"
    This method requires that the Docker repository has been added (see [Docker](#docker)).

###### Debian/Ubuntu:

```bash
apt update
apt install docker-compose-plugin
```

###### RHEL-based systems:

```bash
dnf update
dnf install docker-compose-plugin
```

###### Alpine Linux (e.g., 3.22):

```bash
apk add --no-cache --upgrade docker-cli-compose
```

!!! danger "Warning"
    For the plugin version, the command is **`docker compose`** (without a hyphen).

##### Installation as a Standalone Version

```bash
LATEST=$(curl -Ls -w %{url_effective} -o /dev/null https://github.com/docker/compose/releases/latest) && \
LATEST=${LATEST##*/} && \
curl -L https://github.com/docker/compose/releases/download/$LATEST/docker-compose-$(uname -s)-$(uname -m) > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
```

!!! danger "Warning"
    For the standalone version, the command is **`docker-compose`** (with a hyphen).

---

## SELinux Configuration (Optional)

On SELinux-enabled systems (e.g., CentOS 7):

1. Check if the `container-selinux` package is installed:

    ```bash
    rpm -qa | grep container-selinux
    ```

2. Enable SELinux support in Docker:

    - Edit `/etc/docker/daemon.json` and add `"selinux-enabled": true`:

      ```json
      {
        "selinux-enabled": true
      }
      ```

    - Restart the Docker daemon.

For more information, see the [container-selinux Readme](https://github.com/containers/container-selinux).

---

## Installing mailcow

1. Clone the repository:

    ```bash
    su
    umask 0022
    cd /opt
    git clone https://github.com/mailcow/mailcow-dockerized
    cd mailcow-dockerized
    ```

2. Generate the configuration file:

    ```bash
    ./generate_config.sh
    ```

3. Adjust the configuration if necessary:

    ```bash
    nano mailcow.conf
    ```

---

## Starting mailcow

Download the images and start the containers:

=== "Docker Compose (Plugin)"

    ```bash
    docker compose pull
    docker compose up -d
    ```

=== "Docker Compose (Standalone)"

    ```bash
    docker-compose pull
    docker-compose up -d
    ```
    
Done!

You can now access **`https://${MAILCOW_HOSTNAME}/admin`**  using the default credentials `admin` and the password `moohoo`.

---

## Troubleshooting

### MTU not equal to 1500 (e.g., OpenStack)

Adjust the network settings in `docker-compose.yml`:

```yaml
networks:
  mailcow-network:
    driver_opts:
      com.docker.network.driver.mtu: 1450
```

### No IPv6 on the Host System

Disable IPv6 for the mailcow network if your host system does not support IPv6. More information can be found [here](../post_installation/firststeps-disable_ipv6.en.md).

---

## Important Notes

- **Data Persistence**: Your data is stored in Docker volumes and remains intact even if you recreate or delete containers.
- **Reverse Proxy**: If you are not using a reverse proxy, you should [redirect HTTP to HTTPS](../manual-guides/u_e-80_to_443.md).

---

## File: docs/getstarted/prerequisite-dns.de.md

Nachstehend finden Sie eine Liste von **empfohlenen DNS-Einträgen**. Einige sind für einen Mailserver obligatorisch (A, MX), andere werden empfohlen, um eine gute Reputation aufzubauen (TXT/SPF) oder für die automatische Konfiguration von Mailclients verwendet (SRV).

## Referenzen

- Ein guter Artikel, der alle relevanten Themen abdeckt:
  ["3 DNS Records Every Email Marketer Must Know"](https://www.rackaid.com/blog/email-dns-records)
- Ein weiterer guter Artikel, aber mit Zimbra als Beispielplattform:
  ["Best Practices on Email Protection: SPF, DKIM and DMARC"](https://wiki.zimbra.com/wiki/Best_Practices_on_Email_Protection:_SPF,_DKIM_and_DMARC)
- Eine ausführliche Diskussion über SPF, DKIM und DMARC:
  ["Wie Sie Spam beseitigen und Ihren Namen mit DMARC schützen"](https://www.skelleton.net/2015/03/21/how-to-eliminate-spam-and-protect-your-name-with-dmarc/)
- Ein ausführlicher Leitfaden zum Verständnis von DMARC:
["Entmystifizierung von DMARC: Ein Leitfaden zur Verhinderung von E-Mail-Spoofing"](https://seanthegeek.net/459/demystifying-dmarc/)


## Reverse DNS Ihrer IP-Adresse

Stellen Sie sicher, dass der PTR-Eintrag Ihrer IP-Adresse mit dem FQDN Ihres mailcow-Hosts übereinstimmt: `${MAILCOW_HOSTNAME}` [^1]. Dieser Eintrag wird normalerweise bei dem Provider gesetzt, von dem Sie die IP-Adresse (Server) gemietet haben.
Bitte beachten Sie, dies sowohl für Ihre IPv4 als auch Ihre IPv6 Adressen (falls verwendet) sicherzustellen!

## Die minimale DNS-Konfiguration

Dieses Beispiel zeigt Ihnen eine Reihe von Einträgen für eine von mailcow verwaltete Domain. Jede Domain, die zu mailcow hinzugefügt wird, benötigt mindestens diesen Satz an Einträgen, um korrekt zu funktionieren.

```
# Name Typ Wert
mail IN A 1.2.3.4
autodiscover IN CNAME mail.example.org. (Ihr ${MAILCOW_HOSTNAME})
autoconfig IN CNAME mail.example.org. (Ihr ${MAILCOW_HOSTNAME})
@ IN MX 10 mail.example.org. (Ihr ${MAILCOW_HOSTNAME})
```

**Hinweis:** Der `mail` DNS-Eintrag, der die Subdomain an die angegebene IP-Adresse bindet, muss nur für die Domain gesetzt werden, auf der mailcow läuft und die für den Zugriff auf das Webinterface verwendet wird. Für jede andere von mailcow verwaltete Domain leitet der `MX`-Eintrag den Datenverkehr entsprechend weiter.

## DKIM, SPF und DMARC

Im folgenden Beispiel für eine DNS-Zonendatei wird ein einfacher **SPF** TXT-Eintrag verwendet, um nur DIESEM Server (dem MX) zu erlauben, E-Mails für Ihre Domäne zu senden. Jeder andere Server ist nicht zugelassen, kann es aber tun ("`~all`"). Weitere Informationen finden Sie im [SPF-Projekt](http://www.open-spf.org/).

```
# Name Typ Wert
@ IN TXT "v=spf1 mx a -all"
```

Es wird dringend empfohlen, einen **DKIM** TXT-Eintrag in Ihrer mailcow UI zu erstellen und den entsprechenden TXT-Eintrag in Ihren DNS-Einträgen zu setzen. Bitte lesen Sie [OpenDKIM](http://www.opendkim.org) für weitere Informationen.

```
# Name Typ Wert
dkim._domainkey IN TXT "v=DKIM1; k=rsa; t=s; s=email; p=..."
```

Der letzte Schritt, um sich selbst und andere zu schützen, ist die Implementierung eines **DMARC** TXT-Datensatzes, zum Beispiel mit Hilfe des [DMARC-Assistenten](http://www.kitterman.com/dmarc/assistant.html) ([check](https://dmarcian.com/dmarc-inspector/google.com)).

```
# Name Typ Wert
_dmarc IN TXT "v=DMARC1; p=reject; rua=mailto:mailauth-reports@example.org"
```

## Die erweiterte DNS-Konfiguration

**SRV**-Einträge geben den/die Server für ein bestimmtes Protokoll in Ihrer Domäne an. Wenn Sie einen Dienst explizit als nicht bereitgestellt ankündigen wollen, geben Sie "." als Zieladresse an (statt "mail.example.org."). Bitte beachten Sie [RFC 2782](https://tools.ietf.org/html/rfc2782).

```
# Name Typ Priorität Gewicht Port Wert
_autodiscover._tcp IN SRV 0 1 443 mail.example.org. (Ihr ${MAILCOW_HOSTNAME})
_caldavs._tcp IN SRV 0 1 443 mail.example.org. (Ihr ${MAILCOW_HOSTNAME})
_caldavs._tcp IN TXT "path=/SOGo/dav/"
_carddavs._tcp IN SRV 0 1 443 mail.example.org. (Ihr ${MAILCOW_HOSTNAME})
_carddavs._tcp IN TXT "path=/SOGo/dav/"
_imap._tcp IN SRV 0 1 143 mail.example.org. (Ihr ${MAILCOW_HOSTNAME})
_imaps._tcp IN SRV 0 1 993 mail.example.org. (Ihr ${MAILCOW_HOSTNAME})
_pop3._tcp IN SRV 0 1 110 mail.example.org. (Ihr ${MAILCOW_HOSTNAME})
_pop3s._tcp IN SRV 0 1 995 mail.example.org. (Ihr ${MAILCOW_HOSTNAME})
_sieve._tcp IN SRV 0 1 4190 mail.example.org. (Ihr ${MAILCOW_HOSTNAME})
_smtps._tcp IN SRV 0 1 465 mail.example.org. (Ihr ${MAILCOW_HOSTNAME})
_submission._tcp IN SRV 0 1 587 mail.example.org. (Ihr ${MAILCOW_HOSTNAME})
_submissions._tcp IN SRV 0 1 465 mail.example.org. (Ihr ${MAILCOW_HOSTNAME})
```

## Testen

Hier finden Sie einige Tools, mit denen Sie Ihre DNS-Konfiguration überprüfen können:

- [MX Toolbox](https://mxtoolbox.com/SuperTool.aspx) (DNS, SMTP, RBL)
- [port25.com](https://www.port25.com/dkim-wizard/) (DKIM, SPF)
- [Mail-Tester](https://www.mail-tester.com/) (DKIM, DMARC, SPF)
- [DMARC-Analysator](https://www.dmarcanalyzer.com/spf/checker/) (DMARC, SPF)
- [MultiRBL.valli.org](http://multirbl.valli.org/) (DNSBL, RBL, FCrDNS)

## Verschiedenes

### Optionale DMARC-Statistiken

Wenn Sie an Statistiken interessiert sind, können Sie sich zusätzlich bei einem der vielen unten aufgeführten DMARC-Statistikdienste anmelden - oder Ihre eigene Statistik selbst hosten.

!!! tip "Tipp"
    Es ist zu bedenken, dass wenn Sie DMARC-Statistik-Berichte an Ihren mailcow-Server anfordern und Ihr mailcow-Server nicht korrekt für den Empfang dieser Berichte konfiguriert ist, Sie möglicherweise keine genauen und vollständigen Ergebnisse erhalten. Bitte erwägen Sie die Verwendung einer alternativen E-Mail-Domain für den Empfang von DMARC-Berichten.

Es ist erwähnenswert, dass die folgenden Vorschläge keine umfassende Liste aller verfügbaren Dienste und Tools sind, sondern nur eine kleine Auswahl der vielen Möglichkeiten.

- [Postmaster Tool](https://postmaster.google.com/v2/manage_domains)
- [parsedmarc](https://github.com/domainaware/parsedmarc) (selbst gehostet)
- [Fraudmarc](https://fraudmarc.com/)
- [Postmark](https://dmarc.postmarkapp.com)
- [Dmarcian](https://dmarcian.com/)

!!! tip "Tipp"
    Diese Dienste stellen Ihnen möglicherweise einen TXT-Eintrag zur Verfügung, den Sie in Ihre DNS-Einträge einfügen müssen, so wie es der Anbieter vorschreibt. Bitte stellen Sie sicher, dass Sie die Dokumentation des Anbieters des von Ihnen gewählten Dienstes lesen, da dieser Prozess variieren kann.

### E-Mail-Test für SPF, DKIM und DMARC:

Um eine rudimentäre E-Mail-Authentifizierungsprüfung durchzuführen, senden Sie eine E-Mail an `check-auth at verifier.port25.com` und warten Sie auf eine Antwort. Sie werden einen Bericht ähnlich dem folgenden finden:

```
==========================================================
Zusammenfassung der Ergebnisse
==========================================================
SPF-Prüfung: bestanden
"iprev"-Prüfung: bestanden
DKIM-Prüfung: bestanden
DKIM-Prüfung: bestanden
SpamAssassin-Prüfung: ham

==========================================================
Einzelheiten:
==========================================================
....
```

Der vollständige Bericht enthält weitere technische Details.


### Fully Qualified Domain Name (FQDN)

[^1]: Ein **Fully Qualified Domain Name** (**FQDN**) ist der vollständige (absolute) Domänenname für einen bestimmten Computer oder Host im Internet. Der FQDN besteht aus mindestens drei Teilen, die durch einen Punkt getrennt sind: dem Hostnamen, dem Domänennamen und der Top Level Domain (kurz **TLD**). Im Beispiel `mx.mailcow.email` wäre der Hostname `mx`, der Domainname `mailcow` und die TLD `email`.

---

## File: docs/getstarted/prerequisite-dns.en.md

Below you can find a list of **recommended DNS records**. While some are mandatory for a mail server (A, MX), others are recommended to build a good reputation score (TXT/SPF) or used for auto-configuration of mail clients (SRV).

## References

- A good article covering all relevant topics:
  ["3 DNS Records Every Email Marketer Must Know"](https://www.rackaid.com/blog/email-dns-records)
- Another great one, but Zimbra as an example platform:
  ["Best Practices on Email Protection: SPF, DKIM and DMARC"](https://wiki.zimbra.com/wiki/Best_Practices_on_Email_Protection:_SPF,_DKIM_and_DMARC)
- An in-depth discussion of SPF, DKIM and DMARC:
  ["How to eliminate spam and protect your name with DMARC"](https://www.skelleton.net/2015/03/21/how-to-eliminate-spam-and-protect-your-name-with-dmarc/)
- A thorough guide on understanding DMARC:
["Demystifying DMARC: A guide to preventing email spoofing"](https://seanthegeek.net/459/demystifying-dmarc/)


## Reverse DNS of your IP address

Make sure that the PTR record of your IP address matches the FQDN of your mailcow host: `${MAILCOW_HOSTNAME}` [^1]. This record is usually set at the provider you leased the IP address (server) from.
Please make sure that you create the record for IPv4 and IPv6 address (if you are using IPv6)!

## The minimal DNS configuration

This example shows you a set of records for one domain managed by mailcow. Each domain that is added to mailcow needs at least this set of records to function correctly.

```
# Name              Type       Value
mail                IN A       1.2.3.4
autodiscover        IN CNAME   mail.example.org. (your ${MAILCOW_HOSTNAME})
autoconfig          IN CNAME   mail.example.org. (your ${MAILCOW_HOSTNAME})
@                   IN MX 10   mail.example.org. (your ${MAILCOW_HOSTNAME})
```

**Note:** The `mail` DNS record which binds the subdomain to the given ip address must only be set for the domain on which mailcow is running and that is used to access the web interface. For every other mailcow managed domain, the `MX` record will route the traffic.

## DKIM, SPF and DMARC

In the example DNS zone file snippet below, a simple **SPF** TXT record is used to only allow THIS server (the MX) to send mail for your domain. Every other server is disallowed but able to ("`~all`"). Please refer to [SPF Project](http://www.open-spf.org/) for further reading.

```
# Name              Type       Value
@                   IN TXT     "v=spf1 mx a -all"
```

It is highly recommended to create a **DKIM** TXT record in your mailcow UI and set the corresponding TXT record in your DNS records. Please refer to [OpenDKIM](http://www.opendkim.org) for further reading.

```
# Name              Type       Value
dkim._domainkey     IN TXT     "v=DKIM1; k=rsa; t=s; s=email; p=..."
```

The last step in protecting yourself and others is the implementation of a **DMARC** TXT record, for example by using the [DMARC Assistant](http://www.kitterman.com/dmarc/assistant.html) ([check](https://dmarcian.com/dmarc-inspector/google.com)).

```
# Name              Type       Value
_dmarc              IN TXT     "v=DMARC1; p=reject; rua=mailto:mailauth-reports@example.org"
```

## The advanced DNS configuration

**SRV** records specify the server(s) for a specific protocol on your domain. If you want to explicitly announce a service as not provided, give "." as the target address (instead of "mail.example.org."). Please refer to [RFC 2782](https://tools.ietf.org/html/rfc2782).

```
# Name              Type       Priority Weight Port    Value
_autodiscover._tcp  IN SRV     0        1      443      mail.example.org. (your ${MAILCOW_HOSTNAME})
_caldavs._tcp       IN SRV     0        1      443      mail.example.org. (your ${MAILCOW_HOSTNAME})
_caldavs._tcp       IN TXT                              "path=/SOGo/dav/"
_carddavs._tcp      IN SRV     0        1      443      mail.example.org. (your ${MAILCOW_HOSTNAME})
_carddavs._tcp      IN TXT                              "path=/SOGo/dav/"
_imap._tcp          IN SRV     0        1      143      mail.example.org. (your ${MAILCOW_HOSTNAME})
_imaps._tcp         IN SRV     0        1      993      mail.example.org. (your ${MAILCOW_HOSTNAME})
_pop3._tcp          IN SRV     0        1      110      mail.example.org. (your ${MAILCOW_HOSTNAME})
_pop3s._tcp         IN SRV     0        1      995      mail.example.org. (your ${MAILCOW_HOSTNAME})
_sieve._tcp         IN SRV     0        1      4190     mail.example.org. (your ${MAILCOW_HOSTNAME})
_smtps._tcp         IN SRV     0        1      465      mail.example.org. (your ${MAILCOW_HOSTNAME})
_submission._tcp    IN SRV     0        1      587      mail.example.org. (your ${MAILCOW_HOSTNAME})
_submissions._tcp   IN SRV     0        1      465      mail.example.org. (your ${MAILCOW_HOSTNAME})
```

## Testing

Here are some tools you can use to verify your DNS configuration:

- [MX Toolbox](https://mxtoolbox.com/SuperTool.aspx) (DNS, SMTP, RBL)
- [port25.com](https://www.port25.com/dkim-wizard/) (DKIM, SPF)
- [Mail-tester](https://www.mail-tester.com/) (DKIM, DMARC, SPF)
- [DMARC Analyzer](https://www.dmarcanalyzer.com/spf/checker/) (DMARC, SPF)
- [MultiRBL.valli.org](http://multirbl.valli.org/) (DNSBL, RBL, FCrDNS)

## Misc

### Optional DMARC Statistics

If you are interested in statistics, you can additionally register with some of the many below DMARC statistic services - or self-host your own.

!!! tip
    It is worth considering that if you request DMARC statistic reports to your mailcow server and your mailcow server is not configured correctly to receive these reports, you may not get accurate and complete results. Please consider using an alternative email domain for receiving DMARC reports.

It is worth mentioning, that the following suggestions are not a comprehensive list of all services and tools available, but only a small few of the many choices.

- [Postmaster Tool](https://postmaster.google.com/v2/manage_domains)
- [parsedmarc](https://github.com/domainaware/parsedmarc) (self-hosted)
- [Fraudmarc](https://fraudmarc.com/)
- [Postmark](https://dmarc.postmarkapp.com)
- [Dmarcian](https://dmarcian.com/)

!!! tip
    These services may provide you with a TXT record you need to insert into your DNS records as the provider specifies. Please ensure you read the provider's documentation from the service you choose as this process may vary.

### Email test for SPF, DKIM and DMARC:

To run a rudimentary email authentication check, send a mail to `check-auth at verifier.port25.com` and wait for a reply. You will find a report similar to the following:

```
==========================================================
Summary of Results
==========================================================
SPF check:          pass
"iprev" check:      pass
DKIM check:         pass
DKIM check:         pass
SpamAssassin check: ham

==========================================================
Details:
==========================================================
....
```

The full report will contain more technical details.


### Fully Qualified Domain Name (FQDN)

[^1]: A **Fully Qualified Domain Name** (**FQDN**) is the complete (absolute) domain name for a specific computer or host, on the Internet. The FQDN consists of at least three parts divided by a dot: the hostname, the domain name, and the Top Level Domain (**TLD** for short). In the example of `mx.mailcow.email` the hostname would be `mx`, the domain name `mailcow` and the TLD `email`.

---

## File: docs/getstarted/prerequisite-system.de.md

Bevor Sie **mailcow: dockerized** ausführen, sollten Sie einige Voraussetzungen überprüfen:

!!! warning "Achtung"
    Versuchen Sie **nicht**, mailcow auf einem Synology/QNAP-Gerät (jedes NAS), OpenVZ, LXC oder anderen Container-Plattformen zu installieren. KVM, ESX, Hyper-V und andere vollständige Virtualisierungsplattformen werden unterstützt.

!!! info
    - mailcow: dockerized erfordert, dass [einige Ports](#eingehende-ports) für eingehende Verbindungen offen sind, also stellen Sie sicher, dass Ihre Firewall diese nicht blockiert.
    - Stellen Sie sicher, dass keine andere Anwendung die Konfiguration von mailcow stört, wie z.B. ein anderer Maildienst
    - Ein korrektes DNS-Setup ist entscheidend für jedes gute Mailserver-Setup, also stellen Sie bitte sicher, dass Sie zumindest die [basics](../getstarted/prerequisite-dns.de.md#die-minimale-dns-konfiguration) abgedeckt haben, bevor Sie beginnen!
    - Stellen Sie sicher, dass Ihr System ein korrektes Datum und eine korrekte [Zeiteinstellung](#datum-und-uhrzeit) hat. Dies ist entscheidend für verschiedene Komponenten wie die Zwei-Faktor-TOTP-Authentifizierung.

## Minimale Systemressourcen

Bitte stellen Sie sicher, dass Ihr System mindestens über die folgenden Ressourcen verfügt, um problemlos zu laufen:

| Ressource   | Minimale Anforderung                                   |
| ----------- | ------------------------------------------------------ |
| CPU         | 1 GHz                                                  |
| RAM         | **Minimum** 6 GiB + 1 GiB Swap (Standardkonfiguration) |
| Festplatte  | 20 GiB (ohne Emails)                                   |
| Architektur | x86_64, ARM64                                          |

!!! failure "Nicht unterstützte Plattformen"
	**OpenVZ, Virtuozzo und LXC**

### Arbeitsspeicher
ClamAV und die FTS-Engine (Flatcurve) können viel RAM nutzen, lassen sich aber über die Parameter `SKIP_CLAMD=y` und `SKIP_FTS=y` in der mailcow.conf deaktivieren.

mailcow ist eine umfassende Groupware mit zahlreichen Features wie Webserver, Webmailer, ActiveSync, Antivirus, Antispam, Indexierung, Dokumentenscanner, Datenbank und Cache, weshalb es mehr Ressourcen benötigt als ein einfacher MTA.

Ein einzelner SOGo-Worker **kann** ~350 MiB RAM belegen, bevor er geleert wird. Je mehr ActiveSync-Verbindungen Sie verwenden möchten, desto mehr RAM wird benötigt. In der Standardkonfiguration werden 20 SOGo-Worker erzeugt.

#### Beispiele für die RAM Planung

Ein Unternehmen mit 15 Smartphones (EAS aktiviert) und etwa 50 gleichzeitigen IMAP-Verbindungen sollte 16 GiB RAM einplanen.

6 GiB RAM + 1 GiB Swap sind für die meisten privaten Installationen ausreichend, während 8 GiB RAM für ~5 bis 10 Benutzer empfohlen werden.

Im Rahmen unseres Supports können wir Ihnen bei der korrekten Planung Ihres Setups helfen.

### Unterstützte Betriebssysteme
!!! danger "Wichtig"
    mailcow nutzt Docker als Grundlage. Aufgrund verschiedener technischer Unterschiede zwischen den einzelnen Systemen **werden nicht alle** Plattformen unterstützt, auf denen Docker theoretisch lauffähig ist.

Die folgende Tabelle enthält alle von uns offiziell unterstützten und getesteten Betriebssysteme (*Stand August 2025*):

| Betriebssystem            | Kompatibilität                                                     |
| ------------------------- | ------------------------------------------------------------------ |
| Alpine 3.19 und älter     | [⚠️](https://www.alpinelinux.org/ "Eingeschränkt Kompatibel")       |
| Debian 11 - 13[^1]        | [✅](https://www.debian.org/index.de.html "Vollständig Kompatibel") |
| Ubuntu 22.04 (oder neuer) | [✅](https://ubuntu.com/ "Vollständig Kompatibel")                  |
| Alma Linux 8, 9           | [✅](https://almalinux.org/ "Vollständig Kompatibel")               |
| Rocky Linux 9             | [✅](https://rockylinux.org/ "Vollständig Kompatibel")              |


!!! info "Legende"
    ✅ = Funktioniert **out of the box** anhand der Anleitung.
    ⚠️ = Erfordert einige **manuelle Anpassungen**, sonst aber nutzbar.
    ❌ = Generell **NICHT Kompatibel**.
    ❔ = Ausstehend.

!!! danger "Achtung"
    Andere (nicht genannte Betriebssysteme) können auch funktionieren, sind jedoch nicht offiziell getestet worden und erhalten KEINEN Support, weder Community noch Bezahlt!

    **BENUTZUNG AUF EIGENE GEFAHR!!**

## Firewall & Ports

Bitte überprüfen Sie, ob alle Standard-Ports von mailcow offen sind und nicht von anderen Anwendungen genutzt werden:

```
ss -tlpn | grep -E -w '25|80|110|143|443|465|587|993|995|4190'
# oder:
netstat -tulpn | grep -E -w '25|80|110|143|443|465|587|993|995|4190'
```

!!! danger "Vorsicht"
    Es gibt einige Probleme mit dem Betrieb von mailcow auf einem Firewalld/ufw aktivierten System. 
	Sie sollten es deaktivieren (wenn möglich) und stattdessen Ihren Regelsatz in die DOCKER-USER-Kette verschieben, die nicht durch einen Neustart des Docker-Dienstes gelöscht wird. 
	Siehe [diese (blog.donnex.net)](https://blog.donnex.net/docker-and-iptables-filtering/) oder [diese (unrouted.io)](https://unrouted.io/2017/08/15/docker-firewall/) Anleitung für Informationen darüber, wie man iptables-persistent mit der DOCKER-USER Kette benutzt. 
    Da mailcow im Docker-Modus läuft, haben INPUT-Regeln keinen Effekt auf die Beschränkung des Zugriffs auf mailcow. 
	Verwenden Sie stattdessen die FORWARD-Kette.

Wenn dieser Befehl irgendwelche Ergebnisse liefert, entfernen oder stoppen Sie bitte die Anwendung, die auf diesem Port läuft. Sie können mailcows Ports auch über die Konfigurationsdatei `mailcow.conf` anpassen.

### Eingehende Ports

Wenn Sie eine Firewall vor mailcow haben, stellen Sie bitte sicher, dass diese Ports für eingehende Verbindungen offen sind:

| Dienst              | Protokoll | Port   | Container       | Variable                         |
| ------------------- | :-------: | :----- | :-------------- | -------------------------------- |
| Postfix SMTP        |    TCP    | 25     | postfix-mailcow | `${SMTP_PORT}`                   |
| Postfix SMTPS       |    TCP    | 465    | postfix-mailcow | `${SMTPS_PORT}`                  |
| Postfix Submission  |    TCP    | 587    | postfix-mailcow | `${SUBMISSION_PORT}`             |
| Dovecot IMAP        |    TCP    | 143    | dovecot-mailcow | `${IMAP_PORT}`                   |
| Dovecot IMAPS       |    TCP    | 993    | dovecot-mailcow | `${IMAPS_PORT}`                  |
| Dovecot POP3        |    TCP    | 110    | dovecot-mailcow | `${POP_PORT}`                    |
| Dovecot POP3S       |    TCP    | 995    | dovecot-mailcow | `${POPS_PORT}`                   |
| Dovecot ManageSieve |    TCP    | 4190   | dovecot-mailcow | `${SIEVE_PORT}`                  |
| HTTP(S)             |    TCP    | 80/443 | nginx-mailcow   | `${HTTP_PORT}` / `${HTTPS_PORT}` |

Um einen Dienst an eine IP-Adresse zu binden, können Sie die IP-Adresse wie folgt voranstellen: `SMTP_PORT=1.2.3.4:25`

**Wichtig**: Sie können keine IP:PORT-Bindungen in HTTP_PORT und HTTPS_PORT verwenden. Bitte verwenden Sie stattdessen `HTTP_PORT=1234` und `HTTP_BIND=1.2.3.4`.

### Ausgehende Ports/Hosts

Für die Nutzung von mailcow werden einige ausgehende Verbindungen benötigt. Stellen Sie sicher, dass mailcow mit folgenden Hosts oder auf folgenden Ports nach außen kommunizieren kann:

| Dienst           | Protokoll     | Port    | Ziel                                  | Grund                                                                                            |
| ---------------- | ------------- | ------- | ------------------------------------- | ------------------------------------------------------------------------------------------------ |
| Clamd            | TCP           | 873     | rsync.sanesecurity.net                | Download ClamAV Signaturen (Prebundled in mailcow)                                               |
| Dovecot          | TCP           | 443     | spamassassin.heinlein-support.de      | Herunterladen von Spamassasin Regeln, die Rspamd verarbeitet, Download erfolgt über Dovecot      |
| mailcow Prozesse | TCP           | 80/443  | github.com                            | Download von mailcow Updates (Code Basiert)                                                      |
| mailcow Prozesse | TCP           | 443     | hub.docker.com                        | Download von Docker Images (direkt von Docker Hub)                                               |
| mailcow Prozesse | TCP           | 443     | asn-check.mailcow.email               | API Abfrage auf Prüfung BAD ASN (für Spamhaus Free Blocklists)                                   |
| mailcow Prozesse | TCP           | 80      | ip4.mailcow.email & ip6.mailcow.email | Ermittelung der eigenen öffentlichen IP Adresse zur Anzeige in UI (**optional**)                 |
| Postfix          | TCP           | 25, 465 | Beliebig / Any                        | Ausgehende Verbindung MTA                                                                        |
| Rspamd           | TCP           | 80      | fuzzy.mailcow.email                   | Download von Bad Subject Regex Maps (Trainiert von Servercow)                                    |
| Rspamd           | TCP           | 443     | bazaar.abuse.ch                       | Download von Mailware MD5 Prüfsummen zur Erkennung von Rspamd                                    |
| Rspamd           | TCP           | 443     | urlhaus.abuse.ch                      | Download von Malware Downloads Links zur Erkennung in Rspamd                                     |
| Rspamd           | UDP           | 11445   | fuzzy.mailcow.email                   | Anbindung an Globalen mailcow Fuzzy (Trainiert von Servercow + Community)                        |
| Rspamd           | UDP           | 11335   | fuzzy1.rspamd.com & fuzzy2.rspamd.com | Anbindung an Globalen Rspamd Fuzzy (Trainiert vom Rspamd Team)                                   |
| Unbound          | TCP **&** UDP | 53      | Beliebig / Any                        | DNS Auflösung für mailcow Stack (Zur Validierung von DNSSEC und Abruf von Spamlistinformationen) |
| Unbound          | ICMP (Ping)   |         | 1.1.1.1, 8.8.8.8, 9.9.9.9             | Simpler Internet Konnektivitätscheck                                                             |

### Wichtig für Hetzner Firewalls

Ich zitiere https://github.com/chermsen über https://github.com/mailcow/mailcow-dockerized/issues/497#issuecomment-469847380 (DANKE!):

Für alle, die mit der Hetzner-Firewall zu kämpfen haben:

Port 53 ist in diesem Fall für die Firewall-Konfiguration unwichtig. Laut Dokumentation verwendet unbound den Portbereich 1024-65535 für ausgehende Anfragen.
Da es sich bei der Hetzner Robot Firewall um eine statische Firewall handelt (jedes eingehende Paket wird isoliert geprüft) - müssen die folgenden Regeln angewendet werden:

**Für TCP**
```
SRC-IP: ---
DST-IP: ---
SRC-Port: ---
DST-Port: 1024-65535
Protokoll: tcp
TCP-Flags: ack
Aktion:      Akzeptieren
```

**Für UDP**
```
SRC-IP: ---
DST-IP: ---
SRC-Port: ---
DST-Port: 1024-65535
Protokoll: udp
Aktion:      Akzeptieren
```

Wenn man einen restriktiveren Portbereich anwenden will, muss man zuerst die Konfiguration von unbound ändern (nach der Installation):

{mailcow-dockerized}/data/conf/unbound/unbound.conf:
```
outgoing-port-avoid: 0-32767
```

Nun können die Firewall-Regeln wie folgt angepasst werden:

```
[...]
DST Port: 32768-65535
[...]
```

## Datum und Uhrzeit

Um sicherzustellen, dass Sie das richtige Datum und die richtige Zeit auf Ihrem System eingestellt haben, überprüfen Sie bitte die Ausgabe von `timedatectl status`:

```
$ timedatectl status
      Lokale Zeit: Sat 2017-05-06 02:12:33 CEST
  Weltzeit: Sa 2017-05-06 00:12:33 UTC
        RTC-Zeit: Sa 2017-05-06 00:12:32
       Zeitzone: Europa/Berlin (MESZ, +0200)
     NTP aktiviert: ja
NTP synchronisiert: ja
 RTC in lokaler TZ: nein
      Sommerzeit aktiv: ja
 Letzte DST-Änderung: Sommerzeit begann am
                  Sonne 2017-03-26 01:59:59 MEZ
                  So 2017-03-26 03:00:00 MESZ
 Nächste Sommerzeitänderung: Die Sommerzeit endet (die Uhr springt eine Stunde rückwärts) am
                  Sun 2017-10-29 02:59:59 MESZ
                  Sun 2017-10-29 02:00:00 MEZ
```

Die Zeilen `NTP aktiviert: ja` und `NTP synchronisiert: ja` zeigen an, ob Sie NTP aktiviert haben und ob es synchronisiert ist.

Um NTP zu aktivieren, müssen Sie den Befehl `timedatectl set-ntp true` ausführen. Sie müssen auch Ihre `/etc/systemd/timesyncd.conf` bearbeiten:

```
# vim /etc/systemd/timesyncd.conf
[Zeit]
NTP=0.pool.ntp.org 1.pool.ntp.org 2.pool.ntp.org 3.pool.ntp.org
```

## Hetzner Cloud (und wahrscheinlich andere)

Prüfen Sie `/etc/network/interfaces.d/50-cloud-init.cfg` und ändern Sie die IPv6-Schnittstelle von eth0:0 auf eth0:

```
# Falsch:
auto eth0:0
iface eth0:0 inet6 static
# Richtig:
auto eth0
iface eth0 inet6 static
```

Starten Sie die Schnittstelle neu, um die Einstellungen zu übernehmen.
Sie können außerdem die [cloud-init Netzwerkänderungen deaktivieren.](https://wiki.hetzner.de/index.php/Cloud_IP_static/en#disable_cloud-init_network_changes)

## MTU

Besonders relevant für OpenStack-Benutzer: Überprüfen Sie Ihre MTU und setzen Sie sie entsprechend in docker-compose.yml. Siehe [Problebehandlungen](../getstarted/install.de.md#benutzer-mit-einer-mtu-ungleich-1500-zb-openstack) in unseren Installationsanleitungen.

[^1]: Bei einem Upgrade von Debian 12 (Bookworm) auf Debian 13 (Trixie) kann ein Dienst namens `EXIM` installiert werden, welcher Port 25 auf dem Host blockiert. Eine entfernung des Dienstes ist vor der nutzung von mailcow daher ratsam.

---

## File: docs/getstarted/prerequisite-system.en.md

Before you run **mailcow: dockerized**, there are a few requirements that you should check:

!!! warning
    Do **not** try to install mailcow on a Synology/QNAP device (any NAS), OpenVZ, LXC or other container platforms. KVM, ESX, Hyper-V and other full virtualization platforms are supported.

!!! info
    - mailcow: dockerized requires [some ports](#incoming-ports) to be open for incoming connections, so make sure that your firewall is not blocking these.
    - Make sure that no other application is interfering with mailcow's configuration, such as another mail service
    - A correct DNS setup is crucial to every good mailserver setup, so please make sure you got at least the [basics](../getstarted/prerequisite-dns.en.md#the-minimal-dns-configuration) covered before you begin!
    - Make sure that your system has a correct date and [time setup](#date-and-time). This is crucial for various components like two factor TOTP authentication.

## Minimum System Resources
Please make sure that your system has at least the following resources:

| Resource     | Minimal Requirement                             |
| ------------ | ----------------------------------------------- |
| CPU          | 1 GHz                                           |
| RAM          | **Minimum** 6 GiB + 1 GiB swap (default config) |
| Disk         | 20 GiB (without emails)                         |
| Architecture | x86_64, ARM64                                   |

!!! failure "Not supported"
	**OpenVZ, Virtuozzo and LXC**

ClamAV and Flatcurve (FTS Engine) can be greedy with RAM. You may disable them in `mailcow.conf` by settings `SKIP_CLAMD=y` and `SKIP_FTS=y`.

!!! info 
	We are aware that a pure MTA can run on 128 MiB RAM. mailcow is a full-grown and ready-to-use groupware with many extras making life easier. mailcow comes with a webserver, webmailer, ActiveSync (MS), antivirus, antispam, indexing, document scanner (Oletools), SQL (MariaDB), Cache (Redis), MDA, MTA, various web services etc.

A single SOGo worker **can** acquire ~350 MiB RAM before it gets purged. The more ActiveSync connections you plan to use, the more RAM you will need. A default configuration spawns 20 workers.

#### RAM usage examples

A company with 15 phones (EAS enabled) and about 50 concurrent IMAP connections should plan 16 GiB RAM.

6 GiB RAM + 1 GiB swap are fine for most private installations while 8 GiB RAM are recommended for ~5 to 10 users.

We can help to correctly plan your setup as part of our support.

### Supported OS
!!! danger "Important"
    mailcow is using Docker as a base component, due to some technical differences across multiple platforms we do **not support all**, even if they can run Docker.

The following table contains all operating systems officially supported and tested by us (*as of August 2025*):

| OS                      | Compatibility                                             |
| ----------------------- | --------------------------------------------------------- |
| Alpine since 3.19       | [⚠️](https://www.alpinelinux.org/ "Limited Compatibility") |
| Debian 11 - 13[^1]      | [✅](https://www.debian.org/index.html "Fully Compatible") |
| Ubuntu 22.04 (or newer) | [✅](https://ubuntu.com/ "Fully Compatible")               |
| Alma Linux 8, 9         | [✅](https://almalinux.org/ "Fully Compatible")            |
| Rocky Linux 9           | [✅](https://rockylinux.org/ "Fully Compatible")           |


!!! info "Legend"
    ✅ = Works **out of the box** using the instructions.
    ⚠️ = Requires some **manual adjustments** otherwise usable.
    ❌ = In general **NOT Compatible**.
    ❔ = Pending.

!!! warning
    **Note: All other operating systems (not mentioned) may also work, but have not been officially tested.**

## Firewall & Ports

Please check if any of mailcow's standard ports are open and not in use by other applications:

```
ss -tlpn | grep -E -w '25|80|110|143|443|465|587|993|995|4190'
# or:
netstat -tulpn | grep -E -w '25|80|110|143|443|465|587|993|995|4190'
```

!!! danger
    There are several problems with running mailcow on a firewalld/ufw enabled system. 
	You should disable it (if possible) and move your ruleset to the DOCKER-USER chain, which is not cleared by a Docker service restart, instead. 
	See [this (blog.donnex.net)](https://blog.donnex.net/docker-and-iptables-filtering/) or [this (unrouted.io)](https://unrouted.io/2017/08/15/docker-firewall/) guide for information about how to use iptables-persistent with the DOCKER-USER chain.
    As mailcow runs dockerized, INPUT rules have no effect on restricting access to mailcow. 
	Use the FORWARD chain instead.

If this command returns any results please remove or stop the application running on that port. You may also adjust mailcows ports via the `mailcow.conf` configuration file.

### Incoming Ports

If you have a firewall in front of mailcow, please ensure that these ports are open for incoming connections:

| Service             | Protocol | Port   | Container       | Variable                         |
| ------------------- | :------: | :----- | :-------------- | -------------------------------- |
| Postfix SMTP        |   TCP    | 25     | postfix-mailcow | `${SMTP_PORT}`                   |
| Postfix SMTPS       |   TCP    | 465    | postfix-mailcow | `${SMTPS_PORT}`                  |
| Postfix Submission  |   TCP    | 587    | postfix-mailcow | `${SUBMISSION_PORT}`             |
| Dovecot IMAP        |   TCP    | 143    | dovecot-mailcow | `${IMAP_PORT}`                   |
| Dovecot IMAPS       |   TCP    | 993    | dovecot-mailcow | `${IMAPS_PORT}`                  |
| Dovecot POP3        |   TCP    | 110    | dovecot-mailcow | `${POP_PORT}`                    |
| Dovecot POP3S       |   TCP    | 995    | dovecot-mailcow | `${POPS_PORT}`                   |
| Dovecot ManageSieve |   TCP    | 4190   | dovecot-mailcow | `${SIEVE_PORT}`                  |
| HTTP(S)             |   TCP    | 80/443 | nginx-mailcow   | `${HTTP_PORT}` / `${HTTPS_PORT}` |

To bind a service to an IP address, you can prefix the IP address as follows: `SMTP_PORT=1.2.3.4:25`

**Important**: You cannot use IP:PORT bindings for `HTTP_PORT` and `HTTPS_PORT`. Please use `HTTP_PORT=1234` and `HTTP_BIND=1.2.3.4` instead.

### Outgoing Ports/Hosts

Some outgoing connections are required to use mailcow. Ensure that mailcow can communicate with the following hosts or ports:

| Service           | Protocol      | Port    | Target                                | Reason                                                                                       |
| ----------------- | ------------- | ------- | ------------------------------------- | -------------------------------------------------------------------------------------------- |
| Clamd             | TCP           | 873     | rsync.sanesecurity.net                | Download ClamAV signatures (prebundled in mailcow)                                           |
| Dovecot           | TCP           | 443     | spamassassin.heinlein-support.de      | Download Spamassassin rules processed by Rspamd, downloaded via Dovecot                      |
| mailcow Processes | TCP           | 80/443  | github.com                            | Download mailcow updates (code-based)                                                        |
| mailcow Processes | TCP           | 443     | hub.docker.com                        | Download Docker images (directly from Docker Hub)                                            |
| mailcow Processes | TCP           | 443     | asn-check.mailcow.email               | API request for BAD ASN checks (for Spamhaus Free Blocklists)                                |
| mailcow Processes | TCP           | 80      | ip4.mailcow.email & ip6.mailcow.email | Retrieve public IP address for display in UI (**optional**)                                  |
| Postfix           | TCP           | 25, 465 | Any                                   | Outgoing connection for MTA                                                                  |
| Rspamd            | TCP           | 80      | fuzzy.mailcow.email                   | Download bad subject regex maps (trained by Servercow)                                       |
| Rspamd            | TCP           | 443     | bazaar.abuse.ch                       | Download malware MD5 checksums for detection by Rspamd                                       |
| Rspamd            | TCP           | 443     | urlhaus.abuse.ch                      | Download malware download links for detection in Rspamd                                      |
| Rspamd            | UDP           | 11445   | fuzzy.mailcow.email                   | Connection to global mailcow fuzzy (trained by Servercow + community)                        |
| Rspamd            | UDP           | 11335   | fuzzy1.rspamd.com & fuzzy2.rspamd.com | Connection to global Rspamd fuzzy (trained by the Rspamd team)                               |
| Unbound           | TCP **&** UDP | 53      | Any                                   | DNS resolution for the mailcow stack (for DNSSEC validation and retrieval of spam list info) |
| Unbound           | ICMP (Ping)   |         | 1.1.1.1, 8.8.8.8, 9.9.9.9             | Basic internet connectivity check                                                            |

### Important for Hetzner firewalls

Quoting https://github.com/chermsen via https://github.com/mailcow/mailcow-dockerized/issues/497#issuecomment-469847380 (THANK YOU!):

For all who are struggling with the Hetzner firewall:

Port 53 unimportant for the firewall configuration in this case. According to the documentation unbound uses the port range 1024-65535 for outgoing requests.
Since the Hetzner Robot Firewall is a static firewall (each incoming packet is checked isolated) - the following rules must be applied:

**For TCP**
```
SRC-IP:       ---
DST IP:       ---
SRC Port:    ---
DST Port:    1024-65535
Protocol:    tcp
TCP flags:   ack
Action:      Accept
```

**For UDP**
```
SRC-IP:       ---
DST IP:       ---
SRC Port:    ---
DST Port:    1024-65535
Protocol:    udp
Action:      Accept
```

If you want to apply a more restrictive port range you have to change the config of unbound first (after installation):

{mailcow-dockerized}/data/conf/unbound/unbound.conf:
```
outgoing-port-avoid: 0-32767
```

Now the firewall rules can be adjusted as follows:

```
[...]
DST Port:  32768-65535
[...]
```

## Date and Time

To ensure that you have the correct date and time setup on your system, please check the output of `timedatectl status`:

```
$ timedatectl status
      Local time: Sat 2017-05-06 02:12:33 CEST
  Universal time: Sat 2017-05-06 00:12:33 UTC
        RTC time: Sat 2017-05-06 00:12:32
       Time zone: Europe/Berlin (CEST, +0200)
     NTP enabled: yes
NTP synchronized: yes
 RTC in local TZ: no
      DST active: yes
 Last DST change: DST began at
                  Sun 2017-03-26 01:59:59 CET
                  Sun 2017-03-26 03:00:00 CEST
 Next DST change: DST ends (the clock jumps one hour backwards) at
                  Sun 2017-10-29 02:59:59 CEST
                  Sun 2017-10-29 02:00:00 CET
```

The lines `NTP enabled: yes` and `NTP synchronized: yes` indicate whether you have NTP enabled and if it's synchronized.

To enable NTP you need to run the command `timedatectl set-ntp true`. You also need to edit your `/etc/systemd/timesyncd.conf`:

```
# vim /etc/systemd/timesyncd.conf
[Time]
NTP=0.pool.ntp.org 1.pool.ntp.org 2.pool.ntp.org 3.pool.ntp.org
```

## Hetzner Cloud (and probably others)

Check `/etc/network/interfaces.d/50-cloud-init.cfg` and change the IPv6 interface from eth0:0 to eth0:

```
# Wrong:
auto eth0:0
iface eth0:0 inet6 static
# Right:
auto eth0
iface eth0 inet6 static
```

Reboot or restart the interface.
You may want to [disable cloud-init network changes.](https://wiki.hetzner.de/index.php/Cloud_IP_static/en#disable_cloud-init_network_changes)

## MTU

Especially relevant for OpenStack users: Check your MTU and set it accordingly in docker-compose.yml. See [Troubleshooting](../getstarted/install.md#users-with-a-mtu-not-equal-to-1500-eg-openstack) in our Installation guide.

[^1]: During an upgrade from Debian 12 (Bookworm) to Debian 13 (Trixie), a service called `EXIM` may be installed, which blocks port 25 on the host. Therefore, it is advisable to remove this service before using mailcow.

---

## File: docs/client/client.de.md

mailcow unterstützt eine Vielzahl von E-Mail-Clients, sowohl auf Desktop-Computern als auch auf Smartphones.
Im Folgenden finden Sie eine Reihe von Konfigurationsanleitungen, die erklären, wie Sie Ihr mailcow-Konto konfigurieren können.



Tipp
Wenn Sie auf diese Seite zugreifen, indem Sie sich bei Ihrem mailcow-Server anmelden und auf den Link "Konfigurationsanleitungen für E-Mail-Clients und Smartphones anzeigen" klicken, werden alle Anleitungen mit Ihrer E-Mail-Adresse und Ihrem Servernamen personalisiert.





Erfolgreich
Da Sie diese Seite aufgerufen haben, nachdem Sie sich in Ihren mailcow-Server eingeloggt haben, wurden alle Anleitungen mit Ihrer E-Mail-Adresse und Ihrem Servernamen personalisiert.



- [Android](client-android.md)
- [Apple iOS / macOS](client-apple.md)
- [eM Client](client-emclient.md)
- [KDE Kontact / KMail](client-kontact.md)
- [Microsoft Outlook](client-outlook.md)
- [Mozilla Thunderbird](client-thunderbird.md)
- [Manual configuration](client-manual.md)

---

## File: docs/client/client.en.md

mailcow supports a variety of email clients, both on desktop computers and on smartphones.
Below, you can find a number of configuration guides that explain how to configure your mailcow account.



Tip
If you access this page by logging into your mailcow server and clicking the "Show configuration guides for email clients and smartphones" link, all of the guides will be personalized with your email address and server name.





Success
Since you accessed this page after logging into your mailcow server, all of the guides have been personalized with your email address and server name.



- [Android](client-android.md)
- [Apple iOS / macOS](client-apple.md)
- [eM Client](client-emclient.md)
- [KDE Kontact / KMail](client-kontact.md)
- [Microsoft Outlook](client-outlook.md)
- [Mozilla Thunderbird](client-thunderbird.md)
- [Manual configuration](client-manual.md)

---

## File: docs/client/client-android.de.md

1. Öffnen Sie die App *Email*.
2. Wenn dies Ihr erstes E-Mail-Konto ist, tippen Sie auf *Konto hinzufügen*; wenn nicht, tippen Sie auf *Mehr* und *Einstellungen* und dann *Konto hinzufügen*.
3. Wählen Sie *Microsoft Exchange ActiveSync*.
4. Geben Sie Ihre E-Mail Adresse (``) und Ihr Passwort ein.
5. Tippen Sie auf *Anmelden*.