📍 Article principal du sujet : Incus 6 LTS — gérer conteneurs système et VMs Linux pour PME ouest-africaine
Pour une PME ouest-africaine qui paye 5 USD par boîte mail Microsoft 365 ou Google Workspace, l’addition annuelle pour quinze collaborateurs grimpe à 900 USD — soit plus de 540 000 FCFA pour un service que des outils libres reproduisent à équivalence fonctionnelle. Mailcow est l’option la plus mûre du marché : pile mail complète (Postfix, Dovecot, Rspamd, ClamAV, SOGo webmail) intégrée, configuration via interface web, anti-spam de qualité industrielle, support DKIM/SPF/DMARC/MTA-STS/ARC/BIMI. Ce tutoriel le déploie dans un conteneur Incus dédié, branché à un domaine de PME, prêt pour la production.
Le scénario type : un Hostinger Cloud VPS 4 Go RAM dédié au mail (séparé des autres services), un domaine exemple.org dont vous contrôlez les enregistrements DNS, et 15 à 50 boîtes mail à servir avec un anti-spam digne de Gmail. Coût mensuel : 5-6 USD pour le VPS, 0 USD pour Mailcow (open source), soit 30 fois moins que la solution commerciale équivalente.
Pourquoi Mailcow plutôt que Postfix nu ou Mailu
Configurer Postfix + Dovecot + Rspamd + DKIM + DMARC à la main est un excellent exercice pédagogique mais un cauchemar opérationnel : chaque mise à jour mineure peut casser une intégration, le tuning anti-spam demande des semaines, et un MX mal configuré se retrouve sur les listes noires en quelques jours. Mailcow regroupe tout en un seul produit testé en continu par sa communauté, avec des releases régulières et une interface admin qui rend les opérations courantes triviales.
Comparé à Mailu (autre stack mail open source populaire), Mailcow est plus mature, propose plus de fonctionnalités (gestion des alias, des domaines multiples, synchro CalDAV/CardDAV via SOGo, ActiveSync), et bénéficie d’une plus grosse communauté. Mailu est plus léger en RAM (1 Go suffit) ; Mailcow demande 4 Go pour fonctionner correctement.
Prérequis
- VPS Linux 64 bits, 4 Go RAM minimum (Mailcow refuse de démarrer en dessous), 60 Go SSD
- Adresse IP publique avec PTR (reverse DNS) configurable — point critique pour la délivrabilité
- Port 25 sortant ouvert par l’hébergeur — vérifier ce point AVANT de commander le VPS
- Domaine exemple.org avec accès admin DNS (chez OVH, Namecheap, Cloudflare ou autre)
- Incus 6 LTS opérationnel — voir Installer Incus avec Zabbly
- Niveau attendu : Linux confortable, notion de DNS et SMTP
- Temps estimé : 2 à 3 heures pour la mise en service complète avec délivrabilité validée
Critique : avant tout, vérifier auprès de Hostinger que le port 25 sortant est ouvert sur votre VPS — beaucoup d’hébergeurs le bloquent par défaut anti-spam, et un mail server qui ne peut pas envoyer de mail est aussi utile qu’un téléphone sans micro. Hostinger ouvre le port 25 sur demande au support, généralement sous 24h. Sinon, prévoir un relay SMTP comme Brevo ou Postmark pour l’envoi.
Étape 1 — Préparer les enregistrements DNS
Avant de toucher au serveur, on configure les DNS. Tout faire dans le bon ordre évite plusieurs jours d’attente de propagation. Sur votre registrar/DNS :
; Enregistrements pour mail.exemple.org pointant vers IP_VPS
A mail.exemple.org IP_VPS 300
AAAA mail.exemple.org IPv6_VPS (si dispo) 300
; MX du domaine principal
MX exemple.org 10 mail.exemple.org 3600
; Autodiscover et autoconfig pour clients mail
CNAME autodiscover.exemple.org mail.exemple.org 3600
CNAME autoconfig.exemple.org mail.exemple.org 3600
; SPF (vous remplirez DKIM et DMARC après installation)
TXT exemple.org "v=spf1 mx ~all" 3600
Le PTR (reverse DNS) doit pointer de l’IP du VPS vers mail.exemple.org. Sur Hostinger, c’est configurable depuis le panneau VPS → DNS → PTR Records. Sans PTR cohérent, Gmail et Outlook rejetteront vos mails. C’est le détail qu’on oublie systématiquement et qui rend le mail server inutilisable trois jours.
Étape 2 — Conteneur Mailcow
Mailcow est livré sous forme de stack Docker Compose. On le déploie donc dans un conteneur Incus avec security.nesting activé pour autoriser Docker dedans.
incus profile create mailcow
incus profile edit mailcow
config:
limits.cpu.allowance: 100%
limits.memory: 4GB
limits.processes: 2000
security.nesting: true
description: Profil Mailcow auto-heberge
devices:
eth0:
name: eth0
network: incusbr0
type: nic
smtp:
bind: host
connect: tcp:127.0.0.1:25
listen: tcp:0.0.0.0:25
type: proxy
smtps:
bind: host
connect: tcp:127.0.0.1:465
listen: tcp:0.0.0.0:465
type: proxy
smtp-submission:
bind: host
connect: tcp:127.0.0.1:587
listen: tcp:0.0.0.0:587
type: proxy
imaps:
bind: host
connect: tcp:127.0.0.1:993
listen: tcp:0.0.0.0:993
type: proxy
https:
bind: host
connect: tcp:127.0.0.1:443
listen: tcp:0.0.0.0:443
type: proxy
root:
path: /
pool: default
size: 50GB
type: disk
name: mailcow
used_by: []
Cinq forwards de ports de l’hôte vers le conteneur : 25 (SMTP), 465 (SMTPS), 587 (Submission), 993 (IMAPS), 443 (HTTPS pour l’admin et le webmail). Le port 80 reste sur Caddy de l’hôte pour les certificats Let’s Encrypt si vous en exposez d’autres services en parallèle ; sinon, ajouter le forward 80 → conteneur.
incus launch images:debian/12 mailcow-srv -p mailcow
incus shell mailcow-srv
apt update && apt upgrade -y
apt install -y curl wget git ca-certificates gnupg
# Installer Docker (Mailcow exige Docker)
curl -fsSL https://get.docker.com | sh
systemctl enable --now docker
# Cloner Mailcow
cd /opt
git clone https://github.com/mailcow/mailcow-dockerized
cd mailcow-dockerized
./generate_config.sh
# Répondre à la question : Mail server hostname (FQDN) : mail.exemple.org
Le script generate_config.sh crée mailcow.conf avec les paramètres de base (FQDN, fuseau horaire, mots de passe générés). On peut éditer ce fichier pour ajuster les ports, la rétention du quarantine, la taille max des messages.
Étape 3 — Démarrer Mailcow
cd /opt/mailcow-dockerized
docker compose pull
docker compose up -d
Le téléchargement initial pèse environ 3 Go (8-10 images Docker) — comptez 10 minutes selon la bande passante. Une fois en route, Mailcow occupe environ 2 Go de RAM en exploitation normale, jusqu’à 3,5 Go en pic d’analyse anti-spam.
L’interface admin est accessible sur https://mail.exemple.org/ (login par défaut admin / moohoo, à changer immédiatement). Première opération : Configuration → Edit administrator → changer le mot de passe et activer le 2FA via TOTP.
Étape 4 — Créer un domaine et des boîtes mail
Dans l’admin, Email → Configuration → Domains → Add domain. Saisir exemple.org, valider. Mailcow génère immédiatement la clé DKIM correspondante.
Récupérer la clé DKIM (Configuration → Configuration & Details → ARC/DKIM keys → exemple.org → bouton « Copy »). Cette clé est un enregistrement TXT à ajouter dans votre DNS :
; Dans votre DNS
TXT dkim._domainkey.exemple.org "v=DKIM1; k=rsa; t=s; s=email; p=MIIBIjANBgkqhkiG..."
TXT _dmarc.exemple.org "v=DMARC1; p=quarantine; rua=mailto:dmarc@exemple.org; pct=100"
TXT _mta-sts.exemple.org "v=STSv1; id=2026042900;"
Pour créer une boîte mail : Email → Mailboxes → Add mailbox. Saisir le nom, le mot de passe, le quota (5 Go par défaut), valider. La boîte est immédiatement opérationnelle ; l’utilisateur peut se connecter via SOGo (webmail intégré, accessible sur la même URL /SOGo) ou un client desktop (Thunderbird, Apple Mail, Outlook).
Étape 5 — Tester la délivrabilité
Premier test : envoyer un mail vers une adresse Gmail à vous, et vérifier que le mail arrive dans la boîte de réception (et pas dans les spams). Pour un diagnostic complet, deux outils gratuits incontournables :
- mail-tester.com — envoyer un mail à l’adresse fournie, voir le rapport. Score cible : 9/10 minimum, idéalement 10/10.
- mxtoolbox.com — entrer le domaine, vérifier MX, SPF, DKIM, DMARC, blacklists, PTR.
Si le score mail-tester est bas, les causes habituelles : DKIM mal copié dans le DNS, PTR absent, IP du VPS sur une liste noire (vérifier avec MXToolbox), SPF trop laxiste. Chaque point se corrige individuellement, et un re-test mail-tester confirme l’amélioration.
Étape 6 — Configurer les clients mail
Mailcow expose les paramètres standard auto-discoverable. Sur Thunderbird ou Apple Mail, entrer juste l’adresse et le mot de passe — la configuration est détectée automatiquement. Pour les setups manuels :
- IMAP : mail.exemple.org port 993, SSL/TLS
- SMTP : mail.exemple.org port 587, STARTTLS, authentification mot de passe
- CalDAV : https://mail.exemple.org/SOGo/dav/utilisateur@exemple.org/Calendar/personal/
Pour les utilisateurs mobiles, l’app SOGo Connect ou simplement le client mail natif iOS/Android avec autoconfig fonctionnent. Sur ActiveSync (pour Outlook), Mailcow inclut Z-Push automatiquement.
Étape 7 — Sauvegardes
Mailcow inclut un script de backup (helper-scripts/backup_and_restore.sh) qui sauvegarde tous les volumes Docker en un coup. On l’enchaîne avec le pipeline backup S3 distant pour pousser vers Bunny ou Wasabi.
cd /opt/mailcow-dockerized/helper-scripts
./backup_and_restore.sh backup all --delete-days 7
# Crée un dossier /var/lib/docker/volumes/backup/mailcow-YYYYMMDD/
rclone copy /var/lib/docker/volumes/backup/ bunny:backups-itskills/mailcow/
Combiné à un cron quotidien, on obtient une stratégie de backup standard : 7 jours locaux + push S3 distant. La restauration sur un autre VPS suit la procédure inverse — réinstaller Mailcow sur la nouvelle machine, exécuter backup_and_restore.sh restore.
Erreurs fréquentes
| Erreur | Cause | Solution |
|---|---|---|
| Mails sortants en spam Gmail | Manque PTR ou DKIM mal configuré | Vérifier sur mxtoolbox.com et corriger PTR + DKIM |
| Port 25 timeout | Hébergeur bloque le port 25 sortant | Demander l’ouverture au support Hostinger ou utiliser un relay SMTP (Brevo, Postmark) |
| SOGo webmail blanc à la connexion | Cookies tiers bloqués ou cache navigateur | Vider le cache, désactiver les bloqueurs ; vérifier que le HTTPS est valide |
| Mailcow consomme 100% CPU | Rspamd recheck massif après import | Patience à l’install initial, baisse à charge normale après quelques heures |
| Boîte saturée à 5 Go | Quota par défaut | Edit mailbox → augmenter quota |
Adaptation au contexte ouest-africain
Pour une ONG dakaroise avec 20 collaborateurs, le calcul mensuel : 6 USD VPS + 0 USD Mailcow vs 100-160 USD pour Microsoft 365 Business Standard. Économie annuelle : plus de 1 200 USD, soit 720 000 FCFA — l’équivalent du salaire mensuel d’un comptable. Sur trois ans, la migration self-hosted finance le recrutement d’un sysadmin junior.
L’argument souveraineté est aussi sensible que pour Nextcloud : les mails restent sur un serveur que l’organisation contrôle, ne transitent pas par les datacenters US où s’appliquent le Cloud Act et le Patriot Act. Pour les structures qui correspondent avec des avocats, des médecins ou des journalistes, c’est un argument professionnel concret.
Côté support, l’écosystème Mailcow francophone est actif, et le forum officiel répond rapidement. Pour les structures qui ne veulent pas d’auto-support, des prestataires d’infogérance Mailcow facturent 20 à 50 USD/mois de support — toujours bien moins cher que Microsoft 365.
Tutoriels frères
- Auto-héberger Nextcloud dans un conteneur Incus — l’autre brique du cloud privé.
- Monitorer Incus avec Prometheus et Grafana — pour surveiller la charge mail.
- Configurer SPF, DKIM, DMARC, MTA-STS et BIMI — tutoriel approfondi anti-spam.
Pour aller plus loin
- 🔝 Retour à l’article principal sur Incus
- Documentation officielle Mailcow
- Tester la délivrabilité
- Pour pratiquer : Hostinger Cloud VPS 4 Go RAM (port 25 à demander)
FAQ
Combien de boîtes mail sur un VPS 4 Go ?
50 boîtes en usage standard (envoi/réception modéré). Pour des boîtes de communication intensive (newsletters, support client), prévoir 8 Go.
ActiveSync (Outlook synchro complète) inclus ?
Oui, via Z-Push intégré. Outlook 2019/2021/365 fonctionnent avec sync calendrier et contacts.
Comment migrer depuis Microsoft 365 ?
Mailcow inclut imapsync : Configuration → Sync jobs → Add. Cela copie les boîtes une à une depuis le serveur source. Compter 1-2 heures par boîte de 5 Go.
Anti-spam aussi efficace que Gmail ?
Très proche grâce à Rspamd, surtout après quelques semaines d’apprentissage. La précision dépend du tuning continu mais le score baseline est satisfaisant pour 95 % des cas.
Mailcow et CardDAV/CalDAV ?
Oui via SOGo intégré. Les clients DAVx5 (Android) et la synchro native iOS fonctionnent sans configuration spéciale.