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