Vous êtes peut-être un adepte de l'auto-hébergement. Héberger par exemple ses propres mails est tentant par défi, goût de la liberté, ou défiance envers les géants d'Internet.

Vous avez donc configuré un serveur de mail chez vous, par exemple Dovecot. Vous en êtes fort contents mais bon :

  • il y a ce voisin, collectionneur de pelleteuses, charmant au demeurant, mais qui a quand même tendance à briser votre ligne Internet tout les quatre matins.
  • Il y a votre beau-frère, fan des cracheurs de feu, qui a malheureusement mis le feu à votre bureau en voulant faire une démonstration à ses neveux. Heureusement vous aviez des sauvegardes. Mais bon il a fallu un certain temps, voir un temps certain pour tout remettre en ordre de marche.

Là vous vous êtes dit, cela serait bien d'avoir un deuxième serveur pour accéder à vos mails si le premier est indisponible. Vous êtes donc allés voir votre beau-frère. En échange du retrait de votre plainte pour homicide, il a accepté d'héberger un serveur.

Maintenant il ne reste plus qu'à synchroniser les deux serveurs de mail...

Nous allons voir comment synchroniser une boîte mail avec l'utilitaire dsync fournis par Dovecot.

Prérequis

  1. Cette documentation est valable pour la version 2.1.7 de Dovecot :
    dovecot --version
    2.1.7
    
  2. Cette documentation ne couvre pas pas l'installation de Dovecot, Les deux serveurs doivent donc déjà être opérationnels.

Vérifier la bonne configuration de Dovecot pour les recherche d'utilisateur

Sous l'utilisateur qui sera utilisé pour la synchronisation (ici mail) nous allons vérifier que nous pouvons bien récupérer un utilisateur par la commande doveadm user :

doveadm user pandore
userdb: pandore
  home      : /var/spool/sieve/pandore

Si une erreur intervient avec le message suivant :

dovecot: auth: Error: userdb(pandore): client doesn't have lookup permissions for this user: userdb reply doesn't contain uid (change userdb socket permissions)

Nous devons nous assurer que Dovecot autorise bien les requêtes utilisateurs. Pour cela nous allons utiliser la commande doveconf avec le paramètre service/auth/unix_listener/auth-userdb qui correspond au réglage qui nous intéresse :

doveconf service/auth/unix_listener/auth-userdb
service auth-userdb {
  unix_listener {
    group = root
    mode = 0600
    user = root
  }
}

Ici nous voyons que seul l'utilisateur root a les droits pour faire une requête pour les utilisateurs, nous devons donc ajouter la configuration suivante pour autoriser la lecture par notre utilisateur mail :

service auth {
  unix_listener auth-userdb {
    mode = 0600
    user = mail
    group = mail
  }
}

Dans une Debian 7 (Wheezy) cela se rajoute dans la section service auth du fichier /etc/dovecot/conf.d/10-master.conf

Attention suivant votre configuration, ce fragment de configuration n'est pas forcément adapté, ne recopiez pas littéralement.

Première Synchronisation

Nous allons faire une synchronisation du premier serveur vers la second serveur en utilisant rsync par exemple. Nous supposons ici :

  • que l'utilisateur utilisé par Dovecot sur les deux serveurs est mail
  • que le spool de mail est dans /var/mail/ et qu'il est sous formait maildir

Pour chaque boîte mail que nous voulons synchroniser, ici pandore

rsync -a -e ssh  /var/mail/pandore/ mail@serveur2.localhost:var/mail/pandore/

Cette synchronisation permet de s'assurer que les deux serveurs Dovecot ait les même bases d'identifiants et éviter le message d'erreur suivant lors de la synchronisation par dsync :

dsync-local(pandore): Error: msg-get failed: box=INBOX.localhost.Server2 uid=2103 guid=1348067398.M642395P2690.Server2,S=20786,W=20935

Ces erreurs viennent d'une non synchronisation des identifiants sur les deux serveurs. Cela peut arriver si les deux serveurs ont reçu des mails séparément avant la mise en place de la synchronisation.

Synchronisation

La synchronisation régulière se fait donc par l'utilitaire dsync sous l'utilisateur choisi (ici mail) pour chaque boîte mail (ici pandore) :

dsync -u pandore mirror ssh mail@serveur2.localhost dsync -u pandore
-u pandore
indique la boite mail à synchroniser
mirror
indique que la réplication doit se faire dans les deux sens. backup permet de réaliser une sauvegarde en écrasant toutes les modifications du second serveur.
ssh mail@serveur2.localhost dsync -u pandore
indique de lancer par ssh la commande dsync -u pandore

Les codes retours sont :

0
La synchronisation s'est correctement déroulée.
2
La synchronisation s'est déroulée partiellement.

dsync-local(pandore): Warning: Mailbox changes caused a desync. You may want to run dsync again.
1
supérieur à 2
La synchronisation a rencontré une erreur. Pour la résoudre il est possible d'exécuter dsync en mode debug avec le drapeau -D :
dsync -D -u pandore mirror ssh mail@serveur2.localhost dsync -u pandore
doveadm(mail): Debug: Loading modules from directory: /usr/lib/dovecot/modules

Dans le cas d'une synchronisation partiel, nous pouvons écrire ce fragment de Bourne-again shell:

MAX_ATTEMPTS=5
RC=2
i=0
while [[ $RC == 2 && $MAX_ATTEMPTS < 5  ]] ; do
    dsync -u dsync -u pandore mirror ssh mail@serveur2.localhost dsync -u pandore
    RC=$?
    i=$(($i+1))
done

Ce script permet de relancer la synchronisation si nécessaire et dans une limite de 5 fois pour éviter une boucle infinie.

il nous suffit ensuite de mettre ce script dans une crontab pour répliquer notre boîte mail et ainsi regarder sereinement le concours de pelleteuses chez le voisin.