В прошлой статье мы рассказали, почему решили съехать с корпоративной почты Mail.Ru на свою инфраструктуру. Тогда мы обошлись без деталей — а зря, судя по комментариям. В этот раз разбираем всё по шагам: как разворачивали MailCow и какие нюансы есть.
Эта статья — техническое продолжение. Без макроэкономики, только руки, консоль и шишки.
P. S. в прошлой статье сообщество решило, что у нас работает школьник и все это настраивает, поэтому статья как раз написана с помощью этого школьного товарища. Не судите строго, все таки мы еще в школу ходим:)
Разворачиваем сервис
Подключаемся к серверу и первым делом обновляем его
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 сервера
Временная зона
Какую версию установить

При необходимости правим файл конфигурации
nano mailcow.conf
Запускаем сервер Mailcow
docker compose pull docker compose up -d

Дожидаемся окончания запуска и подключаемся к серверу через браузер и переходим на страцицу авторизации админа

!! Креды по умолчанию: login: admin pass: moohoo!!!

Сразу меняем пароль администратора

Генерируем новый пароль (не забудьте его скопировать себе иначе больше не попадете в админку) и сохраняйте

Настройка домена
Переходим в настройки E-Mail

Выбираем добавить домен

Указываем свой домен и настраиваем квоты на почтовые ящики. Обратите внимание, тут указывается максимальное количество почтовых ящиков, которые можно создать. В первый раз не обратили внимание на это ограничение и в какой‑то момент уперся в это значение. Рассчитывайте сразу сколько вам потребуется почтовых адресов и оставляйте запас.

Настройка почтового ящика
Переходим в настройки E‑Mail

Затем переходим в настройки почтовых ящиков

Добавляем почтовый ящик

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

Теперь пользователь может авторизоваться

Настройка DNS записей
Один из самых важных этапов — это правильная настройка DNS записей. Нам нужно настроить A, MX, spf, dkim, dmark.
Запись | Значение | Для чего это нужно |
|---|---|---|
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Значение: скопировать из mailcow | Добавляет цифровую подпись к каждому письму. Получатель проверяет эту подпись через DNS, чтобы убедиться, что письмо не подделано по пути. |
DMARK (TXT) | Имя: _dmarcЗначение: v=DMARC1; p=quarantine; rua=mailto:dmarc@mycompany.ru | Инструктирует почтовые серверы (Gmail, Яндекс), что делать с письмами, которые не прошли проверку SPF или DKIM. |
Это базовые настройки, разумеется надо подходить к настройке этих параметров, исходя из ваших потребностей. | ||
Записи настраиваются на хостинге, где у вас зарегистрирован домен. |
Есть еще одна очень важная запись, PTR. Это обратная DNS‑запись. Она связывает IP‑адрес с доменным именем. Это противоположность A‑записи (которая связывает домен с IP). Она нужна для антиспам проверки. Почтовые серверы получателя проверяют, совпадает ли PTR вашего IP с именем, которое ваш сервер представил. Если нет — письмо может попасть в спам или быть отклонено. Также она нужна для идентификации сервера. Показывает, что ваш IP действительно принадлежит вашему серверу.
Настраивается она либо в панели управления вашего хостинга, если у вас арендованный сервер. Либо у провайдера интернета, если у вас личный сервер.
Также, если вы планируете использовать сторонние почтовые программы для подключения, то надо создать еще 2 записи autoconfig и autodiscover. Это служебные CNAME‑записи, которые помогают почтовым клиентам (Outlook, Thunderbird, мобильные приложения) автоматически находить настройки вашего почтового сервера.
Запись | Значение | Для чего это нужно |
|---|---|---|
autoconfig (CNAME) | autoconfig → mail.mycompany.ru | Используется Thunderbird и другими открытыми клиентами. Клиент обращается к |
autodiscover (CNAME) | autodiscover → mail.mycompany.ru | Используется Outlook (Microsoft). Outlook обращается к |
Проверка сервера после настройки
Mail tester
Есть специальные сервисы для проверки. Например Newsletters spam test by mail‑tester.com Переходим на этот сайт. Копируем почтовый адрес, который он предлагает, отправляем на этот адрес письмо с любого почтового ящика на вашем сервере, затем жмем кнопку Then check your score


В результате сервис проведет проверку настроенного функционала и выдаст вам оценку по десяти бальной шкале

DNS Checker
Проверка резолва на зарубежных DNS серверах DNS Checker — DNS Check Propagation Tool Переходим на сайт, вводим имя сервера, жмем Search и запускается проверка. По результатам проверку будет показано на каких серверах проходит резолв.

DNSBL
Проверка IP на предмет бана. Сервис DNSBL Information — Spam Database and Blacklist Check Переходим на сайт, вводим IP сервера, жмем кнопку CHECK THIS IP, по результатам проверки увидим попал ли IP в какие‑либо банлисты.

SelfHosted GitLab CI
Кто дочитал — тот молодец. Переходим как это теперь поднять через пайплайн и не быть привязаным к железу, серверу, а иметь возможность развернуть это все быстро.
Базово это всего несколько шагов, потому что MailCow поддерживает хорошо Docker.
Скачиваем репозиторий 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 — TG

