Migration von Cyrus 2.4 nach Dovecot

ucs-4
dovecot
installation
migration
cyrus
dovecot2cyrus
mailservice

#1

Disclaimer

Aufgrund der Vielfalt an verschiedenen Mail-Appliances und strukturell unterschiedlichen Umgebungen, geben wir keine Gewähr auf den folgenden Artikel. Wir empfehlen die Migration zuvorderst immer in einer Testumgebung durchzuführen und eventuelle Unverträglichkeiten und Inkompatibilitäten mit Ihrer Produktivumgebung auszuschließen sowie ein Backup anzufertigen!

Einführung

Dieser Artikel beschreibt das Migrieren eines Cyrus Mail-Spools in einen Dovecot Mail-Spool. Diese Migration behält Mail-Flags und eigene Mail-Ordner bei. Ebenso werden geteilte Ordner (sog. Shared Folders) nach Dovecot migriert. Wir verwenden hierzu das Skript “cyrus2dovecot” der Freien Universität Berlin, da dieses es erlaubt durch verschiedene Startparameter die Migration gut zu automatisieren.

Für die Migration wichtig ist das LDAP-Attribut univentionMailHomeServer, welches festlegt an welchen Server in der Domäne eingehende Mails zugestellt werden. Es ist an jedem Benutzer mit Mail-Adresse standardmäßig vorhanden. Haben wir eine Maschine auf welcher Dovecot installiert und somit Cyrus deinstalliert wird, werden automatisch neue (Dovecot-)Mailboxen für alle Nutzer, die diesen Server als mailHomeServer eingetragen haben, durch den Listener-Notifier-Mechanismus erstellt. Wird der univentionMailHomeServer auf eine andere Maschine gesetzt, werden dort Mailboxen erstellt, sofern dort Dovecot installiert ist.

Bei der Migration werden per univention-ldapsearch die Mail-Adressen aller betroffenen Nutzer abgerufen und an cyrus2dovecot übergeben, welches mit den Startparametern feststellt, wo sich die zu migrierenden Daten befinden und wohin sie migriert werden sollen.

Beachten Sie, dass das Migrationsskript den Mailspool von Cyrus nicht löscht und somit nach einer Migration auf der Maschine sowohl der neue Dovecot-Spool als auch die alten Daten von Cyrus vorhanden sind. Sollte dies ein Kapazitätsproblem darstellen, sind entsprechende Vorkehrungen zu treffen. Gleichzeitig besteht aber so auch die Möglichkeit eines Fallbacks auf die alte Cyrus-Appliance.

Wichtige Hinweise

Beachten Sie, dass es je nach ihrer Durchführung zu einer Downtime kommen kann. Sollten sie die ganze Migration nur auf einer Maschine vollziehen, ist eine Downtime unvermeidlich, in einer Umgebung mit mehreren Maschinen besteht die Möglichkeit vor der eigentlichen Migration die mailHomeServer-Attribute der betroffenen Nutzer skriptbasiert so zu ändern, dass eingehende Mails bis zur erfolgten Erstellung der neuen Mailbox noch in die alten Cyrus-Boxen gehen und danach in die neuen Dovecot-Boxen. Die danach erfolgende Migration migriert dann alle Mails aus dem Cyrus-Spool in die neuen Dovecot-Boxen. Dies ist entsprechend auch eine geeignete Methode, falls neben der Migration von Cyrus zu Dovecot auch ein Wechsel des Server vollzogen werden soll oder keinerlei Wartungsfenster besteht.

Zudem ist es möglicherweise notwendig, dass die Benutzernamen an Mailclients (Thunderbird, Outlook, Mobil-Devices, etc.) geändert werden müssen. Dovecot lässt nur Anmeldungen mit der vollen Mail-Adresse zu (user1@example.org) während Cyrus sowohl die UID (Benutzername) als auch die Mail-Adresse (user1@example.org) als Anmeldenamen akzeptiert.

In Place Migration (ersetzten von Cyrus durch Dovecot auf dem gleichen Server)

Bei der In Place Migration werden alle Schritte auf dem Mailserver (also auf dem System, wo bisher Cyrus installiert ist) als root-Benutzer ausgeführt.
Während der Migration kann es sein, dass die Clients, welche sich mit dem Mail-Server verbinden, eine völlig leere Mailbox vorfinden, wenn selbige zwar angelegt aber die Mails noch nicht hinein migriert wurden.

Vorbereitung

Skript herunterladen

Zunächst sollte das Migrationsskript auf den Server heruntergeladen werden. Die MD5-Prüfsumme zur Erstellung des Artikels lautete: 506bb048473ccdb44191d88130606f1d

  wget -nv https://raw.githubusercontent.com/a-schild/cyrus2dovecot/master/cyrus2dovecot

Sollten Sie eine Fehlermeldung bzgl. des Zertifikats bekommen führen Sie folgenden Befehl aus:

  wget -nv --no-check-certificate http://raw.githubusercontent.com/a-schild/cyrus2dovecot/master/cyrus2dovecot

Das heruntergeladene Skript muss noch ausführbar gemacht werden:

  chmod +x ./cyrus2dovecot

Installation Dovecot

Um Dovecot zu installieren und gleichzeitig Cyrus zu entfernen, kann folgender Befehl ausgeführt werden. /var/spool/cyrus und /var/lib/cyrus bleiben hiervon unberührt:

  univention-install univention-mail-dovecot

Prüfen der erstellten Dovecot-Mailboxen

Während der Installation von Dovecot werden für alle Mailuser neue Mailboxen in Dovecot angelegt. Diesen Prozess müssen Sie vor der Migration der Maildaten abwarten.

Um dem Prozess des Erstellens der Mailboxen durch den Listener zu prüfen, kann folgender Befehl genutzt werden:

  tail -f /var/log/univention/listener.log

Der Prozess ist abgeschlossen, wenn Sie im listener.log folgende Zeile sehen:

  LISTENER  ( WARN  ) : finished initializing module dovecot

Der Vorgang dauert je nach Anzahl der Mailbenutzer einige Minuten.

Migration der Maildaten

Nachdem alle Mailboxen in Dovecot erstellt worden sind, kann mit der eigentlichen Datenmigration fortgefahren werden. Ab diesem Zeitpunkt werden auch alle neu eingehenden Mails in die neuen Dovecot-Mailboxen zugestellt.

Prüfen der notwendigen Verzeichnisse

Für das Migrationsskript müssen diese Verzeichnisse vorhanden sein: /var/spool/cyrus, /var/lib/cyrus.
Sie enthalten alle Mails, sowie die Cyrus-Datenbank und müssen auf dem System, auf das migriert werden soll, vorhanden sein. Stellen Sie also sicher, dass der Mail-Spool und die Cyrus-Bibliothek vorhanden sind.

Ausführen des Skripts cyrus2dovecot

Wichtiger Hinweis: Die Migration kann lange dauern. Es ist stark davon abhängig um wie viele User es sich handelt und wie groß deren Mailboxen sind. Außerdem wird die gesamten Maildaten der Benutzer auf dem System von einem Ort (/var/spool/cyrus) an einen anderen Ort kopiert (/var/spool/dovecot). Achten Sie daher auf genügend freien Speicherplatz auf dem System.

Da die Pfade für User, welche mit Zahlen beginnen in Cyrus anders sind als für alle anderen gibt es zwei Befehle mit unterschiedlichen Startparametern. Zuerst werden die Benutzer, deren Mail-Adresse mit einer Zahl beginnt, migriert. Im Anschluss alle weiteren Benutzer. Die Pfade im Befehl sind an die Standard-Pfade für Cyrus und Dovecot unter UCS angelehnt. Sofern sich diese Pfade nicht an einem anderen Ort befinden als in folgenden Befehl beschrieben, empfehlen wir diesen zu nutzen, da er verschiedene Variablen verwendet, welche eine vollständige, erfolgreiche Migration sicherstellen.

Migration aller User, deren Mail-Adresse mit einer Zahl beginnt

Für die Migration aller User, deren Mail-Adresse mit einer Zahl beginnt:

  for number in $(univention-ldapsearch -LLLo ldif-wrap=no "(&(univentionMailHomeServer=$(hostname -f))(mailPrimaryAddress=*)(!(objectClass=univentionMailSharedFolder)))" dn mailPrimaryAddress | grep "^mailPrimaryAddress" | cut -f2 -d" " | grep "^[0-9]"); do [ -n "${number}" ] && ./cyrus2dovecot -C /var/spool/cyrus/mail/domain/%g/%d/q/user/%U -U /var/lib/cyrus/domain/%g/%d/user/q/%U.sub -S /var/lib/cyrus/domain/%g/%d/user/q/%U.seen -D /var/spool/dovecot/private/%d/%P/Maildir -u "${number}" | tee ./cyrus2dovecot-numbers.log; done

Migration aller User, deren Mail-Adresse nicht mit einer Zahl beginnt

Für die Migration aller User, deren Mail-Adresse nicht mit einer Zahl beginnt:

  for char in $(univention-ldapsearch -LLLo ldif-wrap=no "(&(univentionMailHomeServer=$(hostname -f))(mailPrimaryAddress=*)(!(objectClass=univentionMailSharedFolder)))" dn mailPrimaryAddress | grep "^mailPrimaryAddress" | cut -f2 -d" " | grep "^[^0-9]"); do [ -n "${char}" ] && ./cyrus2dovecot -C /var/spool/cyrus/mail/domain/%g/%d/%1u/user/%U -U /var/lib/cyrus/domain/%g/%d/user/%1u/%U.sub -S /var/lib/cyrus/domain/%g/%d/user/%1u/%U.seen -D /var/spool/dovecot/private/%d/%P/Maildir -u "${char}" | tee ./cyrus2dovecot.log; done

Migration aller Shared Folder, deren Mail-Adresse mit einer Zahl beginnt

Migrations-Befehl für Shared Folder, deren Mail-Adresse mit einer Zahl beginnt:

  for sharednumber in $(univention-ldapsearch -LLLo ldif-wrap=no "(&(univentionMailHomeServer=$(hostname -f))(mailPrimaryAddress=*)(objectClass=univentionMailSharedFolder))" dn cn | grep "^cn" | cut -f2 -d" " | grep "^[^0-9]"); do [ -n "${sharednumber}" ] && ./cyrus2dovecot -C /var/spool/cyrus/mail/domain/%g/%d/%1u/shared/%U -U /var/lib/cyrus/domain/%g/%d/shared/%1u/%U.sub -S /var/lib/cyrus/domain/%g/%d/shared/%1u/%U.seen -D /var/spool/dovecot/private/%d/%P/Maildir -u "${sharednumber}" | tee ./cyrus2dovecot_shared-numbers.log; done

Migration aller Shared Folder, deren Mail-Adresse nicht mit einer Zahl beginnt

Migrations-Befehl für Shared Folder, deren Mail-Adresse nicht mit einer Zahl beginnt:

  for sharedchar in $(univention-ldapsearch -LLLo ldif-wrap=no "(&(univentionMailHomeServer=$(hostname -f))(mailPrimaryAddress=*)(objectClass=univentionMailSharedFolder))" dn cn | grep "^cn" | cut -f2 -d" " | grep "^[0-9]"); do [ -n "${sharedchar}" ] && ./cyrus2dovecot -C /var/spool/cyrus/mail/domain/%g/%d/q/shared/%U -U /var/lib/cyrus/domain/%g/%d/user/q/%U.sub -S /var/lib/cyrus/domain/%g/%d/shared/q/%U.seen -D /var/spool/dovecot/private/%d/%P/Maildir -u "${sharedchar}" | tee ./cyrus2dovecot_shared.log; done

Migration prüfen und abschließen

In den Dateien cyrus2dovecot.log und ggf. cyrus2dovecot-numbers.log sowie auf der Standardausgabe finden Sie eine detaillierte Aufzählung wie viele Mails von welchem Benutzer in welcher Zeit migriert wurden.

Ist die Migration abgeschlossen empfiehlt es sich noch die Rechte der migrierten Dateien anzupassen:

  chown -R dovemail /var/spool/dovecot/

Nachbereitung

Ist die Migration erfolgreich abgeschlossen worden und die Funktionalität des neuen Mailstacks sowie das Vorhandensein der alten Mails in den neuen Mailboxen validiert worden, kann der alte Cyrus Mailspool von der Maschine entfernt werden. Zudem kann eine Bereinigung der Cyrus-Pakete durchgeführt werden.

Deinstallation der Cyrus Paket

Die nicht mehr benötigten Cyrus Komponenten können entfernt werden:

  apt-get purge cyrus-admin-2.4 cyrus-common cyrus-common-2.4 cyrus-imapd-2.4 cyrus-pop3d-2.4 libcyrus-imap-perl24
  apt-get autoremove

Löschen der Cyrus Maildaten

Die alten Cyrus-Maildaten können Sie entfernen indem Sie /var/spool/cyrus und /var/lib/cyrus löschen:

  rm -rf /var/lib/cyrus /var/spool/cyrus

Migration von Cyrus zu Dovecot mit einem Serverwechsel

Es ist möglich, die Migration von Cyrus zu Dovecot auf einen neuen Server durchzuführen. Das ausführbare Skript ändert sich nicht, lediglich die Befehle werden leicht verändert. Außerdem müssen die Verzeichnisse mit den Maildaten von Cyrus auf dem neuen System eingebunden werden (z.B. per NFS-Freigabe).

Im ersten Schritt wird der neue Mailserver vorbereitet und die Dovecot-Mailboxen für alle Benutzer auf dem neuen Server erstellt. Anschließend wird beschrieben, wie man die Maildaten von Cyrus auf dem neuen Server per NFS einbindet. Daraufhin muss ein etwas anderer Migrationsbefehl ausgeführt werden, als bei der In Place Migration.

Vorbereitung

Skript herunterladen

Zunächst sollte das Migrationsskript auf den Server heruntergeladen werden:

  wget -nv https://raw.githubusercontent.com/a-schild/cyrus2dovecot/master/cyrus2dovecot

Sollten Sie eine Fehlermeldung bzgl. des Zertifikats bekommen führen Sie folgenden Befehl aus:

  wget -nv --no-check-certificate http://raw.githubusercontent.com/a-schild/cyrus2dovecot/master/cyrus2dovecot

Das heruntergeladene Skript muss noch ausführbar gemacht werden:

  chmod +x ./cyrus2dovecot

Installation Dovecot

Installieren Sie über das App Center den Mailserver auf dem neuen UCS System. Alternativ können Sie dies mit folgendem Befehl auf der Kommandozeile auf dem neuen Mailserver durchführen:

  univention-app install mailserver

Zudem sollten die neuen Join-Skripte ausgeführt werden, falls dies während der Installation nicht geschah.

  univention-run-join-scripts

Benötigte Verzeichnisse per NFS einbinden

Für das Migrationsskript müssen diese Verzeichnisse vorhanden sein: /var/spool/cyrus, /var/lib/cyrus.
Sie enthalten alle Mails, sowie die Cyrus-Datenbank und müssen auf dem System, auf das migriert werden soll, vorhanden sein. Für die Migration auf ein neues System, machen Sie die beiden Verzeichnisse bspw. durch eine NFS Freigabe auf dem Zielsystem verfügbar. Erstellen Sie auf dem alten Mailserver jeweils eine NFS Freigabe über die UMC für die Verzeichnisse /var/spool/cyrus und /var/lib/cyrus. Wichtig: stellen Sie bei der NFS Freigabe das Root-Squashing aus (Haken bei “User-ID für Root-Benutzer ändern (Root-Squashing)” entfernen). Anschließend können die Freigaben mit folgenden Befehlen auf dem neuen Server eingebunden werden:

  mkdir /var/spool/cyrus
  mkdir /var/lib/cyrus
  mount ALTER MAILSERVER:/var/spool/cyrus /var/spool/cyrus
  mount ALTER MAILSERVER:/var/lib/cyrus /var/lib/cyrus/

Dovecot Mailboxen erstellen / mailHomeServer-Attribut umstellen

Um für alle Mailuser eine neue Mailbox in Dovecot auf dem neuen Server zu erstellen, muss das mailHomeServer-Attribut auf den neuen Mailserver gesetzt werden. Dies können Sie durch das Editieren der Benutzer in der UMC (Mass-Edit) oder durch folgenden Befehl durchführen.

Führe Sie diesen Befehl auf dem UCS Master aus.
Ersetzten Sie FQDN neuer Mailserver, sowie FQDN alter Mailserver entsprechend durch die FQDNs der Server.

  while read i; do udm users/user modify --dn "${i}" --set mailHomeServer="FQDN neuer Mailserver"; done (univention-ldapsearch -LLLo ldif-wrap=no "((univentionMailHomeServer=FQDN alter Mailserver)(mailPrimaryAddress=*))" dn mailPrimaryAddress | grep ^dn | cut -f2 -d" ")

Der Befehl wird je nach Anzahl der Mailuser einige Zeit benötigen.

Prüfen der erstellten Dovecot-Mailboxen

Während der Umstellung des mailHomeServer-Attributs werden für alle Mailuser neue Mailboxen in Dovecot auf dem neuen Mailserver angelegt. Diesen Prozess müssen Sie vor der Migration der Maildaten abwarten.

Um dem Prozess des Erstellens der Mailboxen durch den Listener zu prüfen, kann folgender Befehl genutzt werden:

  tail -f /var/log/univention/listener.log

Der Vorgang dauert je nach Anzahl der Mailbenutzer einige Minuten.

Migration der Maildaten

Nachdem alle Mailboxen in Dovecot erstellt worden sind, kann mit der eigentlichen Datenmigration fortgefahren werden. Ab diesem Zeitpunkt werden auch alle neu eingehenden Mails in die neuen Dovecot-Mailboxen zugestellt. Die weiteren Befehle führen Sie auf dem neuen Mailserver aus.

Ausführen des Skripts cyrus2dovecot

Wichtiger Hinweis: Die Migration kann lange dauern. Es ist stark davon abhängig um wie viele User es sich handelt und wie groß deren Mailboxen sind. Außerdem wird die gesamten Maildaten der Benutzer auf dem System von einem Ort (/var/spool/cyrus) an einen anderen Ort kopiert (/var/spool/dovecot). Achten Sie daher auf genügend freien Speicherplatz auf dem System.

Da die Pfade für User, welche mit Zahlen beginnen, in Cyrus anders sind als für alle anderen, gibt es zwei Befehle mit unterschiedlichen Startparametern. Zuerst werden die Benutzer, deren Mail-Adresse mit einer Zahl beginnt, migriert. Im Anschluss alle weiteren Benutzer. Die Pfade im Befehl sind an die Standard-Pfade für Cyrus und Dovecot unter UCS angelehnt. Sofern sich diese Pfade nicht an einem anderen Ort befinden als in folgenden Befehl beschrieben, empfehlen wir diesen zu nutzen, da er verschiedene Variablen verwendet, welche eine vollständige, erfolgreiche Migration sicherstellen.

Es empfiehlt sich während der Migration noch den “Host-Basename” der Mails zu modifizieren, dies ist in den folgenden Befehlen mit umgesetzt. Beachten Sie, dass es sich nur um den einfachen Hostname geht also “host2” und nicht den FQDN (host2.domäne.org).

Migration aller User, deren Mail-Adresse mit einer Zahl beginnt

Für die Migration aller User, deren Mail-Adresse mit einer Zahl beginnt:

  for number in $(univention-ldapsearch -LLLo ldif-wrap=no "(&(univentionMailHomeServer=$(hostname -f))(mailPrimaryAddress=*)(!(objectClass=univentionMailSharedFolder)))" dn mailPrimaryAddress | grep "^mailPrimaryAddress" | cut -f2 -d" " | grep "^[0-9]"); do [ -n "${number}" ] && ./cyrus2dovecot --dovecot-host=$(hostname) -C /var/spool/cyrus/mail/domain/%g/%d/q/user/%U -U /var/lib/cyrus/domain/%g/%d/user/q/%U.sub -S /var/lib/cyrus/domain/%g/%d/user/q/%U.seen -D /var/spool/dovecot/private/%d/%P/Maildir -u "${number}" | tee ./cyrus2dovecot-numbers.log; done

Migration aller User, deren Mail-Adresse nicht mit einer Zahl beginnt

Für die Migration aller User, deren Mail-Adresse nicht mit einer Zahl beginnt:

  for char in $(univention-ldapsearch -LLLo ldif-wrap=no "(&(univentionMailHomeServer=$(hostname -f))(mailPrimaryAddress=*)(!(objectClass=univentionMailSharedFolder)))" dn mailPrimaryAddress | grep "^mailPrimaryAddress" | cut -f2 -d" " | grep "^[^0-9]"); do [ -n "${char}" ] && ./cyrus2dovecot --dovecot-host=$(hostname) -C /var/spool/cyrus/mail/domain/%g/%d/%1u/user/%U -U /var/lib/cyrus/domain/%g/%d/user/%1u/%U.sub -S /var/lib/cyrus/domain/%g/%d/user/%1u/%U.seen -D /var/spool/dovecot/private/%d/%P/Maildir -u "${char}" | tee ./cyrus2dovecot.log; done

Migration aller Shared Folder, deren Mail-Adresse mit einer Zahl beginnt

Migrations-Befehl für Shared Folder, deren Mail-Adresse mit einer Zahl beginnt:

  for sharednumber in $(univention-ldapsearch -LLLo ldif-wrap=no "(&(univentionMailHomeServer=$(hostname -f))(mailPrimaryAddress=*)(objectClass=univentionMailSharedFolder))" dn cn | grep "^cn" | cut -f2 -d" " | grep "^[^0-9]"); do [ -n "${sharednumber}" ] && ./cyrus2dovecot --dovecot-host=$(hostname) -C /var/spool/cyrus/mail/domain/%g/%d/%1u/shared/%U -U /var/lib/cyrus/domain/%g/%d/shared/%1u/%U.sub -S /var/lib/cyrus/domain/%g/%d/shared/%1u/%U.seen -D /var/spool/dovecot/private/%d/%P/Maildir -u "${sharednumber}" | tee ./cyrus2dovecot_shared-numbers.log; done

Migration aller Shared Folder, deren Mail-Adresse nicht mit einer Zahl beginnt

Migrations-Befehl für Shared Folder, deren Mail-Adresse nicht mit einer Zahl beginnt:

  for sharedchar in $(univention-ldapsearch -LLLo ldif-wrap=no "(&(univentionMailHomeServer=$(hostname -f))(mailPrimaryAddress=*)(objectClass=univentionMailSharedFolder))" dn cn | grep "^cn" | cut -f2 -d" " | grep "^[0-9]"); do [ -n "${sharedchar}" ] && ./cyrus2dovecot --dovecot-host=$(hostname) -C /var/spool/cyrus/mail/domain/%g/%d/q/shared/%U -U /var/lib/cyrus/domain/%g/%d/user/q/%U.sub -S /var/lib/cyrus/domain/%g/%d/shared/q/%U.seen -D /var/spool/dovecot/private/%d/%P/Maildir -u "${sharedchar}" | tee ./cyrus2dovecot_shared.log; done

Migration prüfen und abschließen

In den Dateien cyrus2dovecot(_shared).log und ggf. cyrus2dovecot(_shared)-numbers.log sowie auf der Standardausgabe finden Sie eine detaillierte Aufzählung wie viele Mails von welchem Benutzer in welcher Zeit migriert wurden.

Ist die Migration abgeschlossen empfiehlt es sich noch die Rechte der migrierten Dateien anzupassen:

  chown -R dovemail /var/spool/dovecot/

Die NFS Freigabe können Sie wieder entfernen und vorher die Freigaben aushängen:

  umount /var/lib/cyrus /var/spool/cyrus

Nachbereitung

Ist die Migration erfolgreich abgeschlossen worden und die Funktionalität des neuen Mailstacks sowie das Vorhandensein der alten Mails in den neuen Mailboxen validiert worden, kann der alte Cyrus Mailspool von der Maschine entfernt werden. Zudem kann eine Bereinigung der Cyrus-Pakete durchgeführt werden.

Damit die Mailuser wieder an ihre Mails/Postfächer kommen, müssen in den Clients und Webanwendungen der neue Mailserver eingetragen werden. Ggf lässt sich der DNS Name des alten Mailservers auf die IP Adresse des neuen Mailserver übertragen.

Deinstallation der Cyrus Paket auf dem alten Mailserver

Auf dem alten Mailserver kann über das App Center die Mailstack entfernt werden. Alternativ können Sie auf dem Server folgendes aufrufen:

  univention-app remove mailserver

Löschen der Cyrus Maildaten

Die alten Cyrus Maildaten entfernen Sie wie folgt von der Maschine. Dazu einfach /var/spool/cyrus und /var/lib/cyrus löschen:

  rm -rf /var/lib/cyrus /var/spool/cyrus

Sdb.univention.de