1. Диагноз
Поднял Exchange пятнадцать лет назад. Сейчас выключаю последний сервер и понимаю: сама миграция с exchange на linux — не праздник инноваций, а трезвый расчёт. Лицензии растут, обновления безопасности всё жёстче завязаны на облако Microsoft, а найти админа, который готов разбираться в EDB-базах и AD-схеме под Exchange, с каждым годом сложнее.
Знакомая картина: 300-700 ящиков на организацию, руководство не хочет 365 из-за подписки и требований к локальному хранению данных, а Exchange уже держится на честном слове и на тебе одном. Если это про твою инфраструктуру — статья закрывает вопрос целиком.
Что получишь на выходе:
- рабочий почтовый стек Postfix + Dovecot + Rspamd с антиспамом и DKIM из коробки
- SOGo как замену Exchange-груповерк: календари, контакты, ActiveSync-подобная синхронизация с Outlook и телефонами без плагинов
- Nextcloud под файлы и совместную работу над документами
- перенесённые ящики через imapsync, проверенные бэкапы и мониторинг
Времени на весь цикл — от 4 до 6 месяцев на 500 ящиков, если считать не только настройку серверов, но и передавливание пользователей, которые «всегда жили в Outlook вот так». Личный опыт: 70% времени уходит не на конфиги, а на людей.
2. Причины
Семь причин, почему компании уходят с Exchange именно сейчас, и почему каждая из них ломает терпение раньше, чем бюджет.
| Причина | Почему ломает |
|---|---|
| Рост стоимости лицензий CAL и Windows Server | Каждый год дороже, а альтернативы бесплатны |
| Обновления безопасности всё чаще требуют облачную привязку | Локальный Exchange превращается во второсортный продукт |
| Требования к хранению данных внутри страны | 365 для части организаций юридически не вариант |
| Уход единственного специалиста, который понимал Exchange | Инфраструктура становится чёрным ящиком |
| Проблемы с сертификатами и современными клиентами | Старый EWS плохо дружит с новыми версиями Outlook и мобильными |
| Санкционные риски и непредсказуемость лицензирования | Руководство хочет данные под своим контролем |
| Рост требований к резервному копированию EDB-баз | Восстановление становится долгим и хрупким |
Ни одна из причин по отдельности не критична. Все семь вместе — уже повод сесть и посчитать.
3. Рецепт
Архитектура
Логика простая. Почта идёт через Postfix, там же Rspamd отсекает спам и подписывает DKIM. Dovecot хранит письма в Maildir. SOGo даёт пользователю единый интерфейс: веб-почту, календарь, контакты, и главное — синхронизацию с Outlook и телефонами через открытые протоколы, без установки коннекторов на каждую машину. Nextcloud живёт отдельно и закрывает файлы.
Системные требования
| Компонент | Версия на момент публикации |
|---|---|
| ОС | Debian 13 (Trixie) |
| Postfix | 3.10.x |
| Dovecot | 2.4.x |
| Rspamd | 4.1.x |
| SOGo | 5.12.10 |
| Nextcloud | 34.0.4 |
| PostgreSQL | 16 или новее |
| Redis | 7.4.x (для Rspamd) |
На момент публикации актуальна версия X у каждого из перечисленных пакетов. Перед установкой проверь свежие релизы — стек развивается быстро, особенно Rspamd после мажорного скачка на ветку 4.x.
Таблица портов
| Порт | Протокол | Назначение | Доступен снаружи? |
|---|---|---|---|
| 25 | SMTP | Приём почты от внешних серверов | Да |
| 587 | SMTP Submission | Отправка от клиентов с аутентификацией | Да |
| 993 | IMAPS | Доступ к ящикам по TLS | Да |
| 443 | HTTPS | SOGo и Nextcloud веб-интерфейс | Да |
| 5432 | PostgreSQL | База SOGo | Нет, только localhost или VPN |
| 6379 | Redis | Кэш и статистика Rspamd | Нет |
| 11334 | HTTP | Веб-интерфейс Rspamd | Нет, только через SSH-туннель или VPN |
Подготовка
Зависимости: PostgreSQL для SOGo, Redis для Rspamd, действующий домен с доступом к DNS-записям, сертификат Let’s Encrypt или корпоративный TLS. Проверь среду перед стартом.
apt update && apt install -y postfix dovecot-core dovecot-imapd \
rspamd redis-server postgresql sogo sogo-activesync
Результат: пакеты установлены, службы ещё не связаны между собой. Дальше настраиваем каждую последовательно.
Шаг 1. Postfix как транспорт
Правим main.cf так, чтобы Postfix принимал почту на домен и отдавал её в Rspamd на проверку.
myhostname = mail.example.ru
mydomain = example.ru
myorigin = $mydomain
inet_interfaces = all
mydestination = localhost
virtual_mailbox_domains = example.ru
smtpd_milters = inet:127.0.0.1:11332
non_smtpd_milters = $smtpd_milters
milter_default_action = accept
Результат: Postfix слушает 25 и 587 порты, каждое письмо проходит через milter Rspamd на 11332 порту.
Шаг 2. Rspamd — антиспам и DKIM
rspamadm dkim_keygen -s mail -d example.ru -k /etc/rspamd/dkim/example.ru.key
Команда создаёт приватный ключ и выводит публичную часть — её нужно вставить в DNS TXT-запись селектора. Без этого шага письма будут доставляться, но без подписи, и часть почтовых систем начнёт их подозревать.
mail._domainkey.example.ru TXT "v=DKIM1; k=rsa; p=<публичный ключ>"
Шаг 3. Dovecot — хранение
mail_location = maildir:/var/mail/vhosts/%d/%n
passdb {
driver = ldap
args = /etc/dovecot/dovecot-ldap.conf.ext
}
Если у тебя уже есть Active Directory (а у большинства мигрирующих с Exchange он есть), подключай аутентификацию через LDAP-бинд. Пользователям не придётся заводить новые пароли — это снижает сопротивление миграции сильнее, чем любые уговоры.
Шаг 4. SOGo — веб-почта, календари, контакты
SOGoMailDomain = example.ru
SOGoIMAPServer = imap://127.0.0.1:143/?TLS
SOGoSMTPServer = smtp://127.0.0.1:587
OCSFolderInfoURL = "postgresql://sogo:pass@127.0.0.1:5432/sogo/sogo_folder_info"
Дальше подключаешь модуль ActiveSync — именно он даёт нативную синхронизацию с Outlook, iOS и Android без плагинов. Пользователь заходит по тем же данным, что и в почту, и получает календарь с контактами сразу.
Шаг 5. Nextcloud — файлы
sudo -u www-data php occ maintenance:install \
--database "pgsql" --database-name nextcloud \
--admin-user admin --admin-pass "смени_меня"
Результат: рабочий инстанс на 443 порту. Подключи LDAP-бэкенд для той же учётки Active Directory — двух паролей пользователю не нужно.
Шаг 6. Перенос ящиков с Exchange
Самый нервный этап. Используй imapsync — он умеет тянуть письма из Exchange по IMAP и класть их в Dovecot с сохранением дат и папок.
imapsync --host1 exchange.example.ru --user1 ivanov --password1 'старый_пароль' \
--host2 mail.example.ru --user2 ivanov --password2 'новый_пароль' \
--ssl1 --ssl2 --automap
Прогони скрипт по всем ящикам в цикле, с логированием в отдельный файл на каждого пользователя. Первый прогон делай в тестовом окне без удаления писем на источнике — на случай если что-то пойдёт не так.
4. Проверка
systemctl status postfix dovecot rspamd sogo
tail -f /var/log/mail.log
rspamc stat
Отдельно проверь доставку через внешние сервисы проверки SPF/DKIM/DMARC — отправь тестовое письмо и посмотри заголовки Authentication-Results на принимающей стороне. Если там pass по всем трём — доставка не будет проваливаться в спам у крупных провайдеров.
5. Осложнения
| Ошибка | Причина | Решение |
|---|---|---|
| Письма попадают в спам у Gmail и Mail.ru | Неполная связка SPF, DKIM, DMARC | Проверить все три записи через внешний чекер, поправить DMARC-политику |
| imapsync падает на больших ящиках | Таймаут по умолчанию слишком мал | Добавить флаг с увеличенным таймаутом |
| SOGo не видит календарь после переноса | Не пересоздан индекс OCSFolderInfo | Пересобрать индексы через sogo-tool |
| Outlook не подключается по ActiveSync | Модуль sogo-activesync не установлен или не включён | Установить пакет, перезапустить sogod |
imapsync --timeout1 600 --timeout2 600 --host1 exchange.example.ru ...
sogo-tool update-autoreply -a -F
sogo-tool reindex sogo
6. Альтернативы
| Вариант | Когда выбрать вместо основного |
|---|---|
| Mailcow | Небольшая инфраструктура до 100-150 ящиков, где важнее скорость развёртывания, чем гибкость под нагрузку |
| Zimbra Open Source | Если нужна единая панель без разделения на отдельные компоненты, но с меньшей активностью community-версии |
| Kopano | Если критична совместимость именно с MAPI-протоколом Outlook |
| Гибрид с Microsoft 365 | Часть ящиков остаётся в облаке, часть на своей инфраструктуре — компромисс на переходный период |
Mailcow удобнее для старта, но на 500 ящиках и требованиях к отказоустойчивости мы от него отказались после месяца тестов — слишком много магии под капотом там, где нужна прозрачность. Разложенный по компонентам стек даёт контроль над каждым звеном.
7. Профилактика
- Мониторинг очередей Postfix и статистики Rspamd через Zabbix-агент
- Резервное копирование Maildir и баз PostgreSQL раздельно
- Автозапуск и systemd-таймеры для регулярной проверки очереди почты
- Регулярная проверка репутации IP-адреса на blacklist-агрегаторах
- Тестовое восстановление из бэкапа не реже раза в квартал
- Обновление DKIM-ключей раз в год
- Проверка сертификатов TLS на истечение через мониторинг, а не вручную
Резервное копирование
| Что бэкапим | Как часто | Где хранить | Как восстанавливаем |
|---|---|---|---|
| Maildir всех ящиков | Ежедневно | Отдельный сервер + офсайт | rsync обратно + перезапуск Dovecot |
| База PostgreSQL SOGo | Ежедневно | Отдельный сервер | pg_restore из дампа |
| Конфигурация Postfix/Dovecot/Rspamd | При каждом изменении | Git-репозиторий | git checkout + перезапуск служб |
| Данные Nextcloud | Ежедневно | Отдельный сервер + офсайт | occ files:scan после восстановления файлов |
Безопасность
- UFW с явным разрешением только нужных портов из таблицы выше
- fail2ban на SSH и на попытки перебора паролей SMTP-аутентификации
- Отдельный системный пользователь для PostgreSQL без прав на shell
- SSH только по ключу, без пароля
- Ограничение доступа к веб-интерфейсу Rspamd по IP или через VPN
Обновление
Перед обновлением любого компонента — снимок диска или дамп базы. Обновляй по одному сервису за раз, не пакетом сразу. После обновления Rspamd проверь, что DKIM-подпись всё ещё формируется корректно — при мажорных скачках версии (как переход с 3.x на 4.x) меняется формат части конфигов. Откат — из снимка или из git-репозитория с конфигами.
8. FAQ
Почему почта не работает после настройки?
В девяти случаях из десяти дело в неполной цепочке SPF, DKIM, DMARC или в неправильном milter-подключении Rspamd к Postfix. Проверь заголовки Authentication-Results на тестовом письме и логи mail.log — там сразу видно, на каком этапе письмо отвалилось.
Как проверить что перенос почты с Exchange работает правильно?
Сравни количество писем и папок в старом и новом ящике через imapsync с флагом dry-run перед реальным переносом. После переноса попроси нескольких пользователей проверить последние письма и календарь на телефоне — это быстрее, чем сверять логи вручную.
Что делать если Outlook не видит новый календарь?
Проверь, что модуль sogo-activesync установлен и служба перезапущена. Дальше — пересоздай профиль Outlook с нуля, не пытайся донастроить старый профиль поверх Exchange-подключения.
Чем SOGo отличается от Mailcow?
SOGo — это только groupware-слой поверх твоего собственного Postfix и Dovecot, ты полностью контролируешь конфигурацию. Mailcow — готовый Docker-стек с той же ролью, но с меньшей гибкостью под нестандартные требования вроде специфичной схемы бэкапов или интеграции с существующим Active Directory.
9. Прогноз
После переноса почта работает предсказуемее, чем Exchange в последние годы жизни. Меньше магии, больше понятных логов: когда что-то падает, ты знаешь, куда смотреть, а не гадаешь между EDB-базой и сервисом транспорта.
Новый стек тоже будет ломаться. Будут свои грабли, свои ночные разборы. Но теперь это твои грабли, не чужие. Если после этой инструкции что-то не завелось — пиши в комментарии, разберёмся.
Оставайтесь на связи
Рецепты от IT-боли. Без воды, без рекламы, без маркетинговой шелухи.
Подписаться на IT-Аптеку →



