Infrastructure mail haute disponibilité
Séparer le transport SMTP du stockage des boîtes, répliquer les Maildir entre deux Dovecot et valider la continuité de service par des pannes réelles dans un laboratoire Proxmox.
Contexte et objectif
L’objectif est de construire une chaîne mail modulaire plutôt qu’un serveur monolithique : deux Postfix pour le transport, deux Dovecot pour le stockage et l’IMAP, un HAProxy en frontal et un Roundcube pour l’accès web.
Le travail ne s’arrête pas à l’installation des services. Il porte sur l’assemblage : domaines virtuels, transport LMTP, comptes système Dovecot, passage de mbox à Maildir, permissions des sockets, réplication dsync et validation après panne.
Architecture
Le réseau du laboratoire est un /24 privé en 172.30.0.0. HAProxy expose SMTP et IMAP en couche 4 et répartit les connexions vers les deux Postfix ou les deux Dovecot. Les Postfix remettent les messages à Dovecot par LMTP, avec un pair de secours. Les deux Dovecot stockent les boîtes en Maildir et se répliquent par dsync/doveadm sur le port 12345. Roundcube utilise HAProxy comme point d’entrée IMAP et SMTP.

- HAProxy 172.30.0.1 : point d’entrée TCP pour SMTP et IMAP, round-robin et health checks.
- SMTP-01 172.30.0.2 et SMTP-02 172.30.0.3 : transport Postfix, domaines virtuels et transport LMTP avec fallback.
- DOVECOT-01 172.30.0.4 et DOVECOT-02 172.30.0.5 : IMAP, LMTP, Maildir et réplication dsync.
- WEBMAIL-01 172.16.0.8 : Roundcube, client IMAP/SMTP de la chaîne.
- Gateway 172.30.0.254 : passerelle du réseau mail.
Technologies
Réalisation technique
- Mettre en place le plan d’adressage et les conteneurs LXC sur le réseau 172.30.0.0/24.
- Publier SMTP via DNAT et HAProxy, avec deux backends Postfix en round-robin et health checks.
- Configurer Postfix : domaines virtuels, transport LMTP vers le Dovecot primaire et fallback vers le second.
- Activer LMTP dans Dovecot, associer les adresses mail aux utilisateurs et passer le stockage en Maildir.
- Installer Roundcube et l’intégrer à HAProxy pour IMAP STARTTLS sur 143 et SMTP interne sur 25.
- Configurer la réplication dsync : listener doveadm, secret dédié, plugin notify et service replicator.
- Tester la chaîne complète avec swaks, telnet, openssl s_client, doveadm et les journaux des services.
- Couper DOVECOT-01, vérifier que DOVECOT-02 continue IMAP et LMTP, puis remettre le nœud en ligne et contrôler le rattrapage.
Difficultés rencontrées
| Symptôme | Cause | Correction |
|---|---|---|
| Postfix : missing = after attribute name | Directive mal formée ou continuation sans indentation. | Réécrire la directive et indenter correctement les lignes suivantes. |
| LMTP 550 User doesn’t exist | Dovecot ne trouvait pas le compte local correspondant à l’adresse. | Créer le compte et utiliser %n pour retirer le domaine de l’adresse. |
| Unsupported authentication mechanism | Roundcube tentait un LOGIN non annoncé par Dovecot. | Déclarer auth_mechanisms = plain login. |
| Plaintext authentication disabled | LOGIN était tenté avant le chiffrement de la session. | Utiliser STARTTLS sur IMAP 143 avant l’authentification. |
| Configured passdbs don’t support credentials lookups | doveadm_port global incompatible avec la configuration PAM. | Supprimer doveadm_port et placer :12345 dans mail_replica. |
| Panic mbox-lock.c | Le stockage mbox était utilisé pendant la réplication dsync. | Passer les deux nœuds en Maildir. |
| bind : Cannot assign requested address | Un nœud écoutait sur l’adresse IP de l’autre. | Écouter sur l’IP locale et pointer mail_replica vers l’IP distante. |
| Permission denied sur replicator-doveadm | Socket en 0600 incompatible avec plusieurs UID utilisateurs. | Passer le socket en 0666 pour le laboratoire, avec un compte commun comme évolution. |
| Réplication des comptes système | userdb énumérait nobody et les comptes systemd-*. | Définir first_valid_uid et first_valid_gid, puis redémarrer Dovecot. |
| Connection refused pendant la panne du pair | Le serveur distant était réellement arrêté. | Comportement attendu : stocker localement, puis rattraper au retour du nœud. |
Résultats
- La chaîne Internet → DNAT → HAProxy → Postfix → LMTP → Dovecot → INBOX a fonctionné de bout en bout.
- Le webmail Roundcube a accédé aux boîtes par IMAP STARTTLS et utilisé HAProxy pour SMTP.
- La panne de DOVECOT-01 n’a pas interrompu les connexions IMAP ni les livraisons LMTP : DOVECOT-02 a continué à servir.
- Après le retour de DOVECOT-01, dsync a rattrapé les messages reçus pendant l’absence : les deux INBOX contenaient 14 messages.
- Le bilan de la documentation valide la redondance Postfix, la redondance Dovecot, la réplication dsync, le webmail, le failover et le rattrapage.
Limites et points de vigilance
- HAProxy reste unique dans cette version : 172.30.0.1 est encore un point unique de panne.
- Le certificat IMAP est un certificat de laboratoire avec CN localhost et la vérification du pair est désactivée dans Roundcube.
- Le socket replicator-doveadm est en 0666 et les comptes mail sont des utilisateurs Linux locaux sur les deux Dovecot.
- Le SMTP de Roundcube utilise le port 25 interne sans authentification ; une soumission 587 avec STARTTLS et SMTP AUTH est recommandée.
- La réplication assure la disponibilité, pas la sauvegarde : elle ne protège pas d’une suppression répliquée ou d’une corruption applicative.
Documentation complète
Documentation source : Infrastructure mail haute disponibilité, 14 août 2026, 40 pages. Le PDF contient les commandes, les fichiers de configuration et les captures du montage.