Миграция postfix, postfixadmin | Postfix
Есть старый почтовик на postfix 2.1.0 с управлением пользователями через postfixadmin. Соответсвенно база пользователей в mysql. Задача – прозрачно перейти на новый почтовик, с сохранением базы пользователей (пароли, алиасы и т.д.). Проблема только в том, что новый postfixadmin (2.3) имеет другую структуру таблиц базы и просто сделать дамп базы и залить на новой машине не получится.
Смотрим структуру таблиц:
Старый postfixadmin (2.1.0):
DROP TABLE IF EXISTS `mailbox`;
CREATE TABLE `mailbox` (
`username` varchar(255) NOT NULL default '',
`password` varchar(255) NOT NULL default '',
`name` varchar(255) NOT NULL default '',
`maildir` varchar(255) NOT NULL default '',
`quota` int(10) NOT NULL default '0',
`domain` varchar(255) NOT NULL default '',
`created` datetime NOT NULL default '0000-00-00 00:00:00',
`modified` datetime NOT NULL default '0000-00-00 00:00:00',
`active` tinyint(1) NOT NULL default '1',
`drweb` int(11) default '0',
PRIMARY KEY (`username`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='Postfix Admin - Virtual Mailboxes';
Новый postfixadmin(2.3.0):
DROP TABLE IF EXISTS `mailbox`;
CREATE TABLE `mailbox` (
`username` varchar(255) NOT NULL default '',
`password` varchar(255) NOT NULL default '',
`name` varchar(255) character set utf8 NOT NULL default '',
`maildir` varchar(255) NOT NULL default '',
`quota` bigint(20) NOT NULL default '0',
`local_part` varchar(255) NOT NULL default '',
`domain` varchar(255) NOT NULL default '',
`created` datetime NOT NULL default '0000-00-00 00:00:00',
`modified` datetime NOT NULL default '0000-00-00 00:00:00',
`active` tinyint(1) NOT NULL default '1',
PRIMARY KEY (`username`),
KEY `domain` (`domain`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='Postfix Admin - Virtual Mailboxes';
В таблице со старого сервера нет в таблице `local_part` (части почтового адреса без доменного имени), плюс таблица флага проверки drweb.
Выбираем данные. SUBSTRING_INDEX(username, ‘@’, 1) – выбирает все что справа от собаки (это нам нужно для заполнения поля local_part)
select username, password, name, maildir, quota, SUBSTRING_INDEX(username, '@', 1), domain, created, modified, active from mailbox where username LIKE '%mail.ru' into outfile '/tmp/mail.txt';
Открываем постфиксадмин на новом сервере. Создаем домен который переносим.
Создал файл с нужными данными (см. выше). Загружаем:
load data infile '/home/ungifted/users/mail.txt' into table mailbox;
И видим в постфиксадмине что количество алиасов в домене – величина отрицательная, постфиксадмин алиасы не отображает:
Как оказалось:
// Postfix Admin добавляет алиас в таблицу алиасов для каждого
// создаваемого ящика. Причина такого поведения это обеспечение
// возможности использования catch-all (перехват всей почты для домена)
// если вы хотите управлять этими алиасами, установите значение
// данного параметра в YES
$CONF['alias_control'] = 'YES';
Выход – заполнить таблицу алиасов.
Смотрим таблицу алисасов:
use postfix;
select * from aliase;
Видим алиасы типа -
<a href="mailto:ivan@mail.ru">ivan@mail.ru</a> <a href="mailto:ivan@mcnet.ru">ivan@mail.ru</a> mail.ru date date 1
Судя по всему те самые алиасы которые создает постфиксадмин.
Создать данные для заполнения алисаов можно легко из существующей таблицы юзеров:
select username, maildir, domain, created, modified, active from mailbox where username LIKE '%mail.ru';
Вывод этого запроса будет заполнен нужными нам данными для заполнения таблицы алиасов.
Собираем эти данные в файл:
select username, maildir, domain, created, modified, active from mailbox where username LIKE '%mail.ru' into outfile '/tmp/alias.txt';
Правим последнее поле если там ноль (ящик был неактивен) – ставим единицу.
И загружаем в таблицу alias:
load data infile '/tmp/alias.txt' into table alias;
Смотрим постфиксадмин – количество алиасов встало на свои места. :)
Осталось настроить днс записи. И проверить как все работает.