Development
June 27, 2022

Свой Docker Mail Server для всех

ПРЕДИСЛОВИЕ

Автор этих строк является членом московского Института Проектного управления PMI. В связи со всеми известными событиями институт PMI прекратил поддержку Российских отделений PMI, и мы, менеджеры, остались без дома.

Прекращение поддержки российских отделений слабо укладывается в моей голове с принципами кодекса этики самого PMI. Заявление почитать можно здесь: https://www.pmi.org/about/solidarity-with-ukraine. Как-то всё это попахивает дискриминацией и отменой нас.

Что же делать? Люди и коммуникации между ними - это главное, что хочется и должно сохраняться всегда. И решили мы. тащемта, сделать свой клуб по интересам, с блэкджеком и куртизанками. Не можешь сделать сам - укради проведи анализ аналогов.

В предвзятой и нечестной борьбе выбор платформы для клуба пал на vas3k.club, членом которого авто и является :) Исходники этого, несомненно грандиозного, проекта тут: https://github.com/vas3k/vas3k.club

Платформа клуба много чего умеет, в том числе и отправлять электронные письма. А это значит, что надо развернуть свой почтовый сервер с уже известными характеристиками.

Зачем же что-то делать просто, если можно причудливо?

ЦЕЛИ ПРОЕКТА

Создать свой почтовый сервер, чтобы почту принимал и отправлял, рассылки делал. И чтобы с платформой Vas3k'а интегрировался :)

НЕОБХОДИМЫЕ РЕСУРСЫ

Что же нужно, чтобы развернуть свой почтовый сервер:

  1. Купить домен (привет, reg.ru).
  2. Купить wildcard SSL-сертификаты (опционально, там же на reg.ru).
  3. Раздобыть сервер с какой-нибудь последней Ubuntu с Docker. (Б-г мерзкий Yandex.Cloud).
  4. Прямые руки.

ПОЕХАЛИ

Как-то раз гуглинг гитхаба привел меня в проект https://github.com/jeboehm/docker-mailserver. И понял автор, что есть шанс отличиться, и это вам не это.

Проект My Docker MailServer: свой почтовый сервер за 5 минут без головной боли, вирусов и смс.

Что оно умеет

  • Поддержка POP3, IMAP, SMTP с авторизацией. А еще могут быть ящики, которые только отправляют письма, но не умеют получать.
  • TLS enforced: использование SSL-сертификатов. Как самоподписанных (self-signed, так и кастомных).
  • Веб-интерфейс для доступа в почту (Roundcube).
  • Возможность задания правил фильтрации почты через веб-интерфейс (RSPADM).
  • Защита от спама и вирусов в почтовых сообщениях :) Спамфильтр сам тренируется при переносе сообщений в спам! А еще есть Real Time Black Hole Lists (RBL) для блокировки известных спамеров.
  • Поддержка универсальных почтовых адресов (Aliasing).
  • Поддержка квот на почтовые ящики пользователей. С уведомлениями о превышении.
  • Поддержка DKIM подписи.
  • Веб-интерфейс для администрирования всего этого добра.
  • Поддержка отправки почты через RELAY HOST.
  • и т. д.

РАЗВОРАЧИВАЕМ и НАСТРАИВАЕМ

У автора задача со звездочкой. Наверняка, у читающего - аналогично.

Мои исходные данные следующие:

  • Основной сайт: https://pmi.moscow
  • Почтовый сервис должен быть на поддомене, в моем случае: https://mail.pmi.moscow
  • На остальных поддоменах крутятся и вертятся другие сервисы, в т.ч. веб-сервисы.

Есть сервер на Ubuntu, а в нем Docker. Автор использует обратный прокси jwilder/nginx-proxy для маршрутизации запросов туды-сюды (это просто).

ШАГ 0

Почтовый сервер должен отправлять почту. А это позволено лишь не всем, а не каким-то там спамерам. По умолчанию, свой почтовый сервер не сможет отправлять сообщения популярным почтовым серверам.

Чтобы обойти это недоразумение есть разные способы (наверное). Простой способ - это использовать Relay сервис по отправке сообщений. Автор остановился на сервисе SendInBlue, который на момент написания этих строк по бесплатному тарифу предлагает отправку 300 сообщений в день.

https://www.sendinblue.com

Настройка SendInBlue не должно быть какой-то проблемой. Важно это сделать для вашего домена. В итоге, на странице https://account.sendinblue.com/advanced/api будут доступным необходимые данные для настройки RelayHost

Прошу в комментарии к статье, если нужна инструкция по настройке SendInBlue.

Вот тута, в целом, написано неплохо: https://www.linuxbabe.com/mail-server/postfix-smtp-relay-ubuntu-sendinblue

ШАГ 1

Подключаемся на сервер через SSH любым удобным доступным способом.

На сервере нужен какой-нибудь редактор текстовых файликов. Т.к. автор не смог выйти из VIM, то он использует nano.

ШАГ 2

- На сервере переходим в необходимую директорию.

mkdir mailserver
cd mailserver

- Клонируем репозитарий в директорию (директория - любая. Хоть корень Root):

git clone https://github.com/TopTuK/docker-mailserver.git

- Дожидаемся загрузки всех файликов. После переходим в директорию docker-mailserver

cd docker-mailserver

ШАГ 3

- Копируем файл .env.dist в .env и открываем его

cp .env.dist .env
nano .env

- Редактируем файл .env

Если будем использовать RelayHost, то обязательно указываем соответствующие поля. Иначе, оставляем пустым.

В целом, название переменных говорят сами за себя.

MYSQL_DATABASE=mailserver # Название mysql базы. Оставляем как есть
MYSQL_USER=mailserver # Имя пользователя. Оставляем как есть
MYSQL_PASSWORD=changeme # Пароль от базы. Меняем на свой
MYSQL_ROOT_PASSWORD=changeme # Пароль от базы. Меняем на свой
MAILNAME=mail.domain.my # Меняем на свой домен, где доступен mailserver
POSTMASTER=postmaster@domain.my # Меням постмастера
RELAYHOST= # указываем relayhost. Если используется sendinblue, то '[smtp-relay.sendinblue.com]:587'
RELAY_PASSWD_KEY= # В случае sendinblue, то будет что-то вида 'user@domain.my:QQQYYYZZZ'
RELAY_OPTIONS=noanonymous # Для работы Relayhost
HEADER_SIZE_LIMIT=4096000 # Для работы Relayhost
FILTER_MIME=false
FILTER_VIRUS=true
ENABLE_IMAP=true
ENABLE_POP3=true
ENABLE_FTS=true
CONTROLLER_PASSWORD=changeme # Меняем на свой для доступа в RSPADM
WAITSTART_TIMEOUT=2m
RECIPIENT_DELIMITER=-
FTS_ARGS="partial=3 full=20 verbose=0 lowmemory=256"
FTS_VSZ_LIMIT=256M

ШАГ 4

Настраиваем SSL сертификаты

- Переходим в директорию certs

cd certs

- Создаем файлы сертификатов. Например, путем копирования их содержимого

Примечание: я сделал путем копирования содержимого файлов сертификатов, т.е. через Ctrl-C -> Ctrl-V

Название файлов с сертификатами может быть произвольным.

rm domain.*
touch mail.domain.my.crt
touch mail.domain.my.key
# Копируем содержимое сертификатов в созданные файлики. Например, через nano
cd ..

ШАГ 5

Конфигурируем файлы docker-compose.*

- Открываем файл docker-compose.yml

nano docker-compose.yml

- Редактируем docker-compose.yml

  • У автора "свои" сертификаты, сервис ssl - удаляем
# Либо комментируем, либо удаляем
# ssl:
  # image: jeboehm/mailserver-ssl:latest
  # build: ./ssl
  # env_file: .env
  # volumes:
  # - data-tls:/media/tls:rw
  • Раз сертификаты "свои", для для сервисов "mda" и "mta" надо удалить строчку про data-tls и раскомментировать строки про "свои" сертификаты. Не забыть поменять название сертификатов на "свои" в левой части настроек
...
# - data-tls:/media/tls:ro
# Uncomment lines below and change left part for using your own certificates
- ./certs/mail.domain.my.crt:/media/tls/mailserver.crt:ro
- ./certs/mail.domain.my.key:/media/tls/mailserver.key:ro
...
  • Т.к. автор использует обратный прокси для маршрутизации запросов к разным веб-сервисам, то нужно это указать для сервиса web. Указываем свой домен для почтового сервера.
...
# For use with jwilder/nginx-proxy. Uncomment this if you are using jwilder/nginx-proxy
environment:
  - VIRTUAL_HOST=mail.domain.my
...
  • Если используем свои сертификаты, то в самом низу в разделе "volumes" надо не забыть удалить упоминание про data-tls:
...
volumes:
  data-db:
  data-dkim:
  ...
  # Comment line below if you are using your own certificates
  # data-tls:
  data-filter:
  ...
...

Все настройки в docker-compose.yml интуитивны понятны их их названия. Экспериментируйте на здоровье!

- Редактируем docker-compose.production.yml

На данном шаге требуется сделать последние шаги перед запуском почтового сервиса. Сконфигурировать production параметры. Открытие и редактирование файлика уже умеем, так что пробежимся по основным параметрам

  • Закомментировать раздел сервиса web в случае использования обратного прокси от jwilder/nginx-proxy.
...
# Remove this block if you are using jwilder/nginx-proxy reverse proxy
# web:
  # ports:
    # - "0.0.0.0:81:80"
...
  • Docker сервисы взаимодействуют друг с другом с помощью сети. Это означает, что все сервисы должны быть в одной сети. В нашем случае - это обратный прокси и сервисы почтового сервера. Раскомментируем и укажем свои параметры:
...
# Uncomment next block if you use jwilder/nginx-proxy reverse proxy
networks:
  default:
  # Set your network name
    name: mynetwork
...

Вуаля! Настройка готова. Настало время запускать наш сервер!

ШАГ 6

Запускаем почтовый сервер. Наконец-то!

- Выполняем команды на запуск контейнеров

./bin/production.sh pull
./bin/production.sh build
./bin/production.sh up -d

Ждем завершения выполнения каждой команды. Пишите в комментариях, если что-то пошло не так.

- Проверяем, что все успешно запустилось

После запуска контейнеров сервисам нужно некоторое время, чтобы полностью инициализироваться. Это может занимать около 60 секунд. Выполняем (периодически):

 docker ps

В результате выполнения команды должно получиться что-то наподобие:

Если не страшных буковок наподобие "Unhealthy" или вечного запуска "Starting", то все работает :) Поздравляю!

ШАГ 7

На этом шаге требуется создать первого пользователя администратора. Выполняем команду:

./bin/production.sh run --rm web setup.sh

Следуя инструкциям -> создаем пользователя главного админа со своим паролем.

ШАГ 8: Оно работает!

Вот мы и пришли к последнему шагу по настройке. Теперь можно расслабиться, чинно выпить и закусить в обществе благочестивых герцогинь и кавалеров.

  • Админ-ка

На страничке mail.domain.my находится Админка. Выглядит приблизительно так:

А внутри вот так:

Интерфейс интуитивно понятный и вопросов вызывать не должен.

  • Веб-интерфейс для доступа к почте

Тут еще проще, веб-интерфейс находится на mail.domain.my/webmail

Выглядит как-то так:

  • Настройка фильтров

Для вашего удобства, мальчики и девочки, автор сделал возможность настройки указания черно-белых список IP, доменов и адресов для фильтрации почты.

  • Заходим сюда: mail.domain.my/rspamd
  • Вводим пароль (тот, что в конфиге значится как CONTROLLER_PASSWORD)
  • Выглядит все как-то так:

Настройка списков осуществляется в разделе Configuration. Название списков начинается с префиксов LOCAL_{BL/WL}_*. :) Наслаждайтесь!

ЗЛОКЛЮЧЕНИЕ

Вот так, с помощью нехитрых приобщений можно превратить буханку черного (или белого) хлеба в троллейбус построить свой почтовый сервер буквально за 5-10 минуты имея манипулятор типа мышь и клавиатуру.

Считается, что если начать утро с прочтения данной статьи, то день сложится удачно и без хитростей. В доме будет царить благополучнее и любовь! Если остались вопросы, прошу в комменты.

Задонатить можно лайком или что сейчас в моде.