Настройка почты на своём сервере со своим доменным именем. В качестве почтового сервера используется [Docker Mailserver](https://github.com/docker-mailserver/docker-mailserver) версии 15.1.0. Вебклиент — [Roundcube Webmail](https://github.com/roundcube/roundcubemail) версии 1.6.11.
## Открытие портов для почты
Многие хостинг провайдеры блокируют исходящие соединения на портах 25, 465 и 587, чтобы предотвратить спам или вредоносные рассылки с их серверов. Можно проверить доступность портов с помощью команды `nc`.
```sh
# Выведет "Connection to smtp.gmail.com 25 port [tcp/*] succeeded!",
# если порт открыт
nc -vz smtp.gmail.com 25
nc -vz smtp.gmail.com 465
nc -vz smtp.gmail.com 587
```
Если порты закрыты, то можно обратиться в поддержку хостинг провайдера с запросом на открытие портов.
??? abstract "Пример обращения в поддержку"
```
Добрый день!
Прошу разблокировать исходящие соединения на порты 25/tcp, 465/tcp и 587/tcp
для моего сервера (<IP-адрес сервера>).
Сервер используется для личного почтового домена <домен>, не для массовых рассылок.
Спасибо!
```
## Настройка DNS
Настройка DNS на примере домена `tishenko.dev` (почта `@tishenko.dev`). Более подробное описание всех настроек можно прочитать в документации Docker Mailserver: [[1]](https://docker-mailserver.github.io/docker-mailserver/latest/usage/#minimal-dns-setup) и [[2]](https://docker-mailserver.github.io/docker-mailserver/latest/config/best-practices/dkim_dmarc_spf/).
Со стороны DNS провайдера:
1. Добавляем поддомен для почты, например, `mail.tishenko.dev` и `www.mail.tishenko.dev`. В A-записи поддомена указываем IP-адрес сервера.
2. Добавляем MX-запись для основного домена `tishenko.dev`, именно этот домен будет использоваться для отправки и получения почты `@tishenko.dev`.
```dns
10 mail.tishenko.dev.
```
Обязательно с точкой в конце. Число 10 это приоритет MX-записи, чем меньше число, тем выше приоритет. Приоритет не играет роли, если запись только одна. MX-записи, созданные DNS провайдером, нужно удалить.
3. Добавляем TXT-запись для DMARC. Запись надо создать для домена `_dmarc.tishenko.dev.`.
DMARC-записи, созданные DNS провайдером, нужно удалить.
4. Добавляем TXT-запись для SPF. Запись надо создать для домена `tishenko.dev.`.
```dns
v=spf1 mx -all
```
SPF-записи, созданные DNS провайдером, нужно удалить.
5. Для окончательной настройки нужно также добавить TXT-запись для DKIM. Однако это можно сделать только после настройки почтового сервера и создания пары ключей. Подробнее про настройку DKIM написано [ниже](#настройка-dkim).
Со стороны владельца IP-адреса, как правило это VDS провайдер, создаём или редактируем PTR запись для IP-адреса почтового сервера. Указываем в ней почтовый адрес: `mail.tishenko.dev.`.
??? question "Как проверить настройки DNS?"
Можно использовать [DNS Checker](https://dnschecker.org/) для проверки [A](https://dnschecker.org/#A/mail.tishenko.dev), [MX](https://dnschecker.org/#MX/tishenko.dev), [PTR](https://dnschecker.org/#PTR/146.103.98.219), [DMARC](https://dnschecker.org/#TXT/_dmarc.tishenko.dev) и [SPF](https://dnschecker.org/#TXT/tishenko.dev) записей.
Либо использовать команду `dig`.
```sh
# Команда должна вывести IP-адрес сервера
dig @1.1.1.1 +short A mail.tishenko.dev
# 10 mail.tishenko.dev.
dig @1.1.1.1 +short MX tishenko.dev
# mail.tishenko.dev.
dig @1.1.1.1 +short -x 146.103.98.219
# Проверить DMARC
dig @1.1.1.1 +short TXT _dmarc.tishenko.dev
# Проверить SPF
dig @1.1.1.1 +short TXT tishenko.dev
```
Обновление DNS происходит не мгновенно, обычно это занимает около 20 минут.
??? abstract "Пример файла зоны"
В панели управления DNS провайдера можно выгрузить файл зоны и убедиться, что все записи добавились корректно.
Docker Mailserver (DMS) имеет отличную [документацию](https://docker-mailserver.github.io/docker-mailserver/latest/usage/). И DNS и почтовый сервер можно настроить просто пройдясь по ней. Эта заметка лишь дополняет документацию.
```sh
# Открываем порты для почты (если используется ufw)
sudo ufw allow 25,143,465,587,993/tcp
# Создаём отдельного пользователя для управления почтой
# Пользователь vmail в контейнере DMS по умолчанию имеет uid 5000,
# поэтому желательно, чтобы и на хосте он имел такой же uid
В этой заметке DMS настраивается с антиспамом Rspamd. Как отмечено в [документации](https://docker-mailserver.github.io/docker-mailserver/v15.1/config/security/rspamd/), его планируется использовать по умолчанию в будущих версиях DMS. На той же странице документации перечислены legacy проверки, которые нужно отключить. Тут они также продублированы.
```sh
# Указываем тип SSL сертификатов
SSL_TYPE=letsencrypt
# Включаем Rspamd
ENABLE_RSPAMD=1
# Отключаем legacy проверки, т. к. они уже включены в Rspamd
# Обязательно добавляем alias для адреса postmaster
docker exec -it mailserver setup alias add postmaster@tishenko.dev artem@tishenko.dev
```
### Настройка SSL
В документации DMS есть отдельная [страница](https://docker-mailserver.github.io/docker-mailserver/latest/config/security/ssl/) про настройку SSL сертификатов.
Далее подразумевается, что волюм `/etc/letsencrypt` уже прокинут в контейнер, а также в `mailserver.env` указана переменная `SSL_TYPE=letsencrypt`.
Получаем сертификаты. Команды нужно выполнять от пользователя с правом использовать `sudo`. `certbot` можно установить с помощью [pip](https://certbot.eff.org/instructions?ws=other&os=pip).
```sh
# Порт 80 нужен для получения и обновления сертификатов
sudo ufw allow 80/tcp
# Если на сервере есть nginx или другой веб-сервер, используем соответствующий флаг
В документации DMS есть отдельная [страница](https://docker-mailserver.github.io/docker-mailserver/latest/config/best-practices/dkim_dmarc_spf/) про настройку DKIM, DMARC и SPF. Про настройку DMARC и SPF написано [выше](#настройка-dns), а вот для настройки DKIM нужно сначала сгенерировать пару ключей. Публичный ключ как раз и указывается в DKIM.
Команда для генерации ключей. DMS должен быть запущен.
Теперь добавляем TXT запись для DKIM в DNS. Имя записи должно быть `mail._domainkey.tishenko.dev.`. Проверить запись можно с помощью сайта [DNS Checker](https://dnschecker.org/#TXT/mail._domainkey.tishenko.dev) или команды `dig`.
```sh
# Должна вывести "v=DKIM1; k=rsa; p=<публичный ключ>"
Работоспособность и настройки DMS можно проверить с помощью сайта [Mail-Tester](https://www.mail-tester.com/).
Пример команды для отправки тестового письма.
```sh
docker exec -it mailserver swaks \
--to <адрес с mail-tester> \
--from artem@tishenko.dev \
--server mail.tishenko.dev \
--port 587 \
--tls \
--auth LOGIN \
--auth-user artem@tishenko.dev \
--auth-password 'password'
```
Если письмо дойдёт до тестового адреса, то сайт выведет результаты проверки DNS-записей и общую оценку настройки почтового сервера. Если всё сделано правильно, то оценка будет 10/10.
Дополнительно можно проверить настройки почтового сервера с помощью сайта [MX Toolbox](https://mxtoolbox.com/emailhealth).
### Администрирование
Администрировать DMS можно через скрипт `setup` внутри контейнера. Для этого можно подключиться к контейнеру с помощью команды.
```sh
docker exec -it mailserver bash
# Уже внутри контейнера
setup help
```
Если нужно выполнить всего одну команду, то можно не запускать bash.
```sh
docker exec -it mailserver setup help
```
## Roundcube
Roundcube проще всего развернуть с помощью Docker Compose. Актуальную версию образа можно выбрать на [Docker Hub](https://hub.docker.com/r/roundcube/roundcubemail). Там же можно посмотреть список переменных окружения и их значения. Далее подразумевается, что выбран образ `apache-nonroot`, а также что для управления почтой создан отдельный пользователь `vmail` с uid/gid 5000, как показано в инструкции [выше](#настройка-docker-mailserver).
=== "Терминал"
```sh
# Переключаемся на пользователя vmail
sudo su - vmail
mkdir ./roundcube
cd ./roundcube
# Создаём директории для волюмов Roundcube заранее,
Установить SSL сертификат можно с помощью certbot. Причём если сертификат уже был получен на этапе [настройки DMS](#настройка-ssl), то certbot предложит использовать его.
Некоторые настройки Roundcube нельзя задать через переменные окружения, они задаются в файле `config.inc.php`. Например, "название продукта", оно отображается в заголовке страницы, на странице входа и в других местах. По умолчанию это `Roundcube Webmail`. Его можно изменить в `config/config.inc.php`.
=== "Терминал"
```sh
nano roundcube/config/config.inc.php
```
=== "config.inc.php"
```php
<?php
$config['product_name'] = 'Tish\'s Mail';
```
### Настройки аккаунта
Настройки, относящиеся к конкретному аккаунту, можно задать через UI. Как минимум стоит установить отображаемое имя, иначе у получателей будет отображаться только адрес электронной почты: `Настройки` -> `Профили` -> `Отображаемое имя`. В разделе с профилями также можно указать подпись для писем.
Roundcube позволяет задать несколько профилей и соответствующих адресов для одного аккаунта и легко переключаться между ними через UI. Для этого в DMS нужно создать алиас для основного адреса, а затем добавить профиль через UI Roundcube в разделе `Настройки` -> `Профили`.
```sh
docker exec -it mailserver setup alias add <алиас> <основной адрес>
```
### Внешний вид
Подразумевается, что прокинут волюм `./roundcube/app:/var/www/html`. Чтобы внешние изменения не терялись при перезапуске контейнера, нужно создать свою тему для Roundcube на основе темы по умолчанию и изменять её.
```sh
# Желательно выполнять команды от пользователя vmail,
# чтобы не было проблем с правами
# Либо подключиться к контейнеру через docker exec -it roundcube bash
# и редактировать темы из контейнера
sudo su - vmail
# Переходим в директорию с docker-compose.yml для Roundcube
cd ./roundcube
# В разделе environment добавляем переменную окружения
# ROUNDCUBEMAIL_SKIN=custom
nano docker-compose.yml
# Копируем тему по умолчанию
# Roundcube должен был быть запущен хотя бы один раз,
Для того чтобы у получателей вместо плейсхолдера рядом с именем отправителя отображался логотип, нужно добавить BIMI TXT-запись в DNS для домена `default._bimi.tishenko.dev.`. Нужно будет настроить Nginx или другой веб-сервер, чтобы логотип был доступен по указанному в BIMI адресу.
```dns
v=BIMI1; l=https://tishenko.dev/logo.svg;
```
Однако в gmail и некоторых других почтовых клиентах он всё равно не будет отображаться, так как они требуют для этого платные VMC сертификаты.
Лучше пожертвовать пару гигабайт от объёма диска сервера на SWAP-файл, чтобы уменьшить вероятность того, что в один прекрасный момент сервер крашнется из-за нехватки памяти.
```sh
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
sudo swapon --show
# Чтобы swap-файл подключался при перезагрузке сервера
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
```
Чтобы удалить SWAP-файл, нужно выполнить следующие команды.
```sh
sudo swapoff /swapfile
# Удаляем строку со swap-файлом
sudo nano /etc/fstab
```
## Настройка фаерволла c UFW
## Настройка фаерволла c UFW
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.