Ручная сборка почты из Postfix и Dovecot учит, но съедает вечер и оставляет десятки мелких решений на совести администратора. Mailcow идёт с другого конца: проект упаковывает проверенную связку в готовый набор контейнеров, где транспорт, раздача писем, антиспам, веб-интерфейс и календари уже настроены и согласованы между собой. Ставится всё это на чистый сервер за час, из которого на сам стек уходит минут двадцать, а остальное время занимает перенос DNS записей и ожидание, пока они разъедутся по миру. В статье полный путь: требования, установка, первый вход, домен с ящиками и правила жизни стека дальше.
Что входит в стек Mailcow и когда он лучше ручной сборки
Список компонентов читается как конструктор полной почтовой системы. Postfix принимает и отправляет письма. Dovecot раздаёт их клиентам по IMAP и POP3. Rspamd фильтрует спам, подписывает исходящую почту и держит карантин. SOGo даёт пользователям веб почту с календарями и контактами, причём не только в браузере: календари и адресные книги синхронизируются на телефоны стандартными протоколами. Nginx обслуживает все веб адреса. MariaDB хранит учётные записи и настройки, Redis кеширует и считает статистику, ClamAV проверяет вложения, а пара служебных контейнеров следит за брандмауэром и перезапускает застрявшие службы.
Сравнение с ручной сборкой честно в обе стороны. Ручной путь учит устройству почты и оставляет полный контроль над каждым файлом, но требует недели аккуратности и самостоятельной поддержки. Готовый стек освобождает время и обновляется одной командой, взамен забирая часть свободы: свои экзотические модули в него не вставить. Практика показывает, что организации до нескольких сотен ящиков этого набора хватает целиком, а потребность в тонкой кастомизации возникает чаще в голове инженера, чем в реальной жизни.
Проекту много лет, установки исчисляются тысячами, и почти любая встреченная проблема уже описана и решена. Для администратора одного сервера это спокойствие дороже любой гибкости: почта из тех систем, где сюрпризы особенно дороги.
При этом стек не закрывает дверь в механику: конфигурации Postfix и Dovecot лежат в обычных файлах и читаются, как любые почтовые конфиги. Администратору, которому однажды захочется понять устройство, достаётся готовая система для разбора в удобном темпе, а не сборка с нуля в темпе аварии. Философия тут простая, всё в контейнерах, содержимое отдельно от кода, обновление это подмена образов, а не хирургия на живой системе.
Требования к памяти сервера и свободным портам перед стартом
Проект просит не меньше шести гигабайт памяти на полный набор, и это не жадность, а честная цена всех служб сразу. На сервере с тремя гигабайтами стек тоже поднимется, но после отключения антивируса и полнотекстового поиска писем, для чего в конфигурации есть отдельные переключатели. Диск под систему и первые ящики закладывают от двадцати гигабайт: образы контейнеров занимают заметную долю сразу, письма растут тихо, но неумолимо. Выбирая VPS, смотрят на шаг вперёд: добавить памяти соседнему тарифу проще, чем переезжать на новый сервер через полгода.
Из софта нужны Docker и плагин compose, ставящиеся по официальной инструкции за пять минут. Вторая половина требований про порты, и здесь сюрпризы обходятся дороже всего. Стеку нужны двадцать пятый для приёма, восьмидесятый и четыреста сорок третий для веба, четыреста шестьдесят пятый, пятьсот восемьдесят седьмой, девяносто девяносто третий, девяносто девяносто пятый и ещё несколько для почтовых протоколов. Проверка перед стартом занимает одну строку:
ss -tlpn | grep -E ':(25|80|443|465|587|993|995) '
Пустой вывод означает, что путь свободен. Типичный конфликт первой установки это уже работающий веб сервер на восьмидесятом и четыреста сорок третьем порту: его останавливают или переносят в контейнер, потому что два процесса на одном порту не уживаются. Как и в любой почтовой установке, у хостера заранее уточняют судьбу исходящего двадцать пятого порта и заказывают обратную запись на адрес сервера, эти два пункта не лечатся конфигурацией.
Перед стартом сверяют и мелочи, которые потом кусаются. Время на сервере обязано идти верно, иначе сертификаты и подписи писем ведут себя странно, а системный резолвер обязан отвечать быстро, потому что на нём строятся проверки входящих. Обе проверки занимают по одной команде и пару минут.
Подготовка DNS и генерация конфигурации из репозитория проекта
Пока образы качаются, имеет смысл разложить DNS. Почтовому узлу нужны запись A на его имя, MX запись домена на это имя и обратная запись у хостера. Имя узла имеет значение: по нему стек выпускает сертификаты и принимает соединения, и вписывать надо полное имя узла, которое уже смотрит в DNS на адрес сервера. Проверка делается утилитой dig одной строкой, и до тех пор, пока имя не отвечает адресом, запускать генерацию конфигурации рано. Пара лишних минут на ожидание DNS экономит потом час разбора загадочных ошибок сертификатов.
Сама установка начинается с клонирования репозитория и запуска генератора:
git clone https://github.com/mailcow/mailcow-dockerized
cd mailcow-dockerized
./generate_config.sh
Генератор задаёт один вопрос про имя почтового узла и собирает файл mailcow.conf, который потом правят руками под себя. Выглядит он скромно:
MAILCOW_HOSTNAME=mx.example.com
HTTP_PORT=80
HTTPS_PORT=443
TZ=Europe/Moscow
SKIP_CLAMD=n
Именно в этот момент, до первого запуска, конфигурация правится легко и дёшево: часовой пояс, поведение обновлений и переключатели экономии памяти для слабых серверов меняются в одну строку. После запуска любые переделки обходятся дороже, поэтому файл проверяют глазами: имя узла без опечаток, порты свободны, часовой пояс свой.
Запуск стека через docker compose и первый вход в админку
Дальше сценарий короткий: образы скачиваются, контейнеры поднимаются, служебные сети настраиваются сами.
docker compose pull
docker compose up -d
docker compose ps
Команда ps в конце не ритуал: она показывает полтора десятка контейнеров со статусами, и все должны быть подняты. Образы весят несколько гигабайт, на среднем VPS загрузка и распаковка занимают минут десять. Содержимое стека живёт в каталоге data рядом с конфигурацией: там ящики, база и настройки, и именно этот каталог копируют при переезде на другой сервер. Честный расклад часа получается таким:
- Клонирование и генерация конфигурации занимают минут десять вместе с чтением;
- Загрузка образов и первый запуск укладываются в пятнадцать минут на среднем железе;
- Вход в панель, добавление домена и первого ящика занимают минут десять;
- Перенос DNS записей и ключа DKIM в панель регистратора занимает минут десять;
- Остаток часа уходит на проверки доставки и ожидание распространения записей.
Админка открывается в браузере по адресу узла и встречает стартовой парой администратора с немедленной сменой пароля. Внутри интерфейс спокоен и логичен: статус контейнеров, сводка по доменам и письмам, карточки настроек. Первое впечатление обманчиво редко: панель показывает здоровье стека целиком, и беглого взгляда достаточно, чтобы понять, всё ли в порядке.
Добавление домена, ящиков и DKIM ключа в панели управления
Домен добавляется в разделе почты одной формой: имя, квоты, лимиты на объём ящика и число адресов. После добавления панель сама показывает, какие DNS записи домен ждёт снаружи: A, MX, SPF, DKIM, DMARC и обратную запись. Ключ DKIM генерируется в настройках домена на лету, открытая часть копируется в DNS одной строкой, селектор подставляется автоматически. Никаких ручных генераций и пересылок файлов между серверами: весь цикл живёт в браузере.
Ящик заводится формой из трёх полей: адрес, квота, пароль. Пароль панель оценивает на сложность, слабый не примет, что экономит разговор с безопасностью заранее. Рядом с ящиками живут алиасы и правила переадресации: служебные адреса вроде postmaster и abuse заводятся за минуту, а для приёма писем на любые опечатки в адресе настраивается ловушка на все адреса домена. For команды это экономит десятки мелких тикетов в год.
Первое письмо на свежий адрес отправляется с любого внешнего сервиса, и его появление в веб почте закрывает вопрос приёма, а письмо из панели наружу закрывает вопрос отправки. Записи DNS после этого проверяются снаружи утилитой dig, а готовность домена панель показывает индикаторами прямо в его карточке. Полчаса терпения на распространение, и домен готов.
Финальный штрих настройки это проверка доставки через специализированный сервис оценки писем: он показывает картину глазами внешнего получателя, и по его замечаниям видно, всё ли из DNS увиделось миру. На свежем домене оценка редко идеальна с первой минуты, обычно остаётся дождаться распространения записей.
Почтовый интерфейс SOGo с календарями и контактами для пользователей
Веб почта живёт на адресе узла и открывается паролем ящика, без участия администратора. Интерфейс SOGo закрывает сразу три повседневные нужды: переписку, календари и контакты. Письма живут в папках с привычной логикой, поиск работает по содержимому, а подписи и правила обработки настраиваются самим пользователем без тикетов в поддержку.
Календари и контакты это то, за что SOGo любят в небольших командах. Календарь ведётся в вебе, приглашения на встречи уходят письмами и принимаются в один клик, а на телефонах всё синхронизируется стандартными протоколами CalDAV и CardDAV без сторонних приложений. Общий календарь отдела заводится в несколько касаний, и секретарь видит занятость руководителя без бумажных журналов. Для писем на телефоне хватает штатного клиента по IMAP, автонастройку современные операционки подтягивают сами по записям домена.
Для любителей толстых клиентов ничего не меняется: IMAP и SMTP работают как в классической связке, и один ящик спокойно живёт одновременно в браузере, на ноутбуке и на телефоне с общей папкой отправленных.
Веб почта на ходу работает как полноценное приложение: папка обновляется сразу после действия, поиск по ящику не заставляет ждать, а на медленном канале интерфейс остаётся живым. Для телефона хватает открыть адрес в браузере, отдельное приложение нужно только тем, кто хочет уведомления.
Антиспам Rspamd с карантином и обновление стека по расписанию
Фильтрация писем работает с первого дня без настройки: Rspamd оценивает входящие по десяткам признаков, сомнительные письма уходят в карантин. Карантин виден в панели: письмо можно просмотреть, пометить ошибкой фильтра или удалить, и каждое такое действие дообучает фильтр. Пользователям карантин доступен в отдельном разделе веб почты, что разгружает администратора от писем о пропавшей важной корреспонденции.
Наблюдение за стеком это одна команда логов и одна страница панели:
docker compose logs -f postfix dovecot rspamd
Обновляется стек штатным сценарием одной командой:
./update.sh
Сценарий тянет свежие образы, аккуратно пересобирает контейнеры и сохраняет содержимое на месте. Перед обновлением разумно снять копию: у проекта есть штатный сценарий резервного копирования, собирающий ящики, базу и настройки в один архив, и запуск его по расписанию это вторая привычка после самих обновлений.
Переезд на новый сервер при такой схеме скучен по-хорошему: снимается копия каталога хранилища и файла конфигурации, на новой машине разворачивается стек той же версии, копия возвращается на место и службы перезапускаются. Двадцать минут рутины вместо недели ручной пересборки.
./helper-scripts/backup_and_restore.sh backup all
Итого связка закрывает почту организации целиком: приём и отправка, веб-интерфейс, календари с контактами, антиспам и обновления без ритуалов. Час на установку это не рекламный слоган, а рабочая арифметика: двадцать минут техники, двадцать минут панели и DNS, остальное ожидание. Потраченный час дальше окупается годами спокойной работы, а знакомство с устройством почты можно отложить на потом, не теряя в качестве.