Migration von virtuellen Cyrus-Mailboxen auf einen anderen Mailserver

Aus aktuellem Anlass habe ich mal ein kleines Howto zusammengefasst, wie ein produktiv laufender Postfix/Cyrus-Mailserver im laufenden Betrieb von einer Maschine (server1) auf eine andere Maschine (server2) umgezogen werden kann. Ziel ist, dies ohne nennenswerte Beeinträchtigung durchzuziehen. Das dabei keine Mails verloren gehen dürfen, ist absolut entscheidend.

Die grundlegende Mailserver-Konfiguration ist nach dem DebianMailserver3-Howto auf beiden Maschinen identisch, auf server2 sind aber keinerlei Maildomains bzw Postfächer konfiguriert.

Unser alter Server:
- Debain Woody mit verfrickeltem Cyrus IMAP 1.5.19 aus alten Backports
- Postfix als MTA
- MySQL 3.4 mit phpMyAdmin
- Webcyradm als Mail-Administration

Der neue Server
- Debian Etch mit allen Aktualisierungen
- Postfix als MTA
- Cyrus IMAPd 2.2
- SASL 1.5.24
- MySQL 5.0 mit phpMyAdmin
- WebCyrAdm


Los gehts, wir haben für die ganze Aktion ca. 3 Stunden incl. Schönheitskorrekturen am Webinterface benötigt. Vorher waren nochmal 3-4 Stunden Vorarbeit nötig, um dieses HowTo auszuknobeln und zu testen.

1.) Webinterface zur Mailadministration auf temporäre Seite umbiegen oder Webserver herunterfahren

s1$ /etc/init.d/apache stop


2.) shutdown cyrus auf server1 und server2

s1$ /etc/init.d/cyrus stop
s2$ /etc/init.d/cyrus stop


3.) Dump der MySQL-Mail-Datenbanken von server1

s1$ mysqldump -xn cyrus-mail > oldmaildb.sql


4.) Dump des Maildir und des Spooldirs von Server 1: /var/spool/cyrus

s1$ tar cvf spooldir-s1.tar /var/spool/cyrus/*
s1$ tar cvf maildir-s1.tar /var/cyrus/*


5.)Dump des Settings-Dir von  Server 1: /var/lib/cyrus

s1$ /var/lib/cyrustar cvf configdir.tar /var/lib/cyrus


6.) Datenbank von server1 in Datenbank von server2 migrieren

s2$ mysqlimport cyrus-mail oldmaildb.sql


7.) Postfix auf Server 2 anhalten
Damit kann Server 2 erstmal keine Mails mehr annehmen, bis die eigentliche Datenübernahme abgeschlossen ist.

s2$ /etc/init.d/postfix stop



8.) Postfix ds01 als relay für alle eingehenden Mails auf ds02 konfigurieren

9.) Datenbank auf Server 1 leeren und Postfix-Auth von Server 2 beziehen
Zwei Möglichkeiten stehen einem an dieser Stelle offen:
  • Mail-DB auf Server 1 erhalten
  • Mail-DB von Server 2 nutzen

Bei der momentanen Konfiguration kommen eingehende Mails ja noch hier an und müssen an den neuen Server relayed werden. Da aber (bei sinnvoller Mailkonfiguration) fragt Postfix aber vor jeder Mailannahme ab, ob zu der Zielmailadresse ein entsprechendes Konto in der Datenbank existiert.

Für die quick&dirty-Lösung erhält man einfach die alte Datenbank für ca. 1 Woche, bi man relativ sicher sein kann, das alle DNS-Records sich auf die neue IP-Adresse aktualisiert haben.

Der sauberere Weg ist natürlich, die Auth-Daten aus der Mail-Datenbank des neuen Servers zu verwenden. So stellt man sicher, daß auch nach der Umstellung angelegte Mail-Konten sofort akzeptiert werden.

Hier die wichtigsten Ändrungen in der mysql-virtual.cf

s2$ less /etc/postfix/mysql-virtual.cf
#
# mysql config file for alias lookups on postfix
# comments are ok.
#
# the user name and password to log into the mysql server
hosts = server2
user = <yourMailUser>
password = <yourSecret>
# the database name on the servers
dbname = cyrus-mail


10.) Cyrus Server 1 hochfahren
Cyrus kann auf dem alten Server wieder gestartet werden, wird aber eigentlich (ausser möglicherweise für lokale Mailaccounts) nicht mehr benötigt. Postfix versucht eingehende Mails an den neuen Server 2 weiterzuleiten, wird aber keinen Erfolg haben und die Mails temporär zwischenspeichern.

s1$ /etc/init.d/cyrus start

 

11.) Von Spool- und Mail-Dir auf Server 2 sicherheitshalber ein Backup anfertigen
Diese beiden Verzeichnisse sollten eigentlich keine relevanten Informationen enthalten, sicherheitshalber sollte man trotzdem ein Backup davon erzeugen

s2$ tar czvf spooldir-s2.tgz /var/spool/imap/*
s2$ tar czvf maildir-s2.tgz /var/imap/*

12.) Löschen von Spool- und Maildir auf Server 2
Diese beiden Ordner müüsen für den kompletten Inhalt der Spool- und Mail-Verzeichnisse des alten Mailservers vorbereitet werden.
 
s2$ rm -r /var/spool/imap/*
s2$ rm -r /var/imap/

13.) Backup-Dateien von Server 1 auspacken und an die richtige Stelle im Dateisystem verschieben
Zur Sicherheit sollte man die Daten erst in einen temporären Ordner extrahieren und anschliessend an die richtigen Positionen verschieben.
 
s2$ mkdir /tmp/maildir
s2$ mkdir /tmp/spooldir

s2$ cd /tmp/maildir
s2$ tar xf maildir-s1.tar
s2$ mv * /var/imap

s2$ cd /tmp/spooldir
s2$ tar xf spooldir-s1.tar
s2$ mv * /var/spool/imap

14.) Alle noch benötigten Mailbox-Verzeichnisse erzeugen lassen
Cyrus bringt dafür ein eigenes Werkzeug mit, dessen wir und an dieser Stelle einfach bedienen können.

 

s2$ /usr/cyrus/tools/mkimap


15. Berechtigungen für die Maildateien korrigieren
Dieser Schritt darf auf keinen Fall vergessen werden, sonst kann Cyrus werder Mails noch Mailboxen verwalten!

s2$ chown -R cyrus:mail /var/spool/imap/*
s2$ chown -R cyrus:mail /var/imap/*

 

16.) Mailbox-Datei auf Server 2 migrieren (mailboxes)
Die Mailbox-Datei stellt die zentrale Datenbank dar, in der Cyrus Zugriffsrechte und Konteninformationen verwaltet.
s2$ su cyrus
s2$ /usr/cyrus/tools/undohash
s2$ /usr/cyrus/tools/dohash

s2$ cd /var/imap
s2$ /usr/cyrus/bin/ctl_mboxlist -u < mailboxes

cd 


17.) Rekonstruktion der Mailbox-Daten
Die interne mailboxes-Datenbank von cyrus muss neu aufgebaut werden. Das kann Cyrus ganz einfach selbst übernehmen. Dieser Schritt kann nicht rückgängig gemacht werden, da dabei das erforderliche Versionsupgrade der internen Datenstrukturen durchgeführt wird.

cd /var/spool/imap
/usr/cyrus/bin/reconstruct -r user.*


18.) An dieser Stelle muss die DNS-Information in den Zonefiles aller Domains durchgeführt werden. Dabei werden die mailto-Records und die A-Records für die Maildomains auf die IP des neuen Server 2 gesetzt.


19.) delivered.db löschen
Die delivered.db des alten Servers ist für das neue Mail-Setup nicht mehr erforderlich und wird unzugänglich gemacht

s2$ mv /var/imap/delivered.db /var/imap/_delivered.db

# 8. Cyrus user verlassen und temporäre Verzeichnisse löschen
s2$ exit
s2$ rm -rf /tmp/maildir
s2$ rm -rf /tmp/spooldir

 

21.) Alle Prozesse neu starten

s2$ /etc/init.d/cyrus start
s2$ /etc/init.d/postfix start
 

Wenn man jetzt alles richtig gemacht hat, sollte sofort ein Mailzugriff über IMAP und POP3 möglich sein. Die User haben so nur ein paar MInuten Ausfallzeit für beide Dienste verkranften müssen, solange die eigentlichen Daten kopiert und die Cyrus-Verwaltung-Informationen aufgebaut werden.

Zusätzliche Informationen