← Retour aux projetsÉtude de cas / Services & Linux

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.

Environnement
Proxmox · conteneurs LXC Debian 12
Périmètre
SMTP, LMTP, IMAP, webmail, réplication et failover
Statut
Projet laboratoire documenté
Documentation
40 pages · PDF

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.

Schéma de l’architecture mail redondante : Internet et Roundcube vers HAProxy, puis deux Postfix et deux Dovecot répliqués.
Schéma 1 — Architecture logique finale du laboratoire de messagerie (documentation source). Voir en grand — Schéma 1 — Architecture logique finale du laboratoire de messagerie (documentation source). (nouvel onglet)
  • 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

PostfixDovecotLMTPIMAPHAProxyRoundcubedsyncdoveadmDebian 12Proxmox LXCSTARTTLSDNAT

Réalisation technique

  1. Mettre en place le plan d’adressage et les conteneurs LXC sur le réseau 172.30.0.0/24.
  2. Publier SMTP via DNAT et HAProxy, avec deux backends Postfix en round-robin et health checks.
  3. Configurer Postfix : domaines virtuels, transport LMTP vers le Dovecot primaire et fallback vers le second.
  4. Activer LMTP dans Dovecot, associer les adresses mail aux utilisateurs et passer le stockage en Maildir.
  5. Installer Roundcube et l’intégrer à HAProxy pour IMAP STARTTLS sur 143 et SMTP interne sur 25.
  6. Configurer la réplication dsync : listener doveadm, secret dédié, plugin notify et service replicator.
  7. Tester la chaîne complète avec swaks, telnet, openssl s_client, doveadm et les journaux des services.
  8. 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

Difficultés rencontrées, causes et corrections
SymptômeCauseCorrection
Postfix : missing = after attribute nameDirective mal formée ou continuation sans indentation.Réécrire la directive et indenter correctement les lignes suivantes.
LMTP 550 User doesn’t existDovecot 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 mechanismRoundcube tentait un LOGIN non annoncé par Dovecot.Déclarer auth_mechanisms = plain login.
Plaintext authentication disabledLOGIN était tenté avant le chiffrement de la session.Utiliser STARTTLS sur IMAP 143 avant l’authentification.
Configured passdbs don’t support credentials lookupsdoveadm_port global incompatible avec la configuration PAM.Supprimer doveadm_port et placer :12345 dans mail_replica.
Panic mbox-lock.cLe stockage mbox était utilisé pendant la réplication dsync.Passer les deux nœuds en Maildir.
bind : Cannot assign requested addressUn 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-doveadmSocket 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èmeuserdb é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 pairLe 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.