Недавно мне потребовалось собрать свой почтовый сервер. В принципе, дело-то простое. Берёшь и ставишь сервер. 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.

Комментарии (17)


  1. Yak52
    03.01.2022 11:08

    Свой домен для личного пользования — это просто крутой email-адрес. Но для любой более-менее внятной компании — это обязаловка. Без корпоративного емейла вы не сможете зарегистрировать триальные версии b2b продуктов

    Ни кто не мешает настроить гуглопочту на работу со своим доменом.


  1. BigD
    03.01.2022 11:18
    +4

    Основная проблема - антиспам.


    1. savostin
      03.01.2022 14:51
      +3

      Причем проблема именно в попадании исходящих писем в спам у получателей.


      1. Borz
        03.01.2022 15:14
        +1

        Прописывание DKIM и обратной зоны в большей степени решает проблему.


        1. savostin
          03.01.2022 15:31
          +5

          Аффтор об этих «мелочах» решил не упоминать.


        1. aik
          03.01.2022 16:16
          +1

          Рабочий почтовый сервер раз в пару недель приходилось из каких-то чёрных списков выковыривать. DKIM был, обратные зоны тоже.

          После перехода на яндекс для домена пока что в черные списки не попадали.


          1. Borz
            03.01.2022 19:19

            странно. Проверяли причины попадания в ЧС?

            У меня сервер несколько лет как и в ЧС попадал только IP, которые от МГТС были. Смена IP не помогала - либо сразу опять в ЧС был, либо через время. В итоге поменял провайдера услуг - больше в ЧС не попадал пока, тьфу-тьфу


            1. aik
              03.01.2022 19:25

              А хрен его знает, не я тогда почту админил. Просто на время отпусков подменял админа и иногда приходилось вылезать из ЧС.
              Когда почту повесили на меня — я перевёл её на яндекс. Не то, чтобы сильно хотел — предпочёл бы привести в порядок старый почтовик (там был древний пень4, древняя фря и всё это было укреплено кучей костылей, чтобы работало нормально). Но начальство сказало «денег на апгрейды не дадим, уходим в облако». Каких-то серьёзных причин туда не уходить у меня не было, потому потихоньку ушли.
              Хотя у меня есть желание иметь резервный почтовик — на случай, если яндекс загнётся, но на его настройку надо время, которого никогда не хватает.


  1. aik
    03.01.2022 12:12
    +4

    Свой домен для личного пользования — это просто крутой email-адрес.

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

    Перестало или сказало, что перестало? ;)
    Возможность написания API для взаимодействия с почтой.

    API, по-моему, многие провайдеры почты предоставляют. Может не полнофункциональный, но добавить пользователя из скрипта позволяет.
    Цена. При наличии свободных серверных мощностей и большого количества пользователей иметь собственный сервер — намного дешевле, чем платить за гугл.

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

    А вот это у почтового хостера действительно тяжко сделать. Зачастую даже логи не почитать.

    Касательно же самостоятельного хостинга почты, основные проблемы:
    1) За ним надо следить и обслуживать. Отдельный сервер, бэкапы и т.п. Правда почту от хостера тоже бэкапить не мешает, а не доверяться полностью ему.
    2) Антиспам. Почтовым серверам большого дяди больше доверия, чем одинокому айпишнику небольшой конторы.


  1. t38c3j
    03.01.2022 14:29
    +1

    Кто-то находил решения для прокси почты в два конца? Типа тебе пишут на email@domain.one, сообщение пересылается на email@domain.two, но при этом если ответить на письмо с email@domain.two то оно обратно уходит на email@domain.one а там уже основному отправителю пересылается. На сколько я понимаю похожая система у эпла.


    1. Tibor128
      03.01.2022 15:37

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


    1. capslocky
      04.01.2022 08:51

      Включить email forwarding в админке регистратора домена для получения почты (это бесплатно). А для отправки использовать бесплатный план от какого-нибудь email delivery service, указав на его smtp сервер.

      В моем случае:

      • google domains → wildcard email forwarding → gmail

      • gmail → "send mail as" settings → smtp.sendgrid.net


  1. dragoangel
    03.01.2022 18:44

    Mailu лучше уже валять на k8s/swarm. Для docker-compose mailcow куда лучше и профитнее


  1. nApoBo3
    03.01.2022 19:12
    -3

    • Свой домен для личного пользования — это просто крутой email-адрес. Но для любой более-менее внятной компании — это обязаловка. Без корпоративного емейла вы не сможете зарегистрировать триальные версии b2b продуктов.

    Можно сделать на google/microsoft/yandex и думаю на всех остальных тоже.

    • Возможность написания API для взаимодействия с почтой. Если вы серьёзный системный администратор, то создание нового пользователя в домене не должно сопровождаться походом по пяти разным интерфейсам. Вам надо запустить скрипт, который создаст и привяжет все аккаунты друг к другу.

    У microsoft точно есть, у google вроде тоже но не пробовал.

    • Цена. При наличии свободных серверных мощностей и большого количества пользователей иметь собственный сервер — намного дешевле, чем платить за гугл.

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

    Не знаю, что за экзотика вам нужна, но microsoft поддерживает различные возможности обратоки почты, а что не поддерживает можно сделать криптами через api.

    На выходе оставется спорный тезис про рекламу.


  1. Vcoderlab
    03.01.2022 20:35

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

    Кто в теме, подскажите пожалуйста толковый мануал по ручной настройке почтового сервера на VDS. Мой уровень - уверенный пользователь Linux, админ "со словарём".

    Всякие iRedMail, Mail-in-a-Box и прочие подобные не подходят потому что им необходим выделенный сервер, чтобы кроме них там никого не было. Меня это не устраивает, у меня на сервере ещё пара моих сервисов крутятся.


    1. Sulerad
      03.01.2022 20:59

      А почему не докер? Сама статья как раз про это ведь. От себя добавлю, что в такой ситуации ради эксперимента ставил docker-mailserver, всё работало.


      1. Vcoderlab
        03.01.2022 21:02

        А почему не докер?

        Не хочу лишних прослоек, т. к. сервер слабенький - всего 1 ГБ ОЗУ и одно ядро CPU.

        upd: Посмотрел - docker-mailserver по системным требованиям в принципе подходит. Надо будет рассмотреть внимательнее. Спасибо!