Недавно мне потребовалось собрать свой почтовый сервер. В принципе, дело-то простое. Берёшь и ставишь сервер. 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)
BigD
03.01.2022 11:18+4Основная проблема - антиспам.
savostin
03.01.2022 14:51+3Причем проблема именно в попадании исходящих писем в спам у получателей.
Borz
03.01.2022 15:14+1Прописывание DKIM и обратной зоны в большей степени решает проблему.
aik
03.01.2022 16:16+1Рабочий почтовый сервер раз в пару недель приходилось из каких-то чёрных списков выковыривать. DKIM был, обратные зоны тоже.
После перехода на яндекс для домена пока что в черные списки не попадали.Borz
03.01.2022 19:19странно. Проверяли причины попадания в ЧС?
У меня сервер несколько лет как и в ЧС попадал только IP, которые от МГТС были. Смена IP не помогала - либо сразу опять в ЧС был, либо через время. В итоге поменял провайдера услуг - больше в ЧС не попадал пока, тьфу-тьфуaik
03.01.2022 19:25А хрен его знает, не я тогда почту админил. Просто на время отпусков подменял админа и иногда приходилось вылезать из ЧС.
Когда почту повесили на меня — я перевёл её на яндекс. Не то, чтобы сильно хотел — предпочёл бы привести в порядок старый почтовик (там был древний пень4, древняя фря и всё это было укреплено кучей костылей, чтобы работало нормально). Но начальство сказало «денег на апгрейды не дадим, уходим в облако». Каких-то серьёзных причин туда не уходить у меня не было, потому потихоньку ушли.
Хотя у меня есть желание иметь резервный почтовик — на случай, если яндекс загнётся, но на его настройку надо время, которого никогда не хватает.
aik
03.01.2022 12:12+4Свой домен для личного пользования — это просто крутой email-адрес.
Можно привязать к любому почтовому провайдеру.большинство из них перестало это делать,
Перестало или сказало, что перестало? ;)Возможность написания API для взаимодействия с почтой.
API, по-моему, многие провайдеры почты предоставляют. Может не полнофункциональный, но добавить пользователя из скрипта позволяет.Цена. При наличии свободных серверных мощностей и большого количества пользователей иметь собственный сервер — намного дешевле, чем платить за гугл.
Не гуглом единым. Для небольшой конторы на сотню-другую ящиков какой-нибудь яндекс для домена будет вполне пристойным решением.Емейлы, которые должны обрабатываться, перекидываться из ящика в ящик и делать подобные прыжки через обруч
А вот это у почтового хостера действительно тяжко сделать. Зачастую даже логи не почитать.
Касательно же самостоятельного хостинга почты, основные проблемы:
1) За ним надо следить и обслуживать. Отдельный сервер, бэкапы и т.п. Правда почту от хостера тоже бэкапить не мешает, а не доверяться полностью ему.
2) Антиспам. Почтовым серверам большого дяди больше доверия, чем одинокому айпишнику небольшой конторы.
t38c3j
03.01.2022 14:29+1Кто-то находил решения для прокси почты в два конца? Типа тебе пишут на email@domain.one, сообщение пересылается на email@domain.two, но при этом если ответить на письмо с email@domain.two то оно обратно уходит на email@domain.one а там уже основному отправителю пересылается. На сколько я понимаю похожая система у эпла.
Tibor128
03.01.2022 15:37я хедерами решал подобную задачу. нужно было писать с двух разных ящиков с типа одинаоквым адресом.
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
dragoangel
03.01.2022 18:44Mailu лучше уже валять на k8s/swarm. Для docker-compose mailcow куда лучше и профитнее
nApoBo3
03.01.2022 19:12-3Свой домен для личного пользования — это просто крутой email-адрес. Но для любой более-менее внятной компании — это обязаловка. Без корпоративного емейла вы не сможете зарегистрировать триальные версии b2b продуктов.
Можно сделать на google/microsoft/yandex и думаю на всех остальных тоже.
Возможность написания API для взаимодействия с почтой. Если вы серьёзный системный администратор, то создание нового пользователя в домене не должно сопровождаться походом по пяти разным интерфейсам. Вам надо запустить скрипт, который создаст и привяжет все аккаунты друг к другу.
У microsoft точно есть, у google вроде тоже но не пробовал.
Цена. При наличии свободных серверных мощностей и большого количества пользователей иметь собственный сервер — намного дешевле, чем платить за гугл.
Очень спорный вопрос. Если сравнивать решении с тем же уровнем надежности и резервирования с высокой степенью вероятности коммерческие сервисы окажутся дешевле, особенно учитывая объем предоставляемого диского пространства.
Postfix. Если вы собираетесь расти, то postfix для вас. Емейлы, которые должны обрабатываться, перекидываться из ящика в ящик и делать подобные прыжки через обруч с напеванием гимна Америки — для всего этого вам понадобится postfix.
Не знаю, что за экзотика вам нужна, но microsoft поддерживает различные возможности обратоки почты, а что не поддерживает можно сделать криптами через api.
На выходе оставется спорный тезис про рекламу.
Vcoderlab
03.01.2022 20:35Пользуясь случаем, хочу поинтересоваться.
Кто в теме, подскажите пожалуйста толковый мануал по ручной настройке почтового сервера на VDS. Мой уровень - уверенный пользователь Linux, админ "со словарём".
Всякие iRedMail, Mail-in-a-Box и прочие подобные не подходят потому что им необходим выделенный сервер, чтобы кроме них там никого не было. Меня это не устраивает, у меня на сервере ещё пара моих сервисов крутятся.
Sulerad
03.01.2022 20:59А почему не докер? Сама статья как раз про это ведь. От себя добавлю, что в такой ситуации ради эксперимента ставил docker-mailserver, всё работало.
Vcoderlab
03.01.2022 21:02А почему не докер?
Не хочу лишних прослоек, т. к. сервер слабенький - всего 1 ГБ ОЗУ и одно ядро CPU.
upd: Посмотрел - docker-mailserver по системным требованиям в принципе подходит. Надо будет рассмотреть внимательнее. Спасибо!
Yak52
Ни кто не мешает настроить гуглопочту на работу со своим доменом.