Вы когда-нибудь хотели иметь свой собственный почтовый сервер? Узнайте, как настроить свой личный почтовый сервер с помощью этого пошагового руководства.

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

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

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

Если бы у меня была обычная среда docker без каких-либо других сервисов, я мог бы использовать этот docker-compose.yml и запустить его, выполнив:

$> docker-compose up -d

Поскольку я запускаю среду Docker Swarm с балансировщиком нагрузки Traefik, который создает SSL-сертификаты для моих доменов, мне нужно внести некоторые коррективы в файл Compose, чтобы установить и настроить почтовый сервер. Каждая корректировка будет объяснена позже, услуга за услугой.

Почтовый сервер

Это основная служба, используемая пакетом почтовых серверов. Самое важное, что мне нужно было добавить, это переменные окружения. Поскольку я запускаю установку Docker Swarm, имя хоста работает неправильно, и мне нужно разработать что-то еще. Я нашел возможное решение в запросе на включение на странице GitHub.

Я должен добавить FQDN и DOMAIN в качестве переменных среды. Еще один раздел, который я должен изменить, — это раздел ярлыков. Я добавил раздел deploy и создал два важных свойства:

  • placement-constraint и
  • labels.

placement-constraints используются для постоянного развертывания почтового сервера на узле моего менеджера, а labels заполняется всей информацией, необходимой для моего экземпляра Traefik.

Наконец, я должен изменить записи тома. Я хочу использовать тома докеров вместо локальной общей папки (что достигается добавлением ./ перед именем тома)

Кроме того, в разделе томов есть одна очень важная запись:

#- ./cert:/etc/letsencrypt/live/${MAILSERVER_FQDN}

Я объясню, что он делает и почему его комментировать позже подробно

Postfix-admin

Как и раньше, мне нужно добавить переменные среды FQDN и DOMAIN, настроить placement-constraint, labels и обновить тома.

Резиновая петля

Я только добавляю раздел deploy и меняю тома.

МарияДБ

Контейнеру MariaDB присваивается значение placement-constraint, поэтому я не теряю используемые данные и тома докеров. Кроме того, очень важно, чтобы MYSQL_PASSWORD было таким же, как определено в службе почтового сервера.

Редис

Последний сервис — это контейнер Redis, который получает placement-constraint и скорректированные тома.

Идти дальше

После настройки сервисов в одном файле (docker-compose.mailserver.yml) следующим шагом было развертывание стека Docker Swarm. Поскольку я объявил несколько переменных среды, мне пришлось сначала экспортировать их (и мне приходится экспортировать их каждый раз, когда я заново создаю службу). Вот список экспорта:

После экспорта этих переменных я мог развернуть почтовый сервер в своем Docker Swarm, выполнив:

$> docker stack deploy -c docker-compose.mailserver.yml mailserver

После развертывания почтового сервера он не использовал SSL, поскольку Traefik сгенерировал сертификаты после первого посещения веб-сайта. Поскольку я объявил в службе почтового сервера, что существует домен с именем mail.$PRIMARY_DOMAIN. Я открыл этот веб-сайт, и он показал rspam, но также создает SSL-сертификат, который необходим для почтового сервера.

Как использовать SSL?

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

Мне пришлось создать небольшой скрипт, который использует dumpcerts (с почтового сервера GitHub) для извлечения сертификатов из traefik-acme.json и сохранения их в файле, который почтовый сервер может использовать для получения SSL-сертификата. Вот код:

Этот сценарий предполагает, что файл acme.json, который Traefik использует для хранения сертификатов, находится в той же папке, что и почтовый сервер. Скрипт dumpcert можно найти здесь.

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

Кроме того, я создал сценарий обновления, который использует все команды вместе:

К сожалению, вы должны делать это каждые три месяца, потому что Traefik генерирует сертификаты, срок действия которых составляет всего три месяца.

После установки

Когда все запущено, следующая задача — настроить postfix-admin и rainloop. Для этого есть две очень простые информационные страницы, где вы можете найти всю информацию о настройке этих сервисов: rainloop-initial, postfix-initial.

Кроме того, для работы почтового сервера требуется настройка DNS! Этот шаг очень важен.

Примечания

  • Убедитесь, что запись PTR вашего IP-адреса соответствует полному доменному имени (по умолчанию: mail.domain.tld) хоста вашего почтового сервера. Эта запись обычно устанавливается в интерфейсе вашего веб-хостинга.
  • Записи DKIM, SPF и DMARC рекомендуются для создания хорошей репутации.
  • Запись DMARC можно создать здесь
  • SPF нужен публичный IP почтового сервера!: v=spf1 a mx ipYOURMAINHERE ~all
  • Публичный ключ DKIM (mail._domainkey) будет доступен на хосте после запуска контейнера здесь:
/var/lib/docker/volumes/mailserver_mail/_data/dkim/domain.tld/public.key

Последние мысли

Теперь почтовый сервер запущен, и вы можете использовать postfix admin (postfixadmin.yourdomain.de) для создания учетных записей, к которым можно получить доступ с помощью Rainloop (webmail.yourdomain.de) или другого почтового клиента (Thunderbird/Betterbird).

Я надеюсь, что вы найдете это руководство полезным и теперь сможете добавить почтовый сервер в свою среду Docker Swarm.

Кроме того, если у вас есть какие-либо вопросы, идеи, рекомендации или вы хотите поделиться классными командами или инструментами Docker, свяжитесь со мной. Я постараюсь ответить на ваш вопрос, если это возможно, и проверить ваши рекомендации.

Want to connect with the author?
Twitter, LinkedIn, Blog, GitHub

Эта статья изначально была опубликована на моем https://www.paulsblog.dev/how-to-set-up-a-mailserver-within-a-docker-swarm/