Разворачиваем Mailu за вечер: от пустого VPS до первого письма — пошаговый регламент ITfresh

Что готовим до установки: чек-лист из шести пунктов
Меня зовут Евгений Семёнов, я технический директор ITfresh. Это наш внутренний регламент, по которому инженеры компании ставят Mailu клиентам. Я специально написал его так, чтобы человек с базовыми навыками Linux повторил всё за вечер, а тот, кто возиться не хочет, — понял объём работ и что именно он заказывает у подрядчика.
Главная ошибка новичков — сразу кидаться устанавливать сервер, а потом неделю ловить проблемы с доставляемостью. Девяносто процентов боли снимается подготовкой. Наш чек-лист из шести пунктов, без которых мы вообще не начинаем:

- VPS нужного размера. Наш типовой тариф под Mailu — 2 vCPU, 2 ГБ RAM, 40 ГБ SSD. Для 10–30 ящиков этого достаточно, если не включать ClamAV (о нём ниже). Диск берём с запасом на рост почты.
- Чистый IP-адрес. Это критично. До покупки VPS проверяем адрес по чёрным спискам (DNSBL): если он уже засвечен предыдущим арендатором в спам-базах, почта будет улетать в спам с первого дня. Проверка занимает минуту, а спасает недели репутационных мучений. Не поленитесь запросить у хостера конкретный IP заранее.
- Открытый исходящий порт 25. Половина провайдеров закрывает 25-й порт по умолчанию — это анти-спам-мера. Без него сервер не сможет отправлять почту наружу. Порт открывается тикетом в поддержку хостера; иногда просят объяснить, зачем. Закладывайте на это день ожидания.
- Домен и доступ к DNS-зоне. Нужна возможность самостоятельно править записи MX, A, TXT у регистратора или DNS-провайдера домена.
- PTR-запись (обратная зона). Настраивается на стороне хостера: IP должен разрешаться в hostname вашего почтового сервера. Без корректного PTR крупные почтовики (Gmail, Яндекс) режут доставляемость.
- Docker и compose-плагин. На свежей Ubuntu 24.04 ставится официальным скриптом за пару минут.
Про порт 25 отдельно. Это пункт номер один по частоте «почему не отправляется почта» у тех, кто ставил сам. Сервер поднялся, webmail открывается, письма внутри ходят — а наружу не уходят. Причина почти всегда одна: закрытый исходящий 25-й у хостера. Проверьте это ещё до установки командой с сервера, а не после.
Генерируем конфигурацию на setup.mailu.io
Открываем в браузере официальный конфигуратор setup.mailu.io и отвечаем на вопросы мастера. Разберу ключевые развилки — именно на них новички ошибаются.
Ветка — 2024.06
Выбираем стабильную ветку 2024.06. Никакого master на боевом сервере клиента — это правило без исключений.
Домен и hostname
Главный почтовый домен — например company.ru. Hostname сервера — mail.company.ru. Это тот адрес, который будет фигурировать в MX, в PTR и в настройках почтовых клиентов; выбирайте его один раз и навсегда.
Webmail: Roundcube или Snappymail
Обоим клиентам мы доверяем, но по опыту раздаём по-разному. Бухгалтерии и возрастным сотрудникам ставим Roundcube — он максимально похож на привычную «толстую» почту, с адресной книгой и фильтрами. Молодой команде, которой важнее скорость и мобильный вид, — Snappymail: он легче и не тащит свою базу данных. Ошибиться тут нельзя, оба хороши.
Антивирус ClamAV — почему на 2 ГБ мы его НЕ включаем
А вот здесь принципиальное решение. ClamAV держит в памяти больше гигабайта сигнатур постоянно, вне зависимости от того, идёт почта или нет. На сервере с 2 ГБ RAM это означает, что система начнёт свопиться при первой же нагрузке. Поэтому на маленьких серверах мы ClamAV отключаем, а защиту от вредоносных вложений строим иначе: Rspamd режет типовой спам с малварью, а на уровне политики мы блокируем опасные типы вложений (исполняемые файлы, скрипты). Если клиенту принципиально нужен антивирус на почте — берём VPS от 4 ГБ и закладываем это в смету заранее.
Правим mailu.env руками: наши шесть обязательных правок
Конфигуратор отдаёт два файла: docker-compose.yml и mailu.env. Первый мы обычно не трогаем, а вот в mailu.env всегда вносим одни и те же правки. Разберу каждую с объяснением, что будет, если оставить дефолт.
| Параметр | Что ставим | Зачем |
|---|---|---|
TZ | Europe/Moscow | Иначе метки времени в логах и заголовках писем будут в UTC — путаница при разборе инцидентов |
SUBNET | своя подсеть | Дефолтная подсеть контейнеров может пересечься с локальной сетью клиента (VPN, офис) — тогда часть маршрутов ломается |
MESSAGE_SIZE_LIMIT | 50 МБ | Дефолт мал для бухгалтерии с тяжёлыми сканами и архивами документов |
AUTH_RATELIMIT | ужесточаем | Ограничение попыток входа — базовая защита от перебора паролей по IMAP/SMTP |
SECRET_KEY | случайные 16 символов | Ключ шифрования сессий; дефолтный или пустой — дыра в безопасности |
DEFAULT_QUOTA | под задачу | Квота ящика по умолчанию, чтобы один пользователь не забил весь диск |
Ещё раз про SECRET_KEY: это не формальность. Он подписывает пользовательские сессии, и оставлять его значением по умолчанию нельзя категорически. Генерируем случайную строку и вставляем один раз.
docker compose up -d и первый вход в админку
Заливаем оба файла в отдельный каталог на сервере (мы держим их в /mailu), переходим туда и запускаем стек:
cd /mailu
docker compose up -d
docker compose ps
Последняя команда покажет список контейнеров. Ждём, пока все перейдут в состояние healthy — это занимает минуту-две на первом запуске, пока скачиваются образы и инициализируются сервисы. Пока не все healthy — в админку не идём.
Теперь создаём первого администратора. Пароль задаём стойкий:
docker compose exec admin flask mailu admin admin company.ru 'СтойкийПарольСюда'
После этого админка доступна по адресу https://mail.company.ru/admin, а веб-почта — по https://mail.company.ru/webmail.
Типовая ошибка — права на каталог. Если контейнеры падают в рестарт-петлю сразу после запуска, первым делом смотрим права на каталог с данными /mailu. Docker должен иметь возможность писать в тома; при неверных правах Dovecot и Postfix не стартуют. Лечится корректной выдачей прав на подкаталоги данных.
DNS-записи: то, от чего зависит доставляемость
Сервер поднялся, но без правильных DNS-записей ваша почта будет улетать в спам или не доходить вовсе. Это самая ответственная часть. Разберу по записям.

A и MX
Запись A для mail.company.ru указывает на IP сервера. Запись MX для домена company.ru указывает на mail.company.ru с приоритетом 10 — этим вы говорите всему миру, куда доставлять почту вашего домена.
SPF
TXT-запись, разрешающая вашему серверу отправлять почту от имени домена. Типовое значение — разрешить IP сервера и запретить всё остальное жёстким -all. Без SPF письма помечаются как подозрительные.
DKIM — генерируется кнопкой в админке
Приятная особенность Mailu: ключ DKIM генерируется прямо в админ-панели одной кнопкой в настройках домена. Панель тут же показывает готовую TXT-запись, которую нужно скопировать в DNS. DKIM криптографически подписывает исходящие письма — это второй столп доставляемости после SPF.
DMARC
TXT-запись, которая говорит принимающим серверам, что делать с письмами, не прошедшими SPF и DKIM. Начинаем с политики p=quarantine (в спам) и почтового адреса для отчётов; на жёсткий p=reject переходим позже, убедившись, что легитимная почта проходит.
PTR у хостера
Обратная запись: IP должен разрешаться в mail.company.ru. Настраивается в панели хостера, а не в зоне домена. Крупные почтовики без корректного PTR почту либо режут, либо отклоняют.
Проверить каждую запись после настройки можно утилитой dig:
dig MX company.ru +short
dig TXT company.ru +short # SPF
dig TXT dkim._domainkey.company.ru +short
dig TXT _dmarc.company.ru +short
dig -x IP_СЕРВЕРА +short # PTR
Let's Encrypt из коробки
TLS-сертификат — ещё одно место, где Mailu приятно удивляет. В mailu.env достаточно указать режим TLS_FLAVOR=letsencrypt, и контейнер front сам получит сертификат и будет автоматически его продлевать. Ничего похожего на ручную возню с certbot, cron-задачами и перезапуском сервисов — всё делается внутри.
Единственные штатные грабли — конфликт по 80-му порту. Валидация Let's Encrypt требует, чтобы порт 80 был свободен и доступен снаружи. Если на том же сервере уже стоит какой-то reverse-proxy или веб-сервер, слушающий 80-й, — сертификат не получится. Решение: либо освободить 80-й порт под Mailu, либо развернуть Mailu за существующим прокси по документированной схеме. На выделенном под почту VPS этой проблемы обычно нет.
Совет: дайте DNS-записи A для mail.company.ru распространиться до запуска стека. Let's Encrypt проверяет домен через публичный DNS, и если запись ещё не разошлась, первая попытка получить сертификат провалится, а повторные будут ограничены лимитами. Мы просто заводим A-запись первой, ждём, и только потом поднимаем контейнеры.
Тестируем как параноики: наш приёмочный протокол
Сервер запущен, но сдавать клиенту его рано. У нас есть приёмочный протокол, который мы проходим целиком перед тем, как сказать «работает».
- mail-tester.com на 10/10. Отправляем письмо на сгенерированный адрес сервиса и проверяем оценку. Всё, что ниже 10/10, разбираем по пунктам отчёта: чаще всего это недокрученный SPF, DKIM или PTR.
- Письма на Gmail, Яндекс и Mail.ru. Отправляем на каждый из трёх и открываем исходный текст письма: в заголовках
Authentication-Resultsдолжно стоятьspf=pass,dkim=pass,dmarc=pass. Это объективная проверка, а не «вроде дошло». - Обратная доставка. Отвечаем с внешних адресов на наш сервер — письма должны приходить и попадать в нужный ящик.
- Проверка на open relay. Пробуем с постороннего хоста отправить через наш 25-й порт письмо чужому адресату. Сервер обязан отказать. Открытый релей — это репутационная катастрофа и почти гарантированное попадание в спам-базы.
- Скорость webmail. Просто заходим в Roundcube или Snappymail и убеждаемся, что интерфейс отзывчив — на 2 ГБ он должен летать.
Пункт про open relay пропускать нельзя. Сервер, который пересылает чужую почту, за сутки попадает во все чёрные списки, и вытащить IP оттуда потом сложно и долго. Проверка занимает минуту, а страхует от катастрофы.
Хронометраж и смета
Сколько это реально занимает и стоит. У нашего инженера чистое рабочее время на развёртывание Mailu — около 3,5 часов, и это с учётом ожидания распространения DNS и прохождения приёмочного протокола. Основные «паузы» — не работа, а ожидание: тикет на открытие 25-го порта у хостера, распространение DNS-записей, получение сертификата. Поэтому по календарю установка нередко растягивается на день-полтора, хотя рук в неё вложено немного.
Экономика хостинга. VPS уровня 2 vCPU / 2 ГБ / 40 ГБ SSD у российских провайдеров стоит ориентировочно 400–900 ₽ в месяц. К этому стоит заложить:
- рост диска на второй год — почта не удаляется, ящики распухают, место придётся докупать;
- резервное хранилище под бэкапы — держать бэкап на том же диске, что и данные, нельзя, это самообман;
- час-другой обслуживания в месяц: обновления ветки, контроль очереди, реакция на алерты.
Итого своя почта на Mailu обходится в разы дешевле подписки за каждого сотрудника — но при условии, что кто-то за ней присматривает. Если своего админа нет, эту роль берём мы: сервер остаётся у клиента, а эксплуатация — на нас.
Это вторая статья серии про Mailu. В следующей я подробно разберу миграцию: как мы перенесли 28 ящиков с Яндекс 360 на свой Mailu без потери писем и с параллельным периодом работы двух систем. А если вы хотите не разбираться самостоятельно, а получить готовую почту под ключ — напишите мне в Telegram @ITfresh_Boss или позвоните +7 903 729-62-41. Развернём, настроим, перенесём и возьмём на сопровождение.
Оставить комментарий