OKTous les services sont opérationnels
InfrawireLogo InfrawireDocumentation

Installer et sécuriser mailcow sur un VPS Linux

mailcow: dockerized est une pile logicielle complète et prête à l’emploi pour héberger votre propre messagerie sur un serveur : MTA (Postfix), boîtes et protocoles (Dovecot), filtrage antispam (Rspamd), antivirus optionnel (ClamAV), interface d’administration web, SOGo (webmail / calendrier / ActiveSync), base MariaDB, Redis, Nginx, etc. Tout est orchestré avec Docker et Docker Compose.

À quoi sert mailcow ?

  • Centraliser l’email de votre organisation ou de vos domaines sur une infrastructure que vous contrôlez (pas de boîte « gratuite » partagée avec des règles opaques).
  • Gérer domaines, alias, quotas et politiques depuis une interface web unique.
  • Bénéficier d’une stack maintenue par la communauté mailcow, avec mises à jour documentées, plutôt que d’assembler manuellement Postfix + Dovecot + spam + webmail.

Important : La messagerie correctement délivrable impose un DNS irréprochable (MX, SPF, DKIM, DMARC), un PTR (rDNS) cohérent avec le nom d’hôte du serveur, et souvent une réputation d’IP saine. Sans cela, même une installation parfaite peut atterrir en spam.

Limites et prérequis officiels (à respecter)

Selon la documentation mailcow — Prepare your system :

RessourceMinimum documenté
RAM6 Gio + 1 Gio de swap (configuration par défaut)
Disque20 Gio minimum (sans le volume des boîtes mail)
CPU1 GHz
Architecturex86_64 ou ARM64

Non pris en charge pour mailcow : OpenVZ, Virtuozzo, LXC, NAS type Synology/QNAP. Privilégiez un VPS en virtualisation complète (KVM, Hyper-V, ESXi, etc.), par exemple une offre avec 8 Gio de RAM ou plus si plusieurs utilisateurs / ActiveSync.

Vous pouvez alléger la RAM en désactivant des composants lourds dans mailcow.conf (voir plus bas) : SKIP_CLAMD=y, SKIP_FTS=y.

Aucun autre service mail (Postfix/Exim installé sur l’hôte) ne doit occuper les ports 25, 80, 110, 143, 443, 465, 587, 993, 995, 4190. Vérifiez avant installation :

Bash
ss -tlpn | grep -E -w '25|80|110|143|443|465|587|993|995|4190'

Prérequis DNS (avant de commencer)

Suivez au minimum la documentation DNS mailcow :

  1. FQDN : choisissez un nom pleinement qualifié pour le serveur, par ex. mail.votredomaine.tld — ce sera votre MAILCOW_HOSTNAME.
  2. Enregistrement A (et AAAA si IPv6) pointant vers l’IP du VPS pour ce nom.
  3. MX du domaine pointant vers ce FQDN (avec la bonne priorité).
  4. PTR (reverse DNS) de l’IP publique : doit correspondre au FQDN du serveur (souvent configuré chez votre hébergeur / registrar IP, pas dans la zone DNS du domaine).
  5. Après installation : SPF (TXT), DKIM (depuis l’UI mailcow), DMARC (TXT _dmarc).

Outils de contrôle cités par mailcow : MXToolbox, Mail-tester.

Étape 1 — Paquets système (Debian / Ubuntu)

Conformément à Install mailcow — System Packages :

Bash
sudo apt update sudo apt install -y git openssl curl gawk coreutils grep jq

Étape 2 — Docker Engine et Docker Compose v2

mailcow exige Docker ≥ 24.0.0 et Docker Compose ≥ 2.0. La doc recommande le Docker Engine à jour, pas uniquement la version figée des dépôts Debian/Ubuntu.

Installation type Debian/Ubuntu (script officiel Docker) :

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

Puis le plugin Compose (commande docker compose, sans tiret) :

Bash
sudo apt update sudo apt install -y docker-compose-plugin

Vérifiez :

Bash
docker --version docker compose version

Étape 3 — Cloner mailcow et générer la configuration

La procédure officielle utilise /opt et un umask adapté :

Bash
1sudo su 2umask 0022 3cd /opt 4git clone https://github.com/mailcow/mailcow-dockerized 5cd mailcow-dockerized 6./generate_config.sh

Le script vous demande le FQDN (ex. mail.example.com). Il génère mailcow.conf.

Éditez les paramètres si besoin :

Bash
nano mailcow.conf

Vérifiez notamment :

  • MAILCOW_HOSTNAME : doit être le FQDN public du serveur mail.
  • IPv6 : depuis la version 2025-09, vous pouvez forcer la désactivation si votre hébergeur ou votre réseau ne gère pas IPv6 correctement (évite des pièges documentés de type « open relay » liés au NAT IPv6 Docker) :
Bash
ENABLE_IPV6=false

Après modification IPv6, un redémarrage complet de la pile est requis (voir ci-dessous).

Référence : Disable IPv6.

Étape 4 — Démarrer mailcow

Toujours depuis /opt/mailcow-dockerized :

Bash
docker compose pull docker compose up -d

Accès à l’administration : https://VOTRE_MAILCOW_HOSTNAME/admin

Identifiants par défaut (à changer immédiatement) :

  • Utilisateur : admin
  • Mot de passe : moohoo

Source : Installation of mailcow — Starting mailcow.

Sécurisation immédiate après la première connexion

  1. Changer le mot de passe administrateur dans l’interface (ne conservez jamais moohoo).
  2. Activer l’A2F (2FA) pour le compte admin : TOTP, WebAuthn ou Yubi OTP — voir la doc officielle Two-Factor Authentication.
  3. Heure système / NTP : obligatoire pour le TOTP. Vérifiez timedatectl status (NTP synchronized: yes). Guide : Prepare your system — Date and Time.
  4. HTTPS : utilisez l’accès HTTPS fourni par mailcow ; si vous n’avez pas de proxy inverse, suivez la doc pour la redirection HTTP→HTTPS, par ex. HTTP to 443.
  5. DKIM / SPF / DMARC : créez la clé DKIM dans l’UI mailcow et publiez les enregistrements TXT indiqués ; complétez SPF et DMARC selon prerequisite-dns.

Pare-feu, UFW et Docker (point critique)

La documentation mailcow avertit : UFW / firewalld sur l’hôte peuvent poser problème avec Docker, car les règles INPUT classiques ne filtrent pas toujours le trafic vers les conteneurs comme on l’imagine. Recommandation officielle : adapter les règles au chaînage Docker (chaîne DOCKER-USER) plutôt que de bloquer aveuglément. Lisez les guides cités par mailcow, par exemple unrouted.io — Docker firewall et la section Firewall & Ports de prerequisite-system.

Ouvrez côté fournisseur / pare-feu réseau au minimum les ports entrants documentés : 25, 80, 110, 143, 443, 465, 587, 993, 995, 4190 (TCP), sauf personnalisation dans mailcow.conf.

Alléger la machine (optionnel)

Dans mailcow.conf (puis recréation / redémarrage des services concernés selon la doc) :

Bash
SKIP_CLAMD=y SKIP_FTS=y

Référence : tableau Minimum System Resources dans prerequisite-system.

MTU ≠ 1500 (OpenStack, certains clouds)

Si votre réseau impose un MTU réduit, la doc indique d’ajuster le réseau dans docker-compose.yml :

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

Voir Install — Troubleshooting MTU.

Mises à jour et maintenance

Utilisez le flux documenté dans le dépôt (script update.sh fourni avec mailcow). Sauvegardez les volumes Docker et le répertoire mailcow-dockerized (notamment mailcow.conf et data/).

Réinitialisation du mot de passe admin

En cas de perte d’accès, mailcow fournit un script (voir Reset Passwords) :

Bash
cd /opt/mailcow-dockerized ./helper-scripts/mailcow-reset-admin.sh

Liens utiles (documentation officielle)

Sur un VPS Infrawire, assurez-vous que l’offre correspond aux ressources et au type de virtualisation attendus par mailcow avant de commander ou de migrer.