Настраиваем свой почтовый сервер в docker-compose

Недавно мне потребовалось собрать свой почтовый сервер. В принципе, дело-то простое. Берёшь и ставишь сервер. Postfix, dovecot, letsencrypt, roundcube, spamassasin, clamav. Всё это — уже известные дела. Колея проторена. Иди и делай.

Но мне нужно было наплодить этих серверов. И я подумал, а почему бы не настроить всё на контейнерах? Такое можно сделать. Для этого надо скачать все вышеописанные контейнеры и написать .env файл века с более чем сотней разных параметров. Ну и, конечно же, сконфигурировать nginx. Там всё просто. С полдесятка хостов, и система заработает.

Я тяжело вздохнул и решил, что наверняка есть решение попроще. И оно нашлось. Mailu. Всё просто и из коробки, но всё-таки и в нём есть свои подводные мины.

Под катом — подробности того, как установить Mailu без боли и проблем, а также описание компонентов и рассказ о том, что и как можно менять и использовать.

Я нашёл Mailu после 20 минут поиска в google. Это аккуратно собранный набор docker-контейнеров, который позволяет вам запускать свой email сервер за считаные минуты. Проект не обделён вниманием на github, с 3000 звёзд, но на Хабре был упомянут всего лишь один раз. Ознакомиться с исходниками можно здесь .

Зачем нужно ставить свой сервер, если в мире есть гугл?

  • Свой домен для личного пользования — это просто крутой email-адрес. Но для любой более-менее внятной компании — это обязаловка. Без корпоративного емейла вы не сможете зарегистрировать триальные версии b2b продуктов.
  • Отсутствие рекламы и сканирования вашей почты сторонними сервисами. В своё время Gmail и другие отличались упорным сканированием. И хотя большинство из них перестало это делать, рекомендуется проверять настройки приватности в почте. А Яндекс, судя по всему, ещё продолжает это делать с целью таргетинга рекламы.
  • Возможность написания API для взаимодействия с почтой. Если вы серьёзный системный администратор, то создание нового пользователя в домене не должно сопровождаться походом по пяти разным интерфейсам. Вам надо запустить скрипт, который создаст и привяжет все аккаунты друг к другу.
  • Цена. При наличии свободных серверных мощностей и большого количества пользователей иметь собственный сервер — намного дешевле, чем платить за гугл.
  • Postfix. Если вы собираетесь расти, то postfix для вас. Емейлы, которые должны обрабатываться, перекидываться из ящика в ящик и делать подобные прыжки через обруч с напеванием гимна Америки — для всего этого вам понадобится postfix.

Приступаем

Устанавливать будем на десятый Debian. Вам понадобится выделенный сервер с доменным именем. В целом, систему можно запустить на 4х гигабайтах оперативной памяти.

Настройка DNS записей занимает пару минут. Идём на сайт нашего любимого DNS-провайдера, покупаем mydomain.org и начинаем его настраивать. Вам потребуются следующие записи:

mydomain.org A 1.2.3.4
mail.mydomain.org A 1.2.3.4
mydomain.org MX mail.mydomain.org

И первым делом сохраните себе немного нервов:

systemctl stop exim4.service
systemctl disable exim4.service
systemctl stop apache2.service
systemctl disable apache2.service

После чего устанавливаем docker и docker-compose по инструкции.

Первая подводная мина

Во время установки docker-compose вы увидите следующее сообщение:

perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings: LANGUAGE = (unset), LC_ALL = (unset), LANG = "en_US.utf8" are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").

Иногда отсутствие правильно сконфигурированной локали создаёт проблемы для выполнения docker-compose скриптов. Посему давайте поправим это сразу же:

export LANGUAGE=en_US.UTF-8
export LANG=en_US.UTF-8
export LC_ALL=en_US.UTF-8
locale-gen en_US.UTF-8
dpkg-reconfigure locales

После dpkg-reconfigure откроется окно выбора локалей, в котором надо выбрать en_US (UTF-8). Вам разве что потребуется выбрать другую локаль. В таком случае — удачи.

После создаём папку для хранения всех данных в корне системы:

mkdir /mailu

Настройка

Далее идём на https://setup.mailu.io/ и начинаем интерактивно создавать свой docker-compose.yml для нашей системы. Заполняем все поля и выбираем в первом пункте compose, поскольку пользуемся именно им. Остальные поля заполняются очевидными значениями.

Несколько вещей, которые стоит упомянуть отдельно:

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

В третьем пункте вы можете выбрать веб-клиент для вашей почты. В большинстве случаев это будет полезным, если клиент не всегда под рукой. На выбор предлагаются roundcube и rainloop.

Rainloop, с моей точки зрения, выглядит намного приятнее, чем roundcube. Но с точки зрения функционала в Mailu — обе эти системы абсолютно одинаковы. Разве что некоторые люди говорят, что rainloop удобнее с мобильного телефона, но я так и не увидел никаких причин использовать почтовый веб-интерфейс на мобильном телефоне. Лучше отдать предпочтение любимому клиенту.

На сервере установится GPL версия roundcube или rainloop. Поэтому дополнительных фишек типа своего интерфейса или двухфакторной авторизации у вас не будет. Rainloop предлагает платную версию для этих целей. Если вы серьёзно намереваетесь использовать web интерфейс, то рекомендуется подумать о платной версии c 2FA.

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

Вторая подводная мина

Если вы пытаетесь поднять сервер без встраивания в существующую IT инфраструктуру, то в графе IPv4 listen address обязательно укажите IP адрес своего сервера, а не 127.0.0.1.

В последней части настройки выбирайте базу данных, с которой вы будете работать. Если вам нужно обслуживать компанию в 50 человек, то можете остановиться на sqlite. Но мне был необходим postgres. На самом деле, создание пользователей в моей системе происходит вовне, и для нормальной работы моих скриптов мне нужен был доступ именно к postgres.

Нажимаем Generate и получаем ссылки на готовые docker-compose.yml и mailu.env. Эти файлы надо скопировать на сервер в директорию /mailu.

Третья подводная мина

Posgres не является частью инсталяции и его нужно настраивать отдельно. Если вы попытаетесь добавить postgres, как backend для вашей установки, прямо из веб-конфигуратора, то вы получите предупреждение, что со следующей версии работать он не будет. Если у вас уже крутится инстанс, то просто введите адреса, логины и пароли для него.

Если его нет, то добавим руками.

В docker-compose.yml

 # Postrgres Database db: image: postgres restart: always volumes: - "/mailu/postgres:/var/lib/postgresql" environment: - "POSTGRES_PASSWORD=pass" - "POSTGRES_USER=postgres-mailu" - "POSTGRES_DB=mailu"

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

###################################
# Database settings
###################################
DB_FLAVOR=postgresql
DB_USER=postgres-mailu
DB_PW=pass
DB_HOST=db
DB_NAME=mailu

Ну и настало время, запускаем:

docker-compose -p mailu up -d

Четвёртая мина

Обязательно указывайте -p mailu при запуске системы. Если вы этого не сделаете, то будут происходить странные вещи и местами какие-то части системы будут отваливаться.

Пятая мина

Проверьте логи контейнера mailu/nginx:1.8. Система автоматически установит сертификаты letsencrypt. Но может случиться, что это не произойдёт с первого раза. При попытке зайти в админку вы увидите предупреждение и ошибку, что сервер недоступен.

Если в логах написано, что получение сертификата с треском провалилось, просто сделайте:

docker-compose down
docker-compose -p mailu up -d

Всё должно заработать. Если что-то не запускается, то надо идти и проверять логи nginx и /var/log/letsencrypt.log, большинство ошибок будет описано именно там.

Итак, поздравляю. Всё запустилось, всё работает.

Пост-настройка

Первым делом выполняем следующую команду:

docker-compose -p mailu exec admin flask mailu admin admin mydomain.org PASSWORD

Потом идём на mydomain.org/admin (или что вы указали в настройках во втором пункте) и меняем админский пароль.

Для непросвещённых могу заметить, что представленный административный интерфейс не настолько интуитивен, как панель управления google. Если вам не терпится перейти к созданию новых емейлов, то выбирайте Mail Domains и смотрите на очень маленькие иконки в разделе Manage. Там вы сможете создавать пользователей, алиасы и всё что душе угодно.

В принципе, всё. Можете начинать гонять почту.

Но не спешите. Будьте внимательны. Вам теперь вменяются обязанности администратора. Любишь кататься — люби и саночки возить.

Поддержка

Для того чтобы правильно обезопасить себя, вам достаточно полностью бэкапить каталог /mailu на сервере. Как минимум раз в день. А если вы это делаете на прод сервере на предприятии, то я бы порекомендовал rsync каждые 5 минут, плюс создание резервной копии каждые 8-12 часов.

Удалённая почта удаляется навсегда. Поэтому пользователи придут к вам и будут просить всё исправить. Тут без бэкапов не обойтись.

Почему-то тема бэкапов не покрыта в обширной документации Mailu, хотя в github сами разработчики утверждают, что сервер может спокойно бэкапить rsync.

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

И конечно же, самое приятное — размер писем. Если Вася Пупкин любит отправлять по 60 гигабайт почты в день, убедитесь что вы правильно выставили квоты и ограничения.

Когда ваш сервер встанет намертво, то первым делом проверяйте:

df -h

Для того чтобы узнать, сколько места у вас осталось на диске. А с помощью:

du * -cksh

Вы сможете быстро найти виновника того, что место испарилось.

Ну вот, собственно говоря, и всё. У вас есть свой postfix, dovecot, roundcube, что-то там ещё. Его очень легко переносить с одного сервера на другой. А когда вы решите, что вам нужно больше контроля над системой, вы можете разобрать существующие докер контейнеры и заменить их стандартной установкой нужных компонентов.

Итого у вас на руках есть почтовый сервер. Для обеспечения почтой 50-ти сотрудников вполне подойдёт такая вот конфигурация:

Вы получаете свой почтовый сервер по цене в 20 рублей в месяц за одного пользователя. Что серьёзно дешевле Google Workspace. Можете садиться и писать инструкции о том, как подключаться к вашему серверу с iPhone и Android. Thunderbird, например, сам разберётся с тем, как правильно подключиться.


НЛО прилетело и оставило здесь промокоды для читателей нашего блога:

15% на все тарифы VDS (кроме тарифа Прогрев) — HABRFIRSTVDS.

20% на выделенные серверы AMD Ryzen и Intel Core HABRFIRSTDEDIC.

Читайте так же:

  • Google исправила баг Pixel 6, из-за которого Assistant самостоятельно звонил случайным контактамGoogle исправила баг Pixel 6, из-за которого Assistant самостоятельно звонил случайным контактам Google сообщила об исправлении бага, из-за которого голосовой помощник Google Assistant самостоятельно набирал случайные контакты, в том числе посреди ночи. Проблема коснулась пользователей устройств Pixel 6 и 6 PRO. Впервые о ней заговорили на Reddit в начале ноября.Google презентовала […]
  • Google рассказал о Shopping Graph и новых возможностях для покупки товаровGoogle рассказал о Shopping Graph и новых возможностях для покупки товаров На конференции I/O 2021 Google рассказал подробнее о Shopping Graph и анонсировал новые способы покупки товаров в поиске и не только. Shopping Graph Shopping Graph – это динамическая. Работающая на основе ИИ модель. Которая понимает постоянно изменяющийся набор товаров, продавцов. […]
  • [Перевод] Голиаф[Перевод] Голиаф DisclaimerРассказ «Goliaph» написан Нилом Гейманом в сотрудничестве с авторами фильма «Матрица» и был опубликован в своё время на промо-сайте WhatIsTheMatrix.com вместе с другими рассказами и комиксами от приглашённых авторов. Пожалуй, я могу утверждать: я всегда подозревал, что мир - […]
  • Права на текст сайтаПрава на текст сайта Разделы Используйте графические блоки для добавления изображений на страницы или записи в блогах в различных макетах. Каждый блок изображений отображает одно изображение. Посмотрите видео Добавить блок изображения Чтобы добавить блок изображения: Отредактируйте страницу или сообщение, […]