Не просто «Корова»: развертывание и боевая настройка MailCow в продакшене
В предыдущей публикации мы разобрали предпосылки перехода с облачного сервиса Mail.Ru на собственный почтовый стек. Тогда мы обошли стороной техническую часть, что вызвало закономерные вопросы в комментариях. Исправляем ситуацию: ниже представлен подробный пошаговый гайд по развертыванию Mailcow со всеми практическими тонкостями.
Этот материал — сугубо прикладной мануал: никакой теории, только терминал, конфигурационные файлы и реальный опыт настройки.
P.S. В прошлый раз в комментариях шутили, будто всю инфраструктуру настраивал школьник — что ж, текущий мануал подготовлен как раз при его непосредственном участии. Оцените результат объективно 🙂
Подготовка окружения и запуск Mailcow
Авторизуемся на целевом сервере и актуализируем пакетную базу:
apt update && apt upgrade -y
Инсталлируем обязательный набор утилит согласно официальным рекомендациям:
apt install -y git openssl curl gawk coreutils grep jq
Предварительно убедитесь, что порт 25 открыт для входящих/исходящих соединений, а в системе функционируют Docker и Docker Compose.
Загружаем исходный код Mailcow:
# Клонируем репозиторий
su
umask 0022
cd /opt
git clone https://github.com/mailcow/mailcow-dockerized
cd mailcow-dockerized
Инициализируем генерацию основного конфигурационного файла:
./generate_config.sh
Скрипт запросит базовые параметры:
-
Полное доменное имя (FQDN) почтового узла
-
Корректный часовой пояс (Timezone)
-
Предпочтительную ветку/версию сборки
Если требуются специфические правки, корректируем сгенерированный файл:
nano mailcow.conf
Скачиваем образы и стартуем контейнеры в фоновом режиме:
docker compose pull
docker compose up -d

После завершения инициализации открываем веб-интерфейс в браузере и переходим к форме входа администратора.

Внимание! Дефолтные учетные данные: логин — admin, пароль — moohoo.

Обязательная смена мастер-пароля

Сгенерируйте надежный пароль, обязательно сохраните его в надежном месте (иначе доступ в панель управления будет утерян) и примените изменения.

Подключение почтового домена
Переходим во вкладку E-Mail:

Нажимаем кнопку добавления нового домена:

Вводим доменное имя и задаем лимиты дискового пространства и учетных записей. Важный нюанс: параметр предельного числа ящиков ограничивает создание новых пользователей. Мы сами однажды столкнулись с этим лимитом, поэтому рекомендуем сразу закладывать достаточный запас.

Создание почтовых ящиков
Возвращаемся в раздел E-Mail:

Переходим к списку почтовых ящиков:

Кликаем по опции создания нового ящика:

Указываем имя пользователя, связываем его с нужным доменом, генерируем сложный пароль и подтверждаем создание нажатием Add.

С этого момента пользователь может войти в почтовый веб-клиент:

Конфигурация DNS-записей
Корректность DNS — ключевой фактор доставляемости почты. Требуется настроить базовый комплект: A, MX, SPF, DKIM и DMARC.
|
Тип записи |
Значение |
Назначение |
|---|---|---|
|
A |
mail.mycompany.ru → IP сервера (к примеру, 85.255.xxx.xxx) |
Привязывает хостнейм почтового узла к его публичному IP-адресу. |
|
MX |
@ → mail.mycompany.ru (приоритет: 10) |
Определяет маршрутизацию входящей корреспонденции для доменной зоны. |
|
SPF (TXT) |
v=spf1 mx -all |
Авторизует отправку исключительно с хостов из MX-записи, блокируя попытки спуфинга от имени домена. |
|
DKIM (TXT) |
Имя: dkim._domainkey |
Обеспечивает цифровую подпись исходящих сообщений, подтверждая неизменность содержимого при транзите. |
|
DMARC (TXT) |
Имя: _dmarc |
Задает политику обработки писем при сбое SPF/DKIM (в данном случае отправка в карантин/спам) и адрес агрегации отчетов ( |
|
Приведенная конфигурация является базовой и может адаптироваться под индивидуальные требования безопасности. |
|
|
|
Указанные ресурсные записи прописываются в панели управления DNS вашего регистратора или DNS-провайдера. |
|
|
Критически важна и PTR-запись (обратная зона DNS, сопоставляющая IP-адрес с доменным именем). Почтовые серверы проверяют соответствие PTR и HELO/EHLO имени. При несовпадении корреспонденция отсеивается спам-фильтрами. Настройка PTR осуществляется в панели управления хостинг-провайдера (для VPS/Dedicated) либо через обращение к вашему ISP.
Для бесшовной интеграции почтовых клиентов (Outlook, Thunderbird, мобильных приложений) полезно добавить записи автоматического обнаружения настроек:
|
Тип записи |
Значение |
Назначение |
|---|---|---|
|
autoconfig (CNAME) |
autoconfig → mail.mycompany.ru |
Применяется клиентами Thunderbird и совместимым ПО через эндпоинт |
|
autodiscover (CNAME) |
autodiscover → mail.mycompany.ru |
Используется экосистемой Microsoft Outlook с обращением к |
Верификация и диагностика
Mail-Tester
Для комплексного анализа качества отправки рекомендуем сервис Mail-Tester. Скопируйте предоставленный временный адрес, отправьте на него тестовое письмо из нового ящика и нажмите Then check your score:


Система оценит валидность подписей, заголовков и выставит итоговый балл (в идеале — 10/10):

DNS Checker
Для контроля распространения DNS-записей по миру используем DNS Checker. Вводим FQDN, запускаем Search и смотрим статус резолва по регионам:

Проверка по спам-базам (DNSBL)
Проверяем чистоту IP-адреса через сервис DNSBL Information. Указываем IP, нажимаем CHECK THIS IP и убеждаемся в отсутствии адреса в глобальных блеклистах:

Автоматизация развертывания через GitLab CI
Для устранения рутины и жесткой привязки к железу организуем автоматический деплой через CI/CD конвейер:
-
Импортируем репозиторий Mailcow в собственный инстанс GitLab.
-
Создаем конфигурацию .gitlab-ci.yml.
В меню
Settings → CI/CD → Variablesопределяем переменные:-
CI_MAILCOW_HOSTNAME
-
CI_DBPASS — Masked, Protected
-
CI_DBROOT — Masked, Protected
-
CI_REDISPASS — Masked, Protected
-
CI_TZ
-
CI_SOGO_URL_ENCRYPTION_KEY — Masked, Protected (ровно 16 буквенно-цифровых символов)
variables:# Переменные для mailcowMAILCOW_HOSTNAME: ${CI_MAILCOW_HOSTNAME}DBPASS: ${CI_DBPASS}DBROOT: ${CI_DBROOT}REDISPASS: ${CI_REDISPASS}TZ: ${CI_TZ}SOGO_URL_ENCRYPTION_KEY: ${CI_SOGO_URL_ENCRYPTION_KEY}IPV6_BOOL: "false"SKIP_CLAMD: "n"SKIP_LETS_ENCRYPT: "n"USE_WATCHDOG: "y"Конфигурация стадии деплоя:
deploy_manual-mailcow:
stage: deploy_manualextends: .deploy_manualbefore_script:# Логинимся в GitLab registry- docker login {ВАШ РЕГИСТРИ} -u ${CI_REGISTRY_USER} -p ${CI_REGISTRY_PASSWORD}# Создаем директорию- mkdir -p ~/projects
# Копируем измененные файлы- cp -ru ${CI_PROJECT_DIR} ~/projects# Переходим в директорию проекта- cd ~/projects/${CI_PROJECT_NAME}# Останавливаем запущенный проект- docker compose -f docker-compose-${COMPOSE_OVERRIDE_FILE}.yml down
# Создаем симлинк и генерируем конфиг- rm -f .env- ln -s mailcow.conf .env- chmod +x generate_config_without_user_input.sh- ./generate_config_without_user_input.sh -
Скрытый текст
Благодарим за внимание!
Больше практических кейсов и материалов об IT-инфраструктуре: SaaSoft в Telegram ||| Наш сайт SaaSoft
Память DDR5 на 128 ГБ за $3400 сметают боты: на реальных покупателей приходится всего 9% трафика
Дата-центры SpaceX на орбите грозят появлением нового вида электронных отходов
Маск планирует свыше 30 запусков Starship в день, но признает: до масштабов авиации космонавтике еще далеко
Не постановка: глава ZQGame подтвердил, что сверхсильный робот T800 действительно отбросил своего создателя мощным пинком на несколько метров
Появились первые живые фото Vivo X500 Pro — будущего короля мобильной фотографии
Илон Маск рассказал, почему Grok Bot способен работать даже при выключенном компьютере
Роскосмос показал плато Маньпупунёр со спутника «Ресурс-П»
Анонсирован мобильный роутер ZTE U25: сменный аккумулятор, 8 часов автономности и подключение до 32 устройств