Логотип сайта Некоторые мысли и материалы

Установка релея chatmail на домашний сервер

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

Я попробовал несколько различных децентрализованных (и не очень) мессенджеров и к своему сожалению обнаружил, что большинством из них либо довольно затруднительно пользоваться на практике, либо их реализация по той или иной причине мне не понравилась.

Часто в качестве ID пользователя безальтернативно выступает номер телефона, что на мой взгляд как-то ну совсем идёт вразрез с идеями приватного общения. Из того, что действительно понравилось - мессенджер Delta Chat. После некоторых раздумий и изучения принципа связи с использованием этого мессенджера, я всё-таки решил попробовать эту настоящую децентрализацию (или миницентрализацию... не знаю даже, как её назвать).

Как устроена связь

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

Почтовые сервера используются особые: настроенные на именно такой тип связи. Они способны отправлять push-сообщения на устройства пользователя, чтобы обеспечить обмен сообщениями в привычном нам виде, а не в виде долгого обмена электронными письмами. Такие сервера называются chatmail-серверами или релеями. Децентрализация, собственно, как раз состоит в том, что каждый может установить и настроить свой собственный сервер.

Регистрация на сервере анонимная и (упаси боже) не привязанная к номеру телефона. По сути вам выдаётся личный емейл несуразного вида <набор букв>@<домен>, который и является вашим идентификатором. Его, кроме вас, не знает никто. Вас невозможно найти по этому адресу, а если вы хотите с кем-то переписываться, то вам нужно отсканировать QR-коды друг-друга либо отправить ссылку-приглашение через другой канал связи (например, Telegram).

Клиенты, вроде-бы, можно использовать разные, но мы в своем кругу стали использовать Delta Chat. Есть хорошая справка на русском языке для ознакомления, поэтому пересказывать мелкие подробности устройства этого мессенджера не имеет смысла.

По умолчанию Delta Chat предлагает регистрацию на каком-то своём сервере nine.testrun.org, либо выбрать любой другой сервер chatmail. Сервера обычно имеют веб-страницу, на которой есть кнопка, открывающая на вашем телефоне регистрацию в Delta Chat на этом релее, и QR-код, который можно отсканировать в том же Delta Chat для регистрации.

Пример австралийского сервера chatmail
Вот пример сайта австралийского сервера chatmail.

Общение возможно как внутри одного релея, так и между пользователями разных релеев (электронная почта же!).

Также имеются вполне неплохо работающие звонки (необходимо включить debug Call в настройках Delta Chat).

ПО релеев chatmail

В основном, для Delta Chat используются сервера chatmail. Честно говоря, я даже не знаю, можно ли использовать какие-то другие. По идее, можно пользоваться и обычными серверами электронной почты, главное, чтобы вас там не забанили за шифрованные сообщения, а также если смириться с медленной доставкой сообщений на ваш телефон.

Подготовка

Вся документация по установке описана здесь. Вся документация, но не вся информация. Итак, вот что нам потребуется.

  1. Собственный домен example.org с возможностью редактировать DNS-записи.
  2. Статический IP-адрес для вашего домашнего подключения, через который можно будет соединяться с вашим релеем. Точкой подключения обычно выступает роутер, на котором нужно будет настроить проброс необходимых портов на сервер.
  3. Две машины (да, две!) со свежеустановленной Debian 12 (13 не поддерживается!). Одна из них выступает в качестве машины, на которой будет работать почтовый сервер (deployment server), а на второй происходит настройка (build machine). Требования к аппаратному обеспечению сервера довольно скромные: 1 GB оперативной памяти, 10 GB места на диске (спокойно может работать на Raspberry Pi). У меня лично не было двух компьютеров с linux на борту, поэтому в качестве сервера я использовал вот такого красавца:
Домашний сервер
Домашний сервер как он есть.

В качестве локальной машины я использовал свой MacBook, на котором установил Debian 12 для ARM в VirtualBox.

Установка

Подготовка сервера

Установите новую систему Debian 12 без графического интерфейса и настройте ssh-сервер:


#apt install openssh-server rsync
#systemctl start ssh
#systemctl enable ssh 
                

В файле /etc/ssh/sshd_config раскомментируйте и установите параметр PermitRootLogin Yes. Затем выполните:


#systemctl restart ssh
                
Предварительная настройка DNS

Для начала создайте следующие записи (замените имя домена и IP-адреса на свои):


chat.example.org. 3600 IN A 198.51.100.5
chat.example.org. 3600 IN AAAA 2001:db8::5
www.chat.example.org. 3600 IN CNAME chat.example.org
mta-sts.chat.example.org. 3600 IN CNAME chat.example.org.
                

Установочный скрипт обязательно их проверит и прервёт настройку, если этих записей не окажется. Если у вас имеется только статический IP-адрес IPv4, вторую запись можете не прописывать.

Веб-сайт будет находиться на поддомене chat по адресу https://chat.example.org на виртуальном хосте Nginx, так что вы при желании сможете использовать домен example.org для своего основного сайта.

Открытие и проброс портов

На роутере зафиксируйте IP сервера в вашей локальной сети, и настройте на него проброс портов 22, 25, 80, 143, 443, 465, 587, 993, 3478.

Установка

На локальном компьютере установите необходимые пакеты:


#apt install python3-dev python3.11-venv gcc git rsync
                

Затем клонируйте репозиторий chatmail и инициализируйте окружение:


#git clone https://github.com/chatmail/relay
#cd relay
#scripts/initenv.sh
                

Внимательно читаем вывод и если чего-то не хватает, доустанавливаем.

Создаём файл конфигурации сервера chatmail.ini:


#scripts/cmdeploy init chat.example.org
#nano chatmail.ini
                

Открываем этот файл конфигурации и изменяем параметры по своему усмотрению. Все параметры подробно прокомментированы. Лично я изменил следующие параметры:


# Максимальный размер хранилища в МБ
max_storage_size = 20240
# Время хранения сообщений в днях
message_retention_days = 30
# Время неактивности до удаления аккаунта
inactive_user_retention_days = 365
                

Теперь необходимо настроить подключение ssh с локальной машины к серверу по ключу (да, сборка работает только так, а не иначе).

На локальной машине выполните:


#ssh-keygen -t ed25519 -C "chatmail-deploy" -f ~/.ssh/id_ed25519_chatmail
#eval "$(ssh-agent -s)"
#ssh-add ~/.ssh/id_ed25519_chatmail
#ssh-copy-id -i ~/.ssh/id_ed25519_chatmail root@chat.example.org
                

Проверьте доступ:


#ssh root@chat.example.org
                

Теперь запускаем установку и настройку chatmail-сервера:


#ssh root@chat.example.org
                

Будет произведена автоматическая установка и настройка необходимого ПО на сервере. Если что-то идёт не так и процесс прерывается, читаем вывод ошибок, исправляем и запускаем снова. В конце скрипт напишет об успешном окончании установки.

Теперь нам обязательно нужно дополнить уже существующие записи DNS. Для этого запустим скрипт, который выведет список записей, которые необходимо прописать для домена:


#scripts/cmdeploy dns
                

Вывод будет что-то вроде этого:


_mta-sts.chat.******.ru.          TXT "v=STSv1; id=202603*****"
opendkim._domainkey.chat.******.ru. TXT "v=DKIM1;k=rsa;p=MIIBI...

WARNING: these recommended DNS entries are not set:

chat.******.ru.                   TXT "v=spf1 a ~all"
_dmarc.chat.******.ru.            TXT "v=DMARC1;p=reject;adkim...
chat.******.ru.                   CAA 0 issue "letsencrypt...
_adsp._domainkey.chat.******.ru.  TXT "dkim=discardable"
                

Проверим, что все системы релея работают на сервере и проведём тестирование (только дождитесь, пока применятся записи DNS):


#scripts/cmdeploy status
#scripts/cmdeploy test
#scripts/cmdeploy bench
                

На сервере отключаем вход с учетной записью root:


#nano /etc/ssh/sshd_config
PermitRootLogin no
#systemctl restart ssh
                

На роутера отключаем проброс порта 22. Всё, сервер должен работать корректно.

Последующие настройки

Зайдите на сайт своего сервера по адресу https://chat.example.org. Зарегистрируйте свою учетную запись через кнопку или QR-код. Далее вы можете оставить регистрацию открытой, однако лучше закрыть её после того, как зарегистрируются все, кто нужно. Для этого создайте файл


#touch /etc/chatmail-nocreate
                

Когда будет необходимо снова открыть регистрацию, просто удалите этот файл.

Также имеет смысл привести в порядок страницы сайта. Html-файлы хранятся на сервере в директории /var/www/html. Я подумал и решил, что мне не нужна страница privacy, остальные страницы я перевёл на русский язык и немного подправил. Также, поскольку регистрация новых пользователей закрыта, я закомментировал ту часть файла index.html, которая отображает вывод QR-кода и ссылки для регистрации.

Сайт после отключения регистрации
Сайт после отключения регистрации.

Пока всё работает хорошо (и даже звонки), полёт нормальный.