📍 Article principal de la série : Mailcow 2026 : guide pratique.
Une heure pour transformer un VPS vide en serveur mail Mailcow opérationnel avec premier domaine fonctionnel. Méthode validée chez plusieurs PME francophones.
Prérequis
- VPS Hetzner CX23 minimum (4 Go RAM nécessaire pour ClamAV).
- Domaine avec accès complet aux DNS.
- Un sous-domaine type
mail.votre-entreprise.comqui pointera vers le VPS. - Niveau attendu : intermédiaire/avancé.
- Temps estimé : 60-90 minutes.
Mailcow exige un VPS dédié (pas mutualisé) avec 4 Go RAM minimum, 40 Go SSD, IP fixe avec port 25 ouvert sortant (vérifiez auprès du provider — Hetzner et Contabo ouvrent par défaut, Vultr et DigitalOcean bloquent). Un nom de domaine racine que vous contrôlez (mail.example.sn). Comptez 2-3 heures pour cette installation initiale, dont la moitié pour la configuration DNS qui demande de la patience.
Étape 1 — Demande whitelist ports SMTP Hetzner
Hetzner bloque ports 25/465/587 sortants par défaut sur VPS récents. Avant tout, demande de whitelist :
- Hetzner Cloud Console → Support → Open ticket.
- Sujet : « Unblock outgoing SMTP ports 25/465/587 ».
- Justification : « Self-hosted mail server (Mailcow) for legitimate business use ».
- Réponse en 24-48h. Confirmation par email.
Étape 2 — Configurer Reverse DNS (PTR)
Hetzner Cloud Console → VPS → Networking → Reverse DNS. Définir : mail.votre-entreprise.com. Vérifier :
dig -x VOTRE_IP +short
# Doit retourner mail.votre-entreprise.com
Le PTR (reverse DNS) doit pointer l’IP du serveur vers mail.example.sn. Sans cela, vos emails partent en spam systématiquement. Configurez le PTR via le panel de votre hébergeur : chez Hetzner, dans Cloud Console → IP details → Reverse DNS. Vérifiez avec dig -x VOTRE_IP +short qui doit renvoyer mail.example.sn. La propagation prend 5-30 minutes. Cette étape est non négociable pour qu’un serveur mail soit accepté par Gmail, Outlook et Yahoo.
Étape 3 — Configurer DNS A et MX
Sur votre DNS provider :
mail.votre-entreprise.com. A VOTRE_IP_VPS
votre-entreprise.com. MX 10 mail.votre-entreprise.com.
Vérifier propagation : dig MX votre-entreprise.com.
Dans votre registrar (OVH, Namecheap, Cloudflare DNS), créez un enregistrement A pour mail.example.sn pointant vers l’IP. Puis un enregistrement MX pour example.sn avec priorité 10 et target mail.example.sn. Ces deux enregistrements de base permettent l’acheminement des emails entrants. Vérifiez via dig MX example.sn qui doit lister votre serveur. Sans MX, aucun email n’arrive sur votre domaine. La propagation prend 1-24 heures selon le TTL configuré.
Étape 4 — Préparer le VPS
apt update && apt upgrade -y
apt install -y curl git docker.io docker-compose-plugin
systemctl enable --now docker
ufw allow 22/tcp
ufw allow 25/tcp
ufw allow 80/tcp
ufw allow 443/tcp
ufw allow 465/tcp
ufw allow 587/tcp
ufw allow 993/tcp
ufw allow 995/tcp
ufw allow 4190/tcp
ufw enable
Sur Ubuntu 22.04 ou Debian 12 fraîchement installé, mettez à jour avec apt update && apt upgrade -y. Installez Docker et Docker Compose plugin officiel (pas l’ancien docker-compose Python). Ouvrez les ports 25, 80, 443, 465, 587, 993, 995 dans le firewall (ufw allow ou hcloud firewall si Hetzner). Désactivez postfix par défaut s’il existe avec systemctl disable --now postfix. Cette préparation prend 15-20 minutes et garantit un environnement propre pour Mailcow.
Étape 5 — Cloner Mailcow
cd /opt
git clone https://github.com/mailcow/mailcow-dockerized
cd mailcow-dockerized
./generate_config.sh
# Saisir : mail.votre-entreprise.com
# Timezone : Africa/Casablanca (ou Africa/Dakar, etc.)
Clonez le repository officiel : git clone https://github.com/mailcow/mailcow-dockerized /opt/mailcow-dockerized && cd /opt/mailcow-dockerized. Lancez le script de génération de configuration : ./generate_config.sh qui demande votre hostname (mail.example.sn) et le timezone (Africa/Dakar). Le script crée mailcow.conf avec des secrets aléatoires sécurisés. Sauvegardez ce fichier hors du serveur immédiatement (chiffré dans un gestionnaire de mots de passe), c’est lui qui sera votre référence en cas de récupération.
Étape 6 — Configurer mailcow.conf
nano mailcow.conf
Ajustements typiques :
SKIP_LETS_ENCRYPT=n
SKIP_CLAMD=n # Garder antivirus actif
SKIP_SOGO=n
HTTP_BIND=
HTTP_PORT=80
HTTPS_PORT=443
TZ=Africa/Casablanca
COMPOSE_PROJECT_NAME=mailcow
DOCKER_COMPOSE_VERSION=native
Ouvrez mailcow.conf et vérifiez les paramètres clés. MAILCOW_HOSTNAME doit correspondre à votre PTR et MX. ADDITIONAL_SAN peut lister d’autres domaines hébergés sur la même instance. SKIP_LETS_ENCRYPT=n pour activer le certificat automatique. ALLOW_ADMIN_EMAIL_LOGIN=y simplifie la connexion admin. Pour un serveur à 2 Go RAM, désactivez SOLR (search lourd) avec SKIP_SOLR=y. Cette personnalisation prend 10-15 minutes et adapte Mailcow à vos contraintes.
Étape 7 — Lancer Mailcow
docker compose pull
docker compose up -d
# Comptez 5-10 minutes pour pull toutes les images
Suivre les logs : docker compose logs -f.
Toujours dans /opt/mailcow-dockerized, lancez docker compose pull && docker compose up -d. Mailcow télécharge environ 2-3 Go d’images (Postfix, Dovecot, Rspamd, ClamAV, Nginx, MariaDB, Redis). Le démarrage prend 5-10 minutes la première fois car la base MariaDB s’initialise. Suivez avec docker compose logs -f --tail=100. Attendez le message indiquant que tous les services sont healthy avant de passer à l’étape suivante.
Étape 8 — Premier login admin
Ouvrir https://mail.votre-entreprise.com/admin. Login : admin / password : moohoo. Changer immédiatement le mot de passe.
Ouvrez https://mail.example.sn dans le navigateur. Acceptez le certificat Let’s Encrypt (qui a été automatiquement généré). L’identifiant admin par défaut est admin et le mot de passe moohoo. Connectez-vous IMMÉDIATEMENT et changez ce mot de passe dans Configuration → Administrators. Conservez le nouveau mot de passe dans un gestionnaire de mots de passe (Bitwarden, 1Password). Sans ce changement, votre serveur mail est trivialement compromettable.
Étape 9 — Activer 2FA admin
Edit profile → Two-factor authentication → TOTP. Scanner avec Aegis, sauvegarder recovery codes dans Vaultwarden.
Dans le profil admin, cliquez sur Two-Factor Authentication et activez TOTP. Scannez le QR code avec Google Authenticator, Aegis ou 1Password. Notez les codes de secours sur papier dans un coffre. Cette protection est obligatoire pour un serveur mail puisque sa compromission permet l’usurpation d’identité de tout le domaine. Pour une équipe à Plateau qui partage l’admin entre plusieurs personnes, créez des comptes admin séparés avec 2FA individuel plutôt qu’un compte partagé.
Étape 10 — Premier domaine
Configuration → Mail Setup → Domain → Add. Saisir :
- Domain :
votre-entreprise.com. - Description.
- Aliases : 400 (max alias par domaine).
- Mailbox : 50 (max boîtes).
- Quota : 5120 MB par boîte.
Dans Configuration → Mail Setup → Domains, cliquez Add domain. Saisissez example.sn comme domaine. Définissez la quota par défaut par boîte (5-10 Go pour les utilisateurs standards). Choisissez le nombre maximum de boîtes selon votre RAM disponible (1 Go RAM par tranche de 50 boîtes typiquement). Cliquez Add domain and restart SOGo. Mailcow génère automatiquement les configs Postfix, Dovecot et SOGo (webmail) pour ce domaine.
Étape 11 — Première boîte
Mailbox → Add Mailbox. Email : contact@votre-entreprise.com. Password fort. Quota 1 GB.
Toujours dans Configuration → Mail Setup → Mailboxes. Cliquez Add mailbox. Saisissez l’identifiant (par exemple admin@example.sn), le mot de passe initial (l’utilisateur le changera à la première connexion). Configurez la quota (1 Go pour test, 10 Go en production). Activez l’option Force password change at next login. Sauvegardez. La boîte est immédiatement utilisable via le webmail SOGo à https://mail.example.sn/SOGo/.
Étape 12 — Test envoi/réception
Ouvrir SOGo : https://mail.votre-entreprise.com/SOGo/. Login avec contact@votre-entreprise.com. Envoyer email vers Gmail/Outlook. Vérifier réception (peut atterrir en spam au début, normal sans warmup IP).
Connectez-vous au webmail SOGo avec la boîte créée. Envoyez un email vers une adresse Gmail externe (votre compte personnel par exemple). Si l’email arrive bien (sans aller en spam), le serveur fonctionne. Pour confirmer la réputation, testez via mail-tester.com qui donne un score de 0 à 10 selon la conformité SPF/DKIM/DMARC, le contenu et la configuration. Visez 9/10 minimum. Si moins, l’étape 13 fixera les manquants.
Étape 13 — Sauvegardes
# Helper Mailcow
cd /opt/mailcow-dockerized
./helper-scripts/backup_and_restore.sh backup all
# Cron quotidien
0 3 * * * /opt/mailcow-dockerized/helper-scripts/backup_and_restore.sh backup all --delete-days 30 >> /var/log/mailcow-backup.log 2>&1
Le script officiel /opt/mailcow-dockerized/helper-scripts/backup_and_restore.sh sauvegarde tout (mails Dovecot, base MariaDB, config). Lancez quotidiennement via cron : 0 2 * * * /opt/mailcow-dockerized/helper-scripts/backup_and_restore.sh backup all. Stockez les backups sur un stockage S3 distant (Backblaze B2, Hetzner Storage Box) avec rotation 30 jours. Pour un domaine professionnel, perdre les emails de 6 mois suite à une panne disque sans backup détruit la confiance des clients.
Erreurs fréquentes
| Erreur | Cause | Solution |
|---|---|---|
| Email pas envoyé | Port 25 bloqué Hetzner | Whitelist via support |
| Email en spam Gmail | SPF/DKIM manquant | Configurer DNS (voir tutoriel dédié) |
| Container mailcow-clamd OOM | RAM insuffisante | CX23 (4 Go) minimum, ou désactiver ClamAV |
| Let’s Encrypt échec | Port 80 bloqué | UFW allow 80 |
| SOGo 502 | Container memcached pas prêt | Attendre 2 min ou restart |
| Disk plein rapide | Logs verbose | logrotate + Docker cleanup |
Sur le terrain au Sénégal et en Afrique de l’Ouest
Trois précisions. Choix datacenter : Falkenstein (FSN1) Allemagne préféré. Latence acceptable depuis Afrique Ouest. Ne pas utiliser US-East (latence + IP réputation parfois souillée). Domaine .ci, .sn, .ma : tous fonctionnent comme .com. Configuration DNS identique. Coût total an 1 : VPS 54 € + domaine 12 € + Backblaze backup 6 € = 72 €. Versus Google Workspace 25 utilisateurs : 3 600 USD.
Tutoriels frères
Une stack mail self-hostée se complète bien avec d’autres briques. Authentik OIDC pour le SSO sur les apps internes (BookStack, Outline, Mattermost) qui partagent les comptes mail. Restic pour les sauvegardes croisées de toute la stack. CrowdSec pour bloquer les tentatives de brute-force SMTP/IMAP. Cette cohérence transforme un serveur mail isolé en pierre angulaire d’une infrastructure souveraine maîtrisée.
FAQ
Migration sans downtime ? Mode hybride : Mailcow + Google MX simultanés via priority MX. Migration progressive boîte par boîte.
Multi-tenant ? Oui, plusieurs domaines = plusieurs branding/quotas/admin distincts.
App mobile officielle ? Apps mail iOS/Android natives via IMAP/SMTP. ActiveSync via Z-Push pour Outlook desktop.
Mises à jour ? ./update.sh dans /opt/mailcow-dockerized. Updates trimestrielles typiques.
Performance VPS ? CX23 = 80 boîtes confortable. CCX13 pour 200+.
Pour explorer plus loin
- 🔝 Retour au guide général : guide pratique Mailcow 2026
- Documentation : docs.mailcow.email
Besoin d’un VPS ou d’un hébergement fiable ?
Hostinger propose des plans abordables — adaptés aux tutoriels de ce blog et utilisés par notre rédaction. Le lien est un lien de partenariat : si vous achetez via lui, le blog reçoit une petite commission sans surcoût pour vous.
Lien d affiliation. Si vous achetez via ce lien, le blog reçoit une petite commission sans surcoût pour vous.
Pourquoi Mailcow plutot que Workspace ou Microsoft 365 en 2026
Une PME ouest-africaine de 15 boites paie 90 EUR/mois (59 000 FCFA) sur Google Workspace Business Standard et 109 EUR/mois (71 500 FCFA) sur Microsoft 365 Business Standard. Mailcow sur un VPS Hetzner CX32 coute 7,42 EUR/mois (4 870 FCFA), boites illimitees, plus le domaine. La rentabilite intervient des la deuxieme boite. Au-dela de la facture, vous gardez la souverainete : aucune metadonnee n’est exfiltree vers Mountain View ou Redmond, ce qui repond directement aux exigences ARTCI et CDP en matiere de localisation des donnees personnelles.
Avant de lancer la moindre commande, ouvrez le panneau Hetzner Robot et configurez le rDNS du VPS sur votre futur hostname (mail.exemple.sn). Sans rDNS coherent, Gmail et Outlook classeront vos messages en spam systematiquement.
Etape 1 : commander le VPS Hetzner et durcir SSH
Choisissez un Hetzner Cloud CX32 (4 vCPU, 8 Go RAM, 80 Go NVMe) en datacenter Helsinki ou Nuremberg. Evitez Falkenstein si votre cible est l’Afrique de l’Ouest : la latence depuis Dakar est 8 a 12 ms meilleure depuis Helsinki via le cable 2Africa.
ssh root@VOTRE_IP
adduser admin && usermod -aG sudo admin
sed -i 's/^#PermitRootLogin.*/PermitRootLogin no/' /etc/ssh/sshd_config
sed -i 's/^#PasswordAuthentication.*/PasswordAuthentication no/' /etc/ssh/sshd_config
systemctl restart ssh
Apres redemarrage, ouvrez une seconde session SSH avant de fermer la premiere. Si la nouvelle echoue, vous pouvez encore reparer la conf depuis la session active.
Etape 2 : installer Docker Engine 27 et Compose v2
Mailcow exige Docker Engine 25 minimum. Sur Debian 12 :
curl -fsSL https://get.docker.com | sh
docker --version
docker compose version
La sortie doit afficher Docker version 27.x ou superieur et Compose v2.30+. Si vous obtenez Compose v1, c’est qu’un ancien paquet est en conflit : apt purge docker-compose avant de reessayer.
Etape 3 : cloner Mailcow et generer la configuration
cd /opt
git clone https://github.com/mailcow/mailcow-dockerized
cd mailcow-dockerized
./generate_config.sh
Le script demande le FQDN (mail.exemple.sn) et la timezone (Africa/Dakar ou Africa/Abidjan). Il genere mailcow.conf avec un mot de passe MySQL aleatoire de 28 caracteres. Ne le modifiez jamais a la main, vous casseriez la migration future.
Cette étape réutilise l’install Mailcow officiel mais avec un focus sur la sécurisation initiale. Dans le répertoire /opt, exécutez git clone https://github.com/mailcow/mailcow-dockerized.git mailcow && cd mailcow. Le script generate_config.sh demande le hostname et le fuseau horaire. Une fois le mailcow.conf généré, vérifiez les permissions (chmod 600) pour empêcher la lecture par des comptes non-root. C’est ce fichier qui contient les secrets de votre serveur.
Etape 4 : configurer les enregistrements DNS critiques
Chez votre registrar (Gandi, OVH, ou Cloudflare DNS gratuit), ajoutez ces six enregistrements minimum avant de lancer Mailcow :
mail.exemple.sn A VOTRE_IP_HETZNER
exemple.sn MX 10 mail.exemple.sn
exemple.sn TXT "v=spf1 mx -all"
_dmarc.exemple.sn TXT "v=DMARC1; p=quarantine; rua=mailto:dmarc@exemple.sn"
autodiscover.exemple.sn CNAME mail.exemple.sn
autoconfig.exemple.sn CNAME mail.exemple.sn
La cle DKIM sera generee a l’etape 6, ne la creez pas encore. Attendez 30 minutes la propagation DNS, sinon Let’s Encrypt echouera.
Etape 5 : lancer Mailcow et obtenir le certificat TLS
docker compose pull
docker compose up -d
Le premier demarrage prend 8 a 15 minutes : 26 conteneurs descendent (postfix, dovecot, sogo, rspamd, redis, mariadb, nginx, acme-mailcow). Surveillez avec docker compose logs -f acme-mailcow. Quand vous voyez certificate obtained successfully, le HTTPS est actif sur https://mail.exemple.sn.
Le démarrage initial de Mailcow déclenche automatiquement la demande de certificat TLS via Let’s Encrypt. Pour que cela fonctionne, le port 80 doit être ouvert et le DNS A doit déjà pointer vers le serveur. Pendant les premières 90 secondes, ne chargez pas l’interface web — laissez Acme.sh (le client Let’s Encrypt embarqué dans Mailcow) terminer la négociation. Si le certificat ne s’obtient pas, consultez les logs avec docker compose logs acme-mailcow pour identifier le blocage (firewall, propagation DNS, rate limit Let’s Encrypt).
Etape 6 : creer le premier domaine et generer DKIM
Connectez-vous au panneau d’administration avec le compte admin / moohoo (changez le mot de passe en premier). Creez votre domaine, puis dans Configuration > ARC/DKIM keys, generez une cle 2048 bits. Copiez l’enregistrement TXT propose et ajoutez-le dans votre DNS sous le nom dkim._domainkey.exemple.sn.
Verifiez la propagation avec dig +short TXT dkim._domainkey.exemple.sn. La sortie doit commencer par v=DKIM1; k=rsa; p=. Sans cette etape, vos mails seront refuses par Gmail des le premier envoi.
Etape 7 : tester la deliverabilite avec mail-tester
Creez une boite test@exemple.sn, envoyez un message a l’adresse fournie par mail-tester.com depuis SOGo (le webmail integre). L’objectif est 9/10 minimum. Si le score est inferieur, les causes les plus frequentes sont : rDNS absent (Hetzner Robot), enregistrement SPF avec ~all au lieu de -all, ou IPv6 sans rDNS (desactivez IPv6 dans mailcow.conf via IPV6_NETWORK= vide).
Etape 8 : automatiser les sauvegardes vers Backblaze B2
Mailcow inclut un script de backup. Programmez-le avec restic vers Backblaze B2 (0,006 USD/Go/mois, environ 4 FCFA) :
0 3 * * * cd /opt/mailcow-dockerized && MAILCOW_BACKUP_LOCATION=/tmp/mcback ./helper-scripts/backup_and_restore.sh backup all --delete-days 3 && restic -r b2:bucket-mail backup /tmp/mcback
Testez la restauration une fois par trimestre sur un VPS jetable. Une sauvegarde non testee est une absence de sauvegarde. Sur un angle proche sur le durcissement, lisez notre guide de durcissement VPS et notre tutoriel Fail2ban.
Etape 9 : configurer la rotation des journaux et la retention
Mailcow ecrit dans /var/lib/docker/volumes des dizaines de gigaoctets de logs et de spool sur 6 mois. Sans rotation, votre disque NVMe de 80 Go est plein en 4 a 5 mois. Activez la limite globale dans mailcow.conf :
MAILDIR_GC_TIME=7200
ACL_ANYONE=disallow
ENABLE_SSL_SNI=y
LOG_LINES=12000
Puis ajoutez un cron hebdomadaire qui purge les logs Docker au-dela de 30 jours : 0 4 * * 0 docker compose -f /opt/mailcow-dockerized/docker-compose.yml exec -T postfix-mailcow find /var/log -mtime +30 -delete. Verifiez chaque mois l’espace disponible avec df -h /var/lib/docker. En-dessous de 25 % libre, supprimez d’abord les snapshots inutiles avant d’agrandir le volume.
Etape 10 : connecter Outlook, Thunderbird et K-9 Mail
Donnez a vos utilisateurs un memo unique pour la configuration. Les parametres sont identiques sur les trois clients :
IMAP : mail.exemple.sn port 993 SSL/TLS
SMTP : mail.exemple.sn port 465 SSL/TLS
Identifiant : adresse complete (jean@exemple.sn)
Mot de passe : celui defini dans Mailcow
Sur Outlook 365 et Thunderbird 128 ESR, l’autodiscovery via autodiscover.exemple.sn remplit automatiquement ces champs si l’enregistrement DNS de l’etape 4 est en place. Sur K-9 Mail Android (la fork Thunderbird Mobile 2025), saisissez les valeurs manuellement, l’autoconfig n’est pas encore stable sur Android.
Etape 11 : surveiller la reputation IP avec MXToolbox
Une fois par semaine, verifiez votre IP Hetzner sur les principales blocklists : Spamhaus SBL, Barracuda BRBL, SORBS. Le service mxtoolbox.com/blacklists.aspx fait les 80 controles en 30 secondes. Si vous etes liste, demandez le delisting via le formulaire officiel de chaque RBL et corrigez la cause (relais ouvert, compte compromis, header forge). Surveillez aussi votre score Talos (talosintelligence.com/reputation) qui doit rester en Good ou Neutral.
Etape 12 : ajouter un anti-spam Rspamd avance
Mailcow embarque deja Rspamd, mais avec une configuration neutre. Pour un trafic professionnel ouest-africain, ajoutez les regles maison via /opt/mailcow-dockerized/data/conf/rspamd/local.d/multimap.conf. Bloquez les domaines emetteurs typiques des arnaques 419 (free.fr usurpe, gmail.com avec reply-to suspect) et autorisez explicitement vos partenaires connus pour eviter qu’un mail legitime du Tresor public senegalais soit classe en quarantaine. Apres modification, redemarrez : docker compose restart rspamd-mailcow. Verifiez l’effet en envoyant un mail test avec un sujet contenant un mot piege et consultez le score dans le dashboard Rspamd accessible sur le port 11334.
Etape 13 : preparer un plan de bascule en cas d’incident Hetzner
Hetzner a une disponibilite excellente (99,98 % en 2024-2025) mais une panne de 4 heures peut bloquer l’activite d’un cabinet d’avocats a Abidjan. Preparez un VPS de secours chez un second hebergeur (Scaleway Paris ou OVH Strasbourg, environ 6 EUR/mois soit 3 940 FCFA) ou la restauration restic est testee tous les trimestres. Documentez la procedure de bascule DNS dans un runbook : changer l’enregistrement A de mail.exemple.sn vers la nouvelle IP, attendre 5 minutes la propagation TTL, redemarrer Mailcow sur le secours, verifier la connexion d’un client de test. La bascule complete prend 15 a 25 minutes si la procedure est ecrite et testee, contre 4 a 8 heures dans la panique.
Etape 14 : auditer trimestriellement la conformite RGPD/CDP
Listez tous les comptes actifs depuis le panneau d’admin (Mailbox > List mailboxes), supprimez ceux des employes partis depuis plus de 90 jours apres archivage du contenu vers un dossier juridique. Verifiez que le quota par boite ne depasse pas 10 Go (au-dela, les sauvegardes deviennent ingerables). Documentez ces actions dans un registre des traitements conforme article 30 RGPD ou article 35 loi 2008-12 senegalaise. Pour automatiser ces audits, consultez notre tutoriel n8n.