В прошлой статье мы рассказали, почему решили съехать с корпоративной почты 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

Будет задано несколько вопросов:

  1. FQDN сервера

  2. Временная зона

  3. Какую версию установить

При необходимости правим файл конфигурации

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. quarantine = отправить в спам.Запись rua=mailto:dmarc@mycompany.ru означает, что события будут отправляться на указанный адрес.

Это базовые настройки, разумеется надо подходить к настройке этих параметров, исходя из ваших потребностей.

Записи настраиваются на хостинге, где у вас зарегистрирован домен.

Есть еще одна очень важная запись, PTR. Это обратная DNS‑запись. Она связывает IP‑адрес с доменным именем. Это противоположность A‑записи (которая связывает домен с IP). Она нужна для антиспам проверки. Почтовые серверы получателя проверяют, совпадает ли PTR вашего IP с именем, которое ваш сервер представил. Если нет — письмо может попасть в спам или быть отклонено. Также она нужна для идентификации сервера. Показывает, что ваш IP действительно принадлежит вашему серверу.

Настраивается она либо в панели управления вашего хостинга, если у вас арендованный сервер. Либо у провайдера интернета, если у вас личный сервер.

Также, если вы планируете использовать сторонние почтовые программы для подключения, то надо создать еще 2 записи autoconfig и autodiscover. Это служебные CNAME‑записи, которые помогают почтовым клиентам (Outlook, Thunderbird, мобильные приложения) автоматически находить настройки вашего почтового сервера.

Запись

Значение

Для чего это нужно

autoconfig (CNAME)

autoconfig → mail.mycompany.ru

Используется Thunderbird и другими открытыми клиентами. Клиент обращается к http://autoconfig.ваш-домен.ru/config-v1.1.xml и скачивает файл с настройками сервера.

autodiscover (CNAME)

autodiscover → mail.mycompany.ru

Используется Outlook (Microsoft). Outlook обращается к https://autodiscover.ваш-домен.ru/autodiscover/autodiscover.xml для получения настроек.

Проверка сервера после настройки

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:
    # Переменные для mailcow
    MAILCOW_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_manual
    extends: .deploy_manual
    before_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