Перенос почтового сервера Postfix на новый сервер: пошаговая инструкция без потери писем
Перенос почтового сервера Postfix должен заканчиваться не красивым чек-листом, а работающей почтой. Ниже — практический сценарий для типовой связки Postfix + Dovecot на Linux: что проверить на старом сервере, что установить на новом, какие конфиги и данные переносить, как проверить SMTP/IMAP до смены MX и как откатиться.
Важно: команды выполняйте от root или через sudo. Примеры предполагают, что вы переносите собственный сервер и имеете административный доступ к обеим машинам. Не копируйте конфигурацию вслепую между сильно отличающимися версиями Postfix/Dovecot.
1. Зафиксируйте текущее состояние старого сервера
Перед изменениями сохраните версии, активные параметры, порты и очередь. Это пригодится и при переносе, и при откате.
hostnamectl
postconf mail_version
postconf -n
postconf -M
postconf -m
postqueue -p
doveconf -n
systemctl status postfix dovecot --no-pager
ss -lntp | grep -E ':(25|465|587|110|143|993|995)\b'
df -h
df -ipostconf -n показывает параметры, отличающиеся от значений по умолчанию. postconf -M показывает активные сервисы из master.cf. Если используется Dovecot, doveconf -n даёт его фактическую конфигурацию.
2. Найдите всё, от чего зависит Postfix
Одних main.cf и master.cf обычно недостаточно. Проверьте lookup-таблицы, базы пользователей, DKIM, антиспам и сертификаты.
postconf | grep -E '(_maps|transport|relayhost|smtpd_milters|non_smtpd_milters|smtpd_sasl|virtual_|alias_)'
postconf -h myhostname mydomain myorigin mydestination relayhost
postconf -h smtpd_tls_cert_file smtpd_tls_key_file
postconf -mЕсли в конфигурации встречаются mysql:, pgsql:, ldap:, lmdb:, hash: или другие карты, их источники и нужные модули тоже должны переехать.
3. Сделайте резервную копию конфигурации
mkdir -p /root/mail-migration-backup
cp -a /etc/postfix /root/mail-migration-backup/
cp -a /etc/dovecot /root/mail-migration-backup/ 2>/dev/null || true
postconf -n > /root/mail-migration-backup/postconf-n.txt
postconf -M > /root/mail-migration-backup/postconf-M.txt
doveconf -n > /root/mail-migration-backup/doveconf-n.txt 2>/dev/null || true
tar -C /root -czf /root/mail-migration-backup-$(date +%F).tar.gz mail-migration-backupЕсли используются Rspamd, OpenDKIM, OpenDMARC, Amavis и другие сервисы, сохраните и их конфиги. Приватные ключи храните как секреты.
4. Определите, где лежат почтовые ящики
doveconf -n | grep -E 'mail_(location|driver|path|home)|mail_home'
doveadm user user@example.com
postconf home_mailbox mail_spool_directory virtual_mailbox_base virtual_mailbox_mapsНе подставляйте путь из примера, пока не проверили реальную схему хранения.
5. Подготовьте новый сервер
Debian/Ubuntu:
apt update
apt install postfix dovecot-core dovecot-imapd dovecot-lmtpd rsync
apt install swaksRHEL / AlmaLinux / Rocky Linux:
dnf install postfix dovecot rsync
systemctl enable postfix dovecotЕсли старая система использует SQL, LDAP, LMDB, PCRE, Rspamd и т. п., установите соответствующие пакеты до переноса конфигурации.
6. Переносите конфигурацию осмысленно
cp -a /etc/postfix /root/postfix.clean
cp -a /etc/dovecot /root/dovecot.clean
diff -u /root/postfix.clean/main.cf /path/to/old/etc/postfix/main.cf
diff -u /root/postfix.clean/master.cf /path/to/old/etc/postfix/master.cf
postfix check
postconf -n
postconf -M
doveconf -nЕсли проверки выдают ошибку, не продолжайте до её устранения.
7. Пересоздайте индексированные карты
# примеры — выполняйте только для реально используемых файлов
postmap /etc/postfix/virtual
postmap /etc/postfix/transport
postmap /etc/postfix/sasl_passwd
newaliasesСписок реально используемых карт берите из postconf -n. Поддерживаемые типы баз проверьте через postconf -m.
8. Перенесите SQL/LDAP и учётные данные
Если виртуальные пользователи и домены хранятся в MySQL/MariaDB, сделайте согласованный дамп.
mysqldump --single-transaction --routines --triggers maildb > maildb.sql
mysql maildb < maildb.sqlПосле восстановления проверьте lookup непосредственно через postmap -q для той карты, которая указана в конфигурации.
9. Maildir: предварительная синхронизация rsync
rsync -aHAX --numeric-ids --info=progress2 root@old-mail:/var/vmail/ /var/vmail//var/vmail/ — пример. Перед --numeric-ids убедитесь, что UID/GID должны совпадать. После копирования проверьте права:
find /var/vmail -maxdepth 2 -printf '%u:%g %p\n' | head
namei -l /var/vmail/example.com/user10. Dovecot-to-Dovecot: используйте doveadm/dsync
Для online-migration между Dovecot удобнее штатная синхронизация, потому что её можно повторять инкрементально.
# синтаксис backend зависит от вашей схемы
doveadm backup -u user@example.com remote:new-mail.example.com
# отладка
doveadm -D backup -u user@example.com remote:new-mail.example.comПеред массовым запуском протестируйте одного технического пользователя.
11. DKIM, TLS и DNS
dig +short MX example.com
dig +short A mail.example.com
dig +short TXT example.com
dig +short TXT selector._domainkey.example.com
dig +short TXT _dmarc.example.com
dig -x 203.0.113.10 +shortPTR меняется у владельца IP/провайдера. TLS-сертификат лучше получить на новом сервере штатным ACME-клиентом, а не просто копировать /etc/letsencrypt/live.
12. Запуск и локальная проверка нового сервера
postfix check
systemctl restart postfix dovecot
systemctl status postfix dovecot --no-pager
ss -lntp | grep -E ':(25|465|587|143|993)\b'
journalctl -u postfix -u dovecot -n 100 --no-pager
postqueue -p13. SMTP и TLS до смены MX
swaks --server 127.0.0.1 --from test@example.com --to user@example.com
openssl s_client -connect NEW_SERVER_IP:25 -starttls smtp -servername mail.example.comДля submission отдельно протестируйте 587/465 с тестовой учётной записью и смотрите журнал:
journalctl -u postfix -u dovecot -f14. Проверьте, что сервер не open relay
С внешней машины попробуйте без SMTP AUTH отправить письмо от чужого домена на другой чужой домен. На этапе RCPT TO должен быть отказ.
swaks --server NEW_SERVER_IP --from outsider@example.net --to another@example.org15. Что делать с очередью старого Postfix
postqueue -p
postqueue -j | head
# после устранения причины deferred
postqueue -fНе копируйте queue-файлы вручную как основной способ миграции: дайте старому серверу доставить остаток штатно.
16. Переключение MX
- заранее уменьшите TTL;
- сделайте предварительную синхронизацию ящиков;
- полностью протестируйте новый сервер по IP;
- смените MX/A;
- старый сервер пока не выключайте;
- наблюдайте, куда приходит новая почта;
- выполните финальную безопасную синхронизацию.
Не делайте rsync --delete со старого сервера после того, как пользователи начали получать новые письма на новом: можно удалить новую почту. Для online-migration используйте Dovecot sync либо согласованное короткое окно остановки записи.
17. Проверки после cutover
dig +short MX example.com
postqueue -p
journalctl -u postfix -u dovecot --since '30 min ago' --no-pager- входящее письмо с внешнего домена;
- исходящее письмо на внешний домен;
- SMTP AUTH;
- IMAP и синхронизация папок;
- SPF/DKIM/DMARC тестового письма;
- отсутствие растущей deferred-очереди;
- свободное место и корректные владельцы mailbox storage.
18. План отката
Сохраните старые MX/A и старый сервер неизменным. Если новый узел не проходит критические проверки, верните DNS, снова направьте клиентов на старый сервер и только после стабилизации разбирайте проблему.
Критерий успеха: новая почта приходит на новый сервер, исходящие доставляются, SMTP AUTH и IMAP работают, очередь не растёт, SPF/DKIM/DMARC проходят, а старый сервер несколько TTL не получает новых сообщений.