Introduction

Cela fait maintenant quelques années que j'ai mis en fonctionnement une chaîne de gestion de courrier électronique sur ce serveur auto-hébergé. Dernièrement, j'ai eu quelques ennuis avec un des maillons de cette chaîne: le serveur IMAP Dovecot. Ce dernier a changé de version sous Debian (passage de la version 1 à la version 2) ce qui m'a demandé une bonne reconfiguration car les fichiers et les directives de configuration ont complètement changé entre ces deux versions. Mais j'ai également constaté un autre problème: lors du redémarrage du serveur, Dovecot n'est pas lancé au démarrage. Je devais toujours le lancer manuellement malgré sa présence dans les scripts Sysinit.

En conséquence, à chaque fois que le serveur reboote, par suite d'un arrêt électrique comme une coupure, il fallait que je relance dovecot manuellement. Avec la tempête des derniers jours, il semble qu'il y ait eu quelques coupures de courant électrique et tout ce travail supplémentaire de lancement manuel m'a donc donné de la motivation pour changer tout ça.

Qu'est-ce-qui cloche ?

A force de recherches, j'ai trouvé ce bug référencé dans le paquet Debian de Dovecot. Le phénomène est identique chez moi. L'erreur typique est de trouver dans les logs (généralement /var/log/syslog) des lignes du type:

Mar 29 10:14:00 debianplug dovecot: bind([votre ipv6], 143) failed: Cannot assign requested address
Mar 29 10:14:00 debianplug dovecot: Fatal: listen([votre ipv6], 143) failed: Cannot assign requested address

Cela indique que dovecot n'a pas pu utiliser l'adresse IP(v6) sur le périphérique réseau. Ma configuration est des plus classique: j'utilise une adresse IP(v6) fixe, configurée dans /etc/network/interfaces, le système de configuration classique de Debian. Le problème vient du fait que la mise en fonctionnement d'IPv6 sur un périphérique réseau prend un peu de temps, notamment, le fait de trouver les routeurs qui fournissent des attributions d'adresse automatique. Sur un sheevaplug, il semble que Dovecot se lance avant que la pile IPv6 soit complètement fonctionnelle et disponible.

Si vous lisez le contenu du bug, vous constaterez qu'à ce jour, il n'y a pas de correction ! Mes souvenirs d'administrateur système m'ont donné une piste à suivre...

Correction

Si Dovecot démarre trop tôt, il suffit de la faire démarrer plus tard ! C'est l'idée assez simple pour corriger le problème.

Par défaut, mon système démarre sur le runlevel 2 (défaut dans Debian) et dovecot est lancé de bonne heure:

ls /etc/rc2.d/
-rw-r--r-- 1 root root 677 juil. 14 19:24 README
lrwxrwxrwx 1 root root  14 oct.   8  2012 S01motd -> ../init.d/motd
lrwxrwxrwx 1 root root  17 oct.   8  2012 S01rsyslog -> ../init.d/rsyslog
lrwxrwxrwx 1 root root  17 juin  28 09:14 S02apache2 -> ../init.d/apache2
lrwxrwxrwx 1 root root  17 oct.  31 10:23 S02dovecot -> ../init.d/dovecot
...

L'idée est de le lancer plus tard. Pour que ça fonctionne, vous devez modifier manuellement l'ordre de lancement (en modifiant le chiffre après S du lien symbolique vers /etc/init.d/dovecot). En effet, l'utilitaire update-rc.d qui permet de gérer les ordres de lancement des scripts sysinit se base sur les dépendances pour attribuer le classement. Pour que ça fonctionne, je vous recommande de mettre un chiffre élevé (genre S90dovecot) et ce, dans les runlevels 2 3 4 5.

Une fois les noms de fichiers modifiés, plus de problème: dovecot se lance suffisamment tard pour que la pile IPv6 soit disponible. Le tour est joué !

Conclusion

En attendant que Debian corrige le problème du paquet Dovecot, on peut utiliser cette méthode old-school artisanale. Bien entendu, si vous utilisez systemd, c'est un autre problème que je n'aborderai pas ici ;-).