Mailcow — почтовый сервер на основе Dovecot, Postfix, soGo и другого программного обеспечения с открытым исходным кодом, который обеспечивает современный веб-интерфейс для администрирования и использования электронной почты.
Введение
Mailcow — позволяет с адресом любого вашего домена, сделать собственный почтовый ящик. К примеру, если вы владелец домена вида mydomain.ru, то сможете легко настроить себе почту по адресу [email protected] или [email protected].
В общем, любое имя до знака @, плюс ваш домен. Весь стек почтового сервера состоит из 18-ти контейнеров, поэтому ставить будем через docker-compose, так как это проще и этот метод описан в официальной документации.
Подготовка
PTR-запись
В настоящее время в сети пытаются оградить пользователя от спама, сервера общаются друг с другом используя множество механизмов. Одним из таких является PTR-запись.
Если коротко, то PTR-запись (или, как ее еще называют, Pointer) — противоположность A-записи для DNS.
DNS (Domain Name System) — это система связи между доменными именами и IP-адресами, к которым они принадлежат. То есть это понятные названия для существующих в сети сайтов. Чтобы не запоминать IP-адреса, как номера телефонов, были придуманы простые названия вида: google.com или myunraid.ru.
A-запись показывает взаимосвязь между адресом и названием. Указывает на то, какой IP скрывается за доменном. PTR-запись нужна для обратного. Она показывает доменное имя для указанного ip адреса.
Анти-спам фильтры делают проверку через обратные DNS, и у почтового сервера могут возникнуть сложности, если отсутствует корректная PTR-запись. В таком случае, почтовый сервер блокирует письмо. Чтобы корректно работал почтовый сервер, и ваши письма не летели в спам, нужно иметь корректную PTR-запись. Для получения PTR-записи необходимо обращаться к провайдеру.
Чтоб проверить свою PTR-запись, достаточно пройти на myip.ru.
Вверху будет ваш ip, а снизу имя хоста, то есть имя вашего почтового сервера.
У нас домен myunraid.ru, поэтому имя хоста, он же адрес почтового сервера, будет «sample.myunraid.ru«.
Для примера, сделаем его таким:
mail.myunraid.ru
MX запись
Также, нам нужно сделать «MX» запись в DNS, к нашему домену. Это будет тот же адрес нашего почтового сервера, т.е. mail.myunraid.ru.
MX-запись вид DNS-записи, предназначенный для регистрации почтовых серверов с использованием протокола SMTP. Именно с ее помощью почтовый агент отправителя определяет сервер, на который и необходимо выполнить доставку электронного письма.
Делается это на странице администрирования, вашего домена, в записях DNS:
Открываем порты в роутере
Для работы почтового сервера, необходимо открыть порты на роутере, указанные ниже:
SMTP_PORT=25
SMTPS_PORT=465
SUBMISSION_PORT=587
IMAP_PORT=143
IMAPS_PORT=993
POP_PORT=110
POPS_PORT=995
SIEVE_PORT=419
На примере Keenetic, это делается на вкладке «Переадресация«, подробнее на скриншоте:

Установка контейнера
Установка необходимых контейнеров с использованием docker compose и их настройка будет включать 3 больших шага:
- Генерируем и настраиваем конфигурационный файл
- Настраиваем пути директорий volumes
- Устанавливаем docker-compose mailcow
Генерируем и настраиваем конфигурационный файл
Необходимо создать директорию, где будет храниться mailcow.
Переходим в appdata:
cd /mnt/user/appdata/
Создаем папку:
mkdir -p mailcow
Переходим в созданную папку:
cd /mnt/user/appdata/mailcow
Клонируем сюда установочные файлы mailcow, как написано в официальной документации:
git clone https://github.com/mailcow/mailcow-dockerized
Смотрим, что у нас появилось:
ls
Видим:
mailcow-dockerized
Переходим в нее:
cd /mnt/user/appdata/mailcow/mailcow-dockerized
Далее, нам нужно сгенерировать конфиг и внести свои изменения в параметры установки:
./generate_config.sh
В первой строке, нам предлагают ввести наш host name, то есть адрес нашего почтового сервера(mail.myunraid.ru).
Во второй строке временную зону (Europe/Moscow).

Промежуточный итог:

Мы сгенерировали конфиг, теперь нужно зайти в него, и поменять порты, так как по умолчанию там:
HTTP_PORT=80
HTTP_PORT=443
Эти порты заняты, производим замену. Открываем конфиг файл:
nano mailcow.conf
И меняем на свободные:

Затем сохраняем CTRL+S и выходим CTRL+X.
Настраиваем пути для директорий volumes
По умолчанию в docker-compose.yml контейнера mailcow, системные файлы лежат по 2-м путям.
- ./data, то есть, в той директории, где лежит docker-compose.yml. На скриншоте ниже, этот путь будет отмечен на скриншоте как номер «1″.
- Путь с названием контейнера на скриншоте подчеркнут как номер «2″. Его мы должны изменить на свой, пример замены на скриншоте подчеркнут как номер «3«.

Открываем в nano:
nano docker-compose.yml
Делаем замену везде. Где есть, к примеру mysql-vol-1, мы меняем на:
/mnt/user/appdata/mailcow/data-vol/mysql-vol-1
Далее mysql-socket-vol-1, меняем на:
/mnt/user/appdata/mailcow/data-vol/mysql-socket-vol-1
И так во всем docker-compose.yml файле.
Затем, идем в конец, и удаляем все переменные volumes и саму «volumes»:

По итогу, сохраняем наши изменения CTRL+S и выходим CTRL+X.
Устанавливаем docker-compose mailcow
Запускаем установку всех связанных контейнеров командой:
docker-compose up -d
Устанавливается не быстро, все таки там 18 контейнеров.
Главное, чтоб не было ошибок, и в конечном итоге, все они успешно установились.
Далее, переходим в веб панель, по адресу, который мы указали в docker-compose.yml файле. Ваш ip:port. У меня это 192.168.1.9:880:

Настройки панели управления mailcow
- Настройки аккаунта администратора
- Создание домена почты
- Создание почтового ящика
- Проверка работоспособности
Настройки аккаунта администратора
Для входа используем связку логин/пароль по умолчанию, как указано на официальной сайте проекта:
login:admin
password:moohoo
Вводим эти данные, нажимаем «Войти» и попадаем в панель управления.
Первым делом, необходимо сменить логин и пароль администратора.

Вверху, выбираем первую вкладку «Настройки доступа»
Далее:

Затем справа видим «Действия», выбираем «Изменить»
Вводим желаемое «Имя пользователя» и «Пароль», далее «Подтверждения пароля (повтор)», а затем «Сохранить изменения»:

Создание домена почты
Вверху, в основных вкладках видим «Конфигурация«, нажимаем.

Во всплывающем окне выбираем «Настройка почты«
Далее:

На вкладке «Домены«
Затем:

В меню справа, нажимаем на «Добавить домен«
В появившемся окне заполняем основные параметры. Основное, это «Домен», тот, что вы приобрели, в моем примере это myunraid.ru.
Все остальные параметры понятны по описанию, меняем по желанию и на свое усмотрение. Я лишь добавил «Описание«, остальное оставляю в стоковом виде.
Затем «Только добавить домен«.

Создание почтового ящика
Для начала:

Переходим во вкладку «Почтовые ящики«
Затем:

Жмем кнопку «Добавить почтовый аккаунт«
В появившемся окне, заполняем поле «Имя пользователя (часть адреса электронной почты слева)», туда мы вписываем желаемое имя почтового ящика, то есть то, что идет до знака «@«, в название вашего почтового ящика.
В моем примере, в конечном итоге создастся почта [email protected]. Вводим свой «Пароль«, затем «Подтверждение«, все остальные поля, опять же, интуитивно понятны, все настройки на ваше усмотрение.
Затем жмем кнопку «Добавить«:

Проверяем результат
Мы создали почтовый домен mail.myunraid.ru, добавили свой домен в веб-панель myunraid.ru, также создали к нему почтовый ящик [email protected], теперь можно зайти во встроенный soGo почтовый клиент и отправить тестовое письмо.
Приступим:

В верхней вкладке нажимаем на «Приложение«. Во всплывающем окне «Webmail«
Мы попадаем на страницу почтового клиента soGo:

Вводим наш «Логин» и «Пароль«, от почтового ящика.

Кликаем на карандаш и выбираем «Создать новое сообщение«
Оформляем тестовое письмо:

Жмем отправку, ярлык самолетик-конверт
Проверяем у получателя. Скорее всего оно дошло, но попало в спам, чтобы это вылечить выполняем целый комплекс мероприятий ниже.
Настраиваем SSL сертификаты для почтового домена
Для, того чтоб комфортно работать с нашим почтовым ящиком, нам могут потребоваться различные IMAP-клиенты, клиент мобильных устройств, web клиент, на OS Windows, macOS и прочие.
Для того, чтоб мы могли спокойно авторизоваться через наш почтовый сервер, должен быть действующий SSL сертификат.
Наши действия:
- Вывести в веб наш почтовый домен mail.myunraid.ru
- Ищем SSL сертификаты в папке NPM
- Добавляем SSL сертификаты в папку mailcow
Выводим в веб почтовый домен mail.myunraid.ru
Для этого воспользуемся Nginx Proxy Manager. Переходим в NPM, добавляем почтовый домен и запрашиваем сертификаты.
Добавлять нужно три адреса:
- mail.myunraid.ru
- autoconfig.myunraid.ru
- autodiscover.myunraid.ru
Поиск SSL сертификата в папке NPM
Этот момент настройки отличается от стандартного из документации mailcow, поэтому немного нужно «извратиться».
Мы вывели наш почтовый домен в веб, получили для него SSL сертификаты, но они лежат только в папке NPM, а нам нужно, чтоб они были продублированы в директории mailcow.
В NPM сертификаты названы «по-своему», с типом 456897.conf, т.е. «цифра.conf» и нужно найти, какая цифра у нашего домена mail.myunraid.ru.
Итак, идем в директорию NPM. По пути:
/mnt/user/appdata/npm/data/nginx/proxy_host/
Теперь надо методом перебора найти наш *.conf файл относящийся к почтовому домену.
По логике, самый последний запрашиваемый нами сертификат — это самое большое число в названии +.conf.
Пример нужного сертификата:

Добавляем SSL сертификаты в папку mailcow
Теперь, когда мы нашли, под каким номером, нужный нам сертификат, переходим в его папку, по пути.
У меня он, под номером «3«.
/mnt/user/appdata/npm/letsencrypt/archive/npm-3/
Во втором окне файл менеджера, открываем директорию в mailcow.
/mnt/user/appdata/mailcow/mailcow-dockerized/data/assets/ssl/
Теперь нужно переместить и переименовать файлы fullchain1.pem и privkey1.pem, в директорию */ssl, с заменой на файлы cert.pem, key.pem.
Через терминал, выполним:
Команда 1
cp /mnt/user/appdata/npm/letsencrypt/archive/npm-3/fullchain1.pem /mnt/user/appdata/mailcow/mailcow-dockerized/data/assets/ssl/cert.pem
Команда 2
cp /mnt/user/appdata/npm/letsencrypt/archive/npm-3/privkey1.pem /mnt/user/appdata/mailcow/mailcow-dockerized/data/assets/ssl/key.pem
Перемещения будут выглядеть следующим образом:

Сертификаты действительны 3 месяца, поэтому лучше сделать скрипт и настроить их перемещение по крону.
Дополнительные записи DNS
Для того, чтоб письма наши не попадали в спам, нам нужно сделать дополнительные DNS записи.
Записи делаются на сайте вашего регистратора домена, в админ панели. Там же, где мы делали «MX» запись.
Из официально документации следует, что есть два типа настроек DNS, минимальные и полные.
Мы будем описывать полные настройки:

Записи в кабинете администрирования домена
Переходим в личный кабинет, и делаем все эти записи.
Приведу скриншот двух записей, остальные нужно сделать также, по аналогии.
Записи DKIM, SPF and DMARC
В документации, также указываются записи DKIM, SPF и DMARC, это также очень важные записи, и нам нужно их сделать обязательно.

Опять же, в настройках администрирования домена, вносим эти записи.
Первая запись, это SPF «v=spf1 a mx ip4:вашIP ~all»
Вторая запись DMARC «v=DMARC1; p=quarantine; sp=quarantine».
И последняя запись DKIM:

Меню «Конфигурация«, в выпадающем списке «Настройка сервера«
Далее:

«Глобальные настройки«, «ARC/DKIM ключи«
В поле «Домен/ы» пишем наш домен, «Длина ключа«, выбираем 1024, и жмем «Добавить«:
Если у вас, все аналогично, то значит все сделано верно и будет работать. Если возникают ошибки в статусах, то необходимо снова проверить записи DNS.
На TLSA не обращаем внимание, так как очень мало регистраторов доменов, предоставляют возможность сделать TLSA запись. Но и без нее, все будет отлично.
Итог
Тестирование почты
Итак после всех манипуляций, мы можем посмотреть, насколько балов оценивается письмо с нашей почты.
Это можно сделать на специальном сервисе:

Копируем адрес почты, который нам выдали. Каждый раз он генерируется новый.
В примере — [email protected], отправляем туда письмо со своего почтового ящика.
Всего, на бесплатной основе, можно отправить 3 письма в день, дополнительные проверки за дополнительную плату.
Итак, мы отправили письмо, и теперь жмем «Then check your score«.

Итак, сервис оценивает наше письмо как 10 балов из 10 возможных, единственная желтая галочка, говорит о слишком малом количестве символов в письме, в остальном все отлично.
Результат оценки означает, что наши письма с вероятностью в 99,9 процента, будут доходить до любого почтового сервера, именно во Входящие, а не в Спам.
Когда Я увидел скрин с кинетик гига то почувствовал родство. Но тут же появился вопрос. Получается ты не пользуешься dynDNS от кинетика? Ты видимо просто у регистратора домена всё настраиваешь, а на кинетике только пробрасываешь порты в нджинкс прокси который как раз стоит на анрейде? Интересно просто поподробнее этот момент узнать.
И Я ещё сталкивался с таким кейсом. Вот например Мне нужно в докер компоуз конкретному сервису помимо портов указать ещё статический айпи из интерфейса br0, как такое сделать? Я пробовал просто указать что б использовался этот интерфейс. но что бы конкретный айпи, так не получилось.
Так и есть.
1) Не нравятся мне домен от Кинетик, купил домен на рег.ру, 200р на год.
2) В роутере сделал переадресацию 80 и 443 порта на порты Нджинкс, конкретно у меня установлен Nginx Proxy Manager. (тут есть тема про его установку)
3) По поводу br0 в компоузе, это надо смотреть документацию компоуза, я сам не пытался, бридж устраивает.
Бридж то может устраивать, но есть одно большое НО.
Rspamd не видит реального IP входящих из-за бриджа, отсюда вопрос: нет возможности нормально фильтровать входящую почту
Кто-нибудь в курсе как заставить Outlook 2013 взаимодействовать с MailCow? В инете нарыл только что нужно поменять /opt/ mailcow-dockerized/data/web/inc/vars.inc.php ‘userEASforOutlook’ => ‘no’ на ‘userEASforOutlook’ => ‘yes’ Но что-то это не помогло.
А потом вы выставляете этот сервис в инет, и получаете open relay. ПОтому как на дефолтных настройках эта штука разрешает слать через себя письма кому угодно
Полный сток, никаких релеев..все норм.
https://myunraid.ru/wp-content/uploads/2023/01/OpenRelayTEST.png
Не совсем понял, после подкидывания сертификатов из NPM веб-интерфейс почтового сервера так и будет открываться с дописыыанием порта или просто по https пойдет
На unraid 6.11.5 в Community Applications не завезли NerdPack. После установки Compose.Manager из APPS в ответ на команду docker-compose up -d вываливается service «rspamd-mailcow» refers to undefined volume rspamd-vol-1: invalid compose project и ничего не происходит. Я тупенький, с докером вообще первый раз дело имею, прошу подсказать — как победить это безобразие