Migration Emailkonten von confixx nach Syscp

Abgelegt unter

Erfahrungen, die ich machte und die anderen eventuell helfen können.

Ich kann weder garantieren, dass diese Anleitung vollständig ist, noch dass sie fehlerfrei ist. Möglicherweise richtet sie sogar Schaden auf Ihrem System an, oder es können Daten verloren gehen. Bitte beachten Sie, dass sie nur von Menschen verwendet sollte, die aufgrund ihres Fachwissens in der Lage sind, solche Schäden zu vermeiden.

 

Da ich es für Kunden als unzumutbar erachte, ihre Email-Zugangsdaten zu ändern, suchte ich nach einem Weg, diese nach Syscp zu migrieren, ohne das Emailsystem von Syscp zu beinträchtigen.

Der migrierte Kunde kann die Email-Konten ganz normal verwalten. Sie werden unter Syscp als erstes unter dem Menüpunkt Email/ Adressen aufgeführt (ohne Domain-Header). Der Kunde kann diese ändern und Weiterleitungen hinzufügen. Wenn er sie jedoch löscht, kann er sie nie wieder anlegen, da ihm die Dummy-Domain 'account' nicht gehört. Neu angelegte Kunden sollten durch die Anpassungen keine Beeinträchtungen bemerken.

Nicht beschrieben habe ich, wie man die Emails selbst vom alten auf den neuen Server bekommt, da dies stark vom verwenden Mailsystem des Ausgangsserves abhängt.

1. Ausgangsituation

Ausgangsystem:

Suse 9.3 Rootserver mit Confixx 3pro

Zielsystem:

Ubuntu Dapper 6.06 LTS mit folgenden Voraussetzungen

  • Der Mysql-Server 5.x ist installiert. Die Version 5 ist so wichtig, weil Views verwendet werden.
  • Funktionsfähige Grundinstallation Syscp 1.2.15/ 1.2.16
  • Alle Kunden wurden angelegt und genau so benannt wie auf dem alten System
  • Domains sind ebenfalls angelegt und zwar genau so wie auf dem alten System
  • Email und Courier/ Imap/ Maildrop arbeiten prinzipiell korrekt
  • Es sollten crypted-Passwords verwendet werden (lt. folgender Anleitung www.syscp.de/wiki/contrib/CryptedMailPasswords)
  • Das Mailsystem sollte sich nocht nicht im Echtbetrieb befinden, dh. der Server sollte nirgendwo als MX eingetragen sein.
  • Nicht zwingend, aber hilfreich: phpMyAdmin
2. Vorbereitung

Es wird ein Mysql-Admin-User benötigt, der auf alle Datenbanken Zugriff hat. Das kann mit phpmyadmin geschehen oder an der Konsole. Anschließen solle eine Datei mit dem Namen /root/.my.cnf angelegt werden:

# EDITOR /root/.my.cnf:

[client]

user=[myadminuser]

password=[passwort]

host=localhost

# chmod 600 /root/.my.cnf

Nun sollte man sich mit

mysql syscp
ohne Passwortnachfrage in die syscp-Datenbank einloggen können.

# mysql syscp

Welcome to the MySQL monitor. Commands end with ; or \g.

Your MySQL connection id is .....

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql>

Wenn das klappt, muss die confixx-Datenbank auf den neuen Server übertragen werden (am besten mit phpMyAdmin).

Einen eigener Benutzer für diese Datenbank anzulegen ist nicht notwendig.

Noch ein Hinweis zu den crypted passwords:

Bei mir hat das Ganze so funktioniert, wie beschrieben. Ein kleiner Schönheitsfehler jedoch blieb zurück:

/etc/init.d/saslauthd restart/stop
funktionierten nicht mehr, weil durch die geänderteten Startparameter das pid-file nicht mehr dort liegt, we es das Start-Stop-Script erwartet. Durch das Hinzufügen von
PIDFILE="/var/spool/postfix/var/run/saslauthd/saslauthd.pid"
ans Ende von
/etc/default/saslauthd
funktioniert das wieder einwandfrei.

Testen, ob das bisherige Email-System funktioniert, geht (bei bestehendem Email-Konto mit bekanntem Passwort) so:

# testsaslauthd -f /var/spool/postfix/var/run/saslauthd/mux \

-u [konto] -p [passwort] -s smtp

0: OK "Success."

# courierauthtest [konto] [passwort]

Trying authdaemon...

Authenticated: module authdaemon

Home directory: /var/spool/kunden/mail

UID/GID: 2000/2000

Maildir: web1/mail@domain.de/

AUTHADDR=mail@domain.de

AUTHFULLNAME=<none>

OPTIONS=<none>

Es ist wichtig, dass das klappt, das erleicht die spätere Fehlersuche.

Die Datei

/etc/courier/maildroprc
sollte so angelegt sein, dass sie die entsprechenden Maildirs automatisch anlegt.

3. Datenmigration

Folgende Befehle ausführen:

-- pop3 (bitte eigenes Maildir-Base verwenden):

insert into mail_users select NULL id, concat(op.account,'@account')

email, concat(op.account,'@account') username, '' password,

op.longpw password_enc, 2000,2000, '/var/spool/kunden/mail/'homedir, concat(op.kunde,'/',op.account,'/') maildir,'Y'postfix,0 domainid,c.customerid from confixx.pop3 op

INNER JOIN panel_customers c ON c.loginname = op.kunde;

-- virtual-mailboxes:

insert into mail_virtual select NULL id, u.email,

u.email emailfull, concat(u.email,'') destination,

u.domainid, u.customerid, u.id as popaccountid,

0 iscatchall from mail_users u

where u.email like '%@account';

-- domain fuer migration anlegen:

INSERT INTO `panel_domains` (`id`, `domain`, `adminid`,

`customerid`, `aliasdomain`, `documentroot`, `ipandport`,

`isbinddomain`, `isemaildomain`, `iswildcarddomain`,

`subcanemaildomain`, `caneditdomain`, `zonefile`,

`parentdomainid`, `openbasedir`, `openbasedir_path`,

`safemode`, `speciallogfile`, `specialsettings`,

`deactivated`) VALUES (NULL, 'account', 1, 0, NULL,

'/dev/null', 1, 0, 1, 0, 0, 0, '', 0, 1, 0, 1, 0, '', 1);

-- uebernahme destinations - funktioniert bei bis zu fuenf

-- zus. Weiterleitungen u. Postfaechern

-- ansonsten muessen weitere Konstrukte drangehaengt wrden

insert into mail_virtual select NULL id, concat(

IF(oe.prefix='*','',oe.prefix),'@',oe.domain) email,

concat(IF(oe.prefix='*','catchall',oe.prefix),'@',oe.domain)

email_full,TRIM(CONCAT(oe.pop3,IF(oe.pop3 like '%@%','','@account'),

' ' ,IF(oe.pop3x='','',CONCAT(SUBSTRING_INDEX(oe.pop3x,':',1),

IF(SUBSTRING_INDEX(oe.pop3x,':',1) like '%@%','','@account')))

,' ',IF(pop3x REGEXP '.*:', CONCAT(SUBSTRING_INDEX(

SUBSTRING_INDEX(oe.pop3x,':',2),':',-1),

IF(SUBSTRING_INDEX(SUBSTRING_INDEX(oe.pop3x,':',2),':',-1)

like '%@%','','@account') ),''),' ',IF(pop3x REGEXP '.*:.*',

CONCAT(SUBSTRING_INDEX(SUBSTRING_INDEX(oe.pop3x,':',3),':',-1),

IF(SUBSTRING_INDEX(SUBSTRING_INDEX(oe.pop3x,':',3),':',-1)

like '%@%','','@account') ),''),' ',IF(pop3x REGEXP '.*:.*:.*',

CONCAT(SUBSTRING_INDEX(SUBSTRING_INDEX(oe.pop3x,':',4),':',-1),

IF(SUBSTRING_INDEX(SUBSTRING_INDEX(oe.pop3x,':',4),':',-1)

like '%@%','','@account') ),''),' ',IF(pop3x REGEXP '.*:.*:.*:.*',

CONCAT(SUBSTRING_INDEX(SUBSTRING_INDEX(oe.pop3x,':',5),':',-1),

IF(SUBSTRING_INDEX(SUBSTRING_INDEX(oe.pop3x,':',5),':',-1)

like '%@%','','@account') ),''),' ',IF(pop3x REGEXP '.*:.*:.*:.*:.*',

CONCAT(SUBSTRING_INDEX(SUBSTRING_INDEX(oe.pop3x,':',6),':',-1),

IF(SUBSTRING_INDEX(SUBSTRING_INDEX(oe.pop3x,':',6),':',-1)

like '%@%','','@account') ),'') )) destination, d.id domainid,

d.customerid, 0 popaccountid, IF(oe.prefix='*',1,0) iscatchall

FROM confixx.email oe INNER JOIN panel_domains d

ON d.domain = oe.domain LEFT OUTER JOIN mail_users u

ON u.username = concat(oe.pop3,'@account');

-- zaehlen -- hier bin ich mir nicht ganz sicher, ob es korrekt so ist

-- accounts

create or replace view vtemp as select customerid,count(*) c

from mail_users group by customerid;

update panel_customers, vtemp

set panel_customers.email_accounts_used = vtemp.c

where vtemp.customerid = panel_customers.customerid;

-- emailaddresses

create or replace view vtemp as select customerid,count(*) c

from mail_virtual where popaccountid = 0 group by customerid;

update panel_customers, vtemp set panel_customers.emails_used = vtemp.c

where vtemp.customerid = panel_customers.customerid;

-- forwarders

create or replace view vitemp as

(select v.customerid, 1 c from mail_virtual v

where destination != '' and popaccountid = 0)

union all

(select v.customerid,1 c from mail_virtual v

where destination REGEXP '.*\ ' and popaccountid = 0)

union all

(select v.customerid,1 c from mail_virtual v

where destination REGEXP '.*\ .*\ ' and popaccountid = 0)

union all

(select v.customerid,1 c from mail_virtual v

where destination REGEXP '.*\ .*\ .*\ ' and popaccountid = 0)

union all

(select v.customerid,1 c from mail_virtual v

where destination REGEXP '.*\ .*\ .*\ .*\ ' and popaccountid = 0)

union all

(select v.customerid,1 c from mail_virtual v

where destination REGEXP '.*\ .*\ .*\ .*\ .*\ ' and popaccountid = 0)

union all

(select v.customerid,1 c from mail_virtual v

where destination REGEXP '.*\ .*\ .*\ .*\ .*\ .*\ ' and popaccountid = 0);

create or replace view vtemp as select customerid,count(*) c

from vitemp group by customerid;

update panel_customers, vtemp

set panel_customers.email_forwarders_used = vtemp.c

where vtemp.customerid = panel_customers.customerid;

drop view vitemp;

drop view vtemp;

-- View fuer Passwortabfrage anlegen:

create view vmig_mail_users as select

IF(username like '%@account', REPLACE(username,'@account',''), username)

username, password_enc, uid, gid, homedir, maildir from mail_users;

Dateien

/etc/pam.d/smtp + /etc/courier/authmysqlrc
anpassen: Ersetzen von Tabelle
mail_users
durch vmig_mail_users.

/etc/init.d/courier-authdaemon restart

/etc/init.d/postfix restart

Mit

testsaslauthd
und
courierauthtest
erneut die Funktionstüchtigkeit der Authentifizierung prüfen.

4. Anlegen der Emailkonten

Ausgangsbasis ist wie gesagt, die Zustellung per Maildrop. Meine Konfiguration sieht in etwa wie folgt aus (rot sind die Anpassungen für die Confixx-Migration):

/etc/postfix/master.cf:

...

maildrop unix - n n - 2 pipe

flags=ODRhu user=vmail argv=/usr/bin/maildrop -w 80 \

-d ${recipient} ${extension} ${recipient} \

${user} ${nexthop} ${sender} ${mailbox}

...

/etc/courier/maildropmysql.conf:

hostname localhost

database syscp

dbuser [syscpuser]

dbpw [password]

dbtable mail_users

default_uidnumber 2000

default_gidnumber 2000

uid_field username

uidnumber_field uid

gidnumber_field gid

maildir_field TRIM(maildir)

homedirectory_field concat(homedir,left(maildir, position('\/' in maildir)-1))

# 100 MB Quota

quota_field '104857600S'mailstatus_field postfix

/etc/courier/maildroprc.createsub
(Ein Ersatz für eine Subroutine zum anlegen von Maildirs):

`test -d $_parent/.$_subfolder`

if ( $RETURNCODE == 1 )

{

`maildirmake -f $_subfolder $_parent`

`echo INBOX.$_subfolder >> $DEFAULT/courierimapsubscribed`

}

/etc/courier/maildrop:

SHELL="/bin/bash"

_domain="$4"

_user="$6"

# Korrektur

#if ( $DOMAIN == "account" )

if ( "$_domain" eq "account" )

{

DEFAULT="$HOME/${_user}"

}

else

{

DEFAULT="$HOME/$LOGNAME"

}

SPAM="Spam"

SENT="Sent"

DRAFTS="Drafts"

TRASH="Trash"

#include file um subfolder anzulegen

_include_create_sub="/etc/courier/maildroprc.createsub"

# create maildir if not exists

`test -d $DEFAULT`

if ( $RETURNCODE == 1 )

{

`maildirmake "${DEFAULT}"`

`touch $DEFAULT/courierimapsubscribed`

`chmod 600 $DEFAULT/courierimapsubscribed`

}

# check default subfolders

_parent=$DEFAULT

_subfolder=$SENT

include $_include_create_sub

_subfolder=$DRAFTS

include $_include_create_sub

_subfolder=$TRASH

include $_include_create_sub

# Das Folgende NUR dann einfügen,

# wenn Sie GANZ GANZ sicher sind,

# dass der Mailserver keine Emails empfängt,

# also keinesfalls im Life-Betrieb!!!

# Bitte unbedingt im Anschluss entfernen, da sonst

# ALLE Emails unwiderruflich im Nirwana landen

to "/dev/null"

# evtuell ein ein wenig spamfiltern

if ( $SIZE < 126144 )

{

exception {

xfilter "/usr/bin/spamc -u $LOGNAME"

}

}

...

to "${DEFAULT}"

Evtuell in Postfix Content-Filter temporär ausschalten.

/etc/postfix/main.cf:

#content_filter = amavis:[127.0.0.1]:10024

content_filter =

# /etc/init.d/postfix restart

Mailkonten anlegen (Eine leere Email an alle Mailkonten schicken):

# echo "select concat('echo \"\" | mail -s \"\" ',email) \

from mail_users where email like '%@account';" \

| mysql syscp > /tmp/createmaildirs.sh

# EDIT /tmp/createmaildirs.sh

Erste Zeile ersetzen durch #!/bin/bash

sh /tmp/createmaildirs.sh

rm /tmp/createmaildirs.sh

Nun sollten die für alle @account-Konten leere Maildirs vorhanden sein

WICHIG:

Den Eintrag

to "/dev/null"
aus
/etc/courier/maildroprc
wieder entfernen und ggf. den Mailfilter in
/etc/postfix/main.cf
erneut aktivieren (content-filter).

5. Schlussüberlegungen

Natürlich sollte das Ganze noch ausführlich getestet werden. Das kann man zum Beispiel so machen, dass man eine Subdomain/ Domain, die per Nameserver auf den neuen Server zeigt, einem Test-Migrationskunden zuweist. Bei diesem legt man dann eine Emailadresse unter der Domain an und Weiterleitungen für migrierte Email-Adressen hinzu. Dann ein paar Mails dorthin schicken und sehen, ob sie im richtigen Postfach landen. Die

/var/log/mail.log
sollte man dabei immer im Blick haben.

Nun muss man sich noch ein paar Gedanken machen, wie man die Mails selbst migriert. Wie gesagt, hängt dies stark vom bestehenden Ausgangsystem ab. Bei mir ist das Cyrus und ich werde mich deshalb mal mit

cyrus2courier
beschäftigen müssen.
fetchmail
und
imapsync
enfallen, wenn man davon ausgeht, dass die Kunden-Email-Passworte nicht bekannt sind.

Ich hoffe, dass diese Anleitung nützlich ist.

Für Hinweise auf Fehler oder Verbesserungsvorschläge wäre ich dankbar.

Petra Arentzen

5 Kommentare

Philipp
Kommentar 1
04.10.08 / 11:38 Uhr
Hallo Petra,

die Migration hat bei mir soweit super geklappt.
Leider kommt mein Postfix nicht mit den verschlüsselten Kennwörtern zurecht, mit Klartext hat er keine Probleme.

Hättest du hier noch einen Tipp für mich?

Danke, Gruß
Philipp
Kommentar:

Hallo Philipp,

beim Verschlüsseln von Kennwörtern habe ich vor allem nach der Anleitung auf www.syscp.de gearbeitet. Allerdings haben die ihre Seite relauncht, so dass meine Links hierzu nicht mehr stimmen, daher such einfach mal auf der Seite.

Viele Grüße

Petra

Philipp
Kommentar 2
22.09.08 / 14:07 Uhr
Hallo Petra,

danke für die Informationen, ich habe nun die Postfächer erfolgreich migriert.

Nun bleibt mir nur noch die Mailübernahme, hier hätte ich noch eine Frage zu fetchmail:
Ich habe einige Postfächer die als Imap genutzt werden auf meinem Server, die Verzeichnisstrukturen gehen beim abruf mit fetchmail verloren oder?

Gruß
Philipp
Kommentar:

Hallo Philipp,
stimmt, du hast recht. War bei mir kein Problem, weil nur POP3 genutzt wurde.
Wenn du von courier zu courier umziehst, kannst du die Mailverzeichnisse einfach rumkopieren.

Vielleicht noch ein Tipp: Wenn du Mailkonten kopierst, sollten in der Zeit keine neuen Mails zugestellt werden. Ich habe hierfür die Datei /etc/postfix/header_checks_hold mit folgendem Inhalt angelegt:
/^Received:/ HOLD

und in der /etc/postfix/main.cf darauf verwiesen:
header_checks = regexp:/etc/postfix/header_checks_hold

Nach "postfix reload" werden alle eingehenen Nachrichten in die Warteschlange einsortiert aber nicht zugestellt.

Wenn du fertig mit den Wartungsarbeiten bist, kannst du mit postsuper -H ALL die Mails wieder zur Zustellung freigeben.

Viel Erfolg

Petra

Philipp
Kommentar 3
13.09.08 / 10:33 Uhr
Hallo,

ich habe die Migration noch vor mir, aber deine Anleitung macht mir schonmal mut, dass alles irgendwie klappt.

Wie hast du die Postfächer ansich umgezogen? Ich hätte halt einige IMAP Postfächer die ich gerne übersiedeln würde.


Gruß
Philipp
Kommentar:

Hallo Philipp,

ich hatte fetchmail benutzt. Das hat den Vorteil, dass Mails während der DNS-Umstellung, in der manche DNS-Server noch auf den alten Mailserver und manche auf den neuen zeigen, immer angenommen und zugestellt werden.
Bei uns war diese Zeit relativ kurz, da wir mehrere Wochen im Voraus bereits die Gültigkeitsdauer im DNS auf sehr kurz eingestellt hatten.

Viele Grüße
Petra

Petra Arentzen
Kommentar 4
19.04.07 / 06:06 Uhr
Hallo Frank,

wir haben uns für Syscp entschieden, weil es einfach und schnell ist. Mein neuer Provider hat außerdem Confixx nicht im Paket, von daher fiel das weg. Wobei ich allerdings sagen muss, dass ich schon lange mit Confixx nicht so ganz zufrieden bin, vor allem weil es nicht so leicht erweiterbar ist wie Open Source Software. Warum nun Syscp und nicht VHCS kann ich dir gar nicht so genau sagen, das war mehr eine Bauchentscheidung.
Das größte Problem bei dieser Migration war, dass Confixx Funktionen anbietet, die Syscp nicht enthält - z.B. einen Autoresponder, diese Leistungen aber durch Kunden gebucht waren. Außerdem stellt Syscp allen Kunden PHP zur Verfügung, auch das wollte ich nicht.
Solche Dinge mussten von mir geändert werden, was aber auch nicht sehr schwer war, da Syscp eine klare Code- und Templatestruktur hat. Außerdem habe ich Syscp so umgestrickt, dass nun php-cgi mit einer eigenen PHP-Ini je Host verwendet wird. Wenn ich ein bisschen mehr Zeit habe, werde die Änderungen veröffentlichen.
Bereut habe ich die Entscheidung bis jetzt noch nicht, muss das aber einschränken, da wir bis jetzt noch nicht im Echtbetrieb sind.
Du kannst jedoch in ein paar Wochen gerne nochmal nachfragen, die Kundendomains ziehen sehr bald um, da jetzt alles so weit fertig ist, inklusive Migrationskripte.
Ich bin jetzt jedoch sehr froh, dass ich mit dem abgeänderten und erweiterten Syscp nun unabhängig davon bin, ob mein Hoster die Admin-Software X oder Y anbietet. Ich kann jederzeit den Hoster wechseln und muss mich nicht mehr über diese blödsinnigen "Ihr Lizenzkey ist abgelaufen"-Mails ärgern.
Frank Luft
Kommentar 5
18.04.07 / 18:06 Uhr
Was mich, leicht off-topic, interessieren würde: Was treibt Euch dazu, von Confixx auf syscp zu wechseln? Warum gerade syscp und nicht ein anderes Panel (VHCS, Ispconfig, Plesk). Ich muss mich gerade für eine Adminsoft entscheiden. Natürlich habe ich gegoogelt und Foren gelesen, was das Zeug hält, aber die Entscheidung fällt schwer. Ist syscp besser oder nur billiger (weil kostenlos) also Confixx oder Plesk?
Und: Habt Ihr jetzt, nach 3 Wochen, Eure Entscheidung bereut oder weiterhin bejubelt?
Einen Kommentar hinterlassen
Bitte beachten:
Aus rechtlichen Gründen werden Kommentare erst nach Prüfung freigeschaltet.
CAPTCHA-Bild zum Spam-Schutz
Wenn Sie das Wort nicht lesen können, bitte hier klicken.