Руководство по созданию собственного мессенджера

В связи с медленно наступающими изменениями государственной политики по отношению к, в частности, мессенджеру Telegram, вопрос о «построении» своей платформы для коммуникации может скоро встать «ребром» для значительной части российского общества.

Стоит отметить, что сейчас сделать свой мессенджер относительно просто; За последний десяток лет появилось множество протоколов для децентрализованной коммуникации, в числе которых — Matrix, SMP, и прочие. Данное руководство рассматривает именно настройку сервера Matrix, конкретнее Matrix-Synapse.

Что потребуется?

  • VPS с 1GB RAM и 1 CPU (если планируете иметь больше 10-ти активных пользователей — 2 GB RAM и 2 CPU);
  • Доменное имя;
  • Базовое знание терминала Unix.

Важно: крайне нежелательно пользоваться услугами российских как и хостинг-провайдеров, так и регистраторов. Из зарубежных интернет-ресурс «Может, вам повезет» может уверенно порекомендовать хостинг-провайдера 1984, который, в том числе предоставляет услуги регистрации доменов.

I. Подготовительные работы

В качестве ОС для сервера мы будем использовать Debian 13 (Trixie), но можно и Debian 12 (Bookworm). Существенной разницы между ними нет.

Откройте панель управления вашего регистрара и зайдите в параметры зон DNS вашего домена. Тут вам необходимо создать запись типа A, которая указывает на IP вашего сервера. «Выглядеть» она должна следующим образом:

  • Хост: @
  • IP-адрес: IP вашего сервера
  • TTL (если доступно): 86400

Обновление записей DNS может занять несколько часов, ввиду чего желательно не «тянуть» с этим пунктом.

II. Настройка сервера

Подключитесь к своему серверу по протоколу Secure Shell:

ssh root@{IP сервера}

Можно заменить непосредственный IP сервера на ваш домен, если вы «подождали» от его настройки достаточное количество времени.

Далее вам покажут отпечаток ключа вашего сервера и попросят ввести пароль. Желательно провести «сверку показаний» с отпечатком, который виден у вашего хостинг-провайдера. Его можно вставить как и напрямую в ssh, так и сверить вручную.

После успешного подключения обновите кэш пакетного менеджера APT и системные пакеты:

apt update && apt upgrade

Скорее всего, вам будет необходимо установить несколько гигабайт обновлений, в числе которых будет, например, новый образ ядра Linux. Чтобы загрузить «обновки» в память, перезагрузите систему:

reboot

Подождите несколько минут и подключитесь по Secure Shell вновь. Далее, создайте отдельного пользователя для сервера Synapse:

useradd -m synapse

Задайте ему пароль (желательно 64-128 символа)

passwd synapse

Установите необходимые для сервера пакеты:

apt install python3-full nginx certbot postgresql coturn pwgen

Создайте случайный пароль на 64 символа:

pwgen -s 64 1 

В дальнейшем этот пароль будет использоваться для доступа к базе данных сервера Synapse. Сохраните его в безопасном месте (например, в базе данных менеджера паролей KeepassXC)

Откройте пользователя Postgres:

su - postgres

Создайте базу данных для Synapse:

createuser --pwprompt synapse_user # задайте созданный ранее пароль
createdb --encoding=UTF8 --locale=C --template=template0 --owner=synapse_user synapse
logout

Закройте пользователя Postgres:

logout

На этом заканчивается базовая настройка сервера. Перейдем к более «детальной» части.

III. Конфигурация

Откройте дополнительное окно Secure Shell и подключитесь к вашему пользователю Synapse:

ssh synapse@{ваш сервер}

Создайте виртуальную среду:

python3 -m venv venv

Переключитесь в свежесозданную среду:

source venv/bin/activate

Обновите пакеты pip и setuptools:

pip install --upgrade pip
pip install --upgrade setuptools

Установите сервер Matrix-Synapse:

pip install matrix-synapse psycopg2-binary

Создайте конфигурационный файл сервера Synapse:

python -m synapse.app.homeserver \
    --server-name kremlinkernel.com \
    --config-path homeserver.yaml \
    --generate-config \
    --report-stats=no


В параметре –server-name замените kremlinkernel.com на ваше доменное имя.

Откройте конфигурационный файл homeserver.yaml:

nano homeserver.yaml

Вам необходимо полностью заменить параметер database на следующий:

database:
  name: psycopg2
  args:
    user: synapse_user
    password: # пароль от базы данных synapse
    dbname: synapse
    host: 127.0.0.1
    cp_min: 5
    cp_max: 10

Вернитесь обратно в пользователя root. Теперь нам необходимо настроить сервер Coturn, который необходим для стабильной интернет-телефонии (VoIP). Создайте для него секретный ключ:

pwgen -s 64 1 # его также необходимо сохранить

Откройте конфигурационный файл сервера:

nano /etc/turnserver.conf

Задайте в нем следующие параметры:

use-auth-secret
static-auth-secret= # ваш секретный ключ
realm=kremlinkernel.com # замените kremlinkernel.com на ваш домен

no-tcp-relay

denied-peer-ip=10.0.0.0-10.255.255.255
denied-peer-ip=192.168.0.0-192.168.255.255
denied-peer-ip=172.16.0.0-172.31.255.255

no-multicast-peers
denied-peer-ip=0.0.0.0-0.255.255.255
denied-peer-ip=100.64.0.0-100.127.255.255
denied-peer-ip=127.0.0.0-127.255.255.255
denied-peer-ip=169.254.0.0-169.254.255.255
denied-peer-ip=192.0.0.0-192.0.0.255
denied-peer-ip=192.0.2.0-192.0.2.255
denied-peer-ip=192.88.99.0-192.88.99.255
denied-peer-ip=198.18.0.0-198.19.255.255
denied-peer-ip=198.51.100.0-198.51.100.255
denied-peer-ip=203.0.113.0-203.0.113.255
denied-peer-ip=240.0.0.0-255.255.255.255
denied-peer-ip=::1
denied-peer-ip=64:ff9b::-64:ff9b::ffff:ffff
denied-peer-ip=::ffff:0.0.0.0-::ffff:255.255.255.255
denied-peer-ip=100::-100::ffff:ffff:ffff:ffff
denied-peer-ip=2001::-2001:1ff:ffff:ffff:ffff:ffff:ffff:ffff
denied-peer-ip=2002::-2002:ffff:ffff:ffff:ffff:ffff:ffff:ffff
denied-peer-ip=fc00::-fdff:ffff:ffff:ffff:ffff:ffff:ffff:ffff
denied-peer-ip=fe80::-febf:ffff:ffff:ffff:ffff:ffff:ffff:ffff

allowed-peer-ip=10.0.0.1
total-quota=1200

Сохраните этот файл и перезапустите сервер coturn:

systemctl restart coturn

Переключитесь на пользователя Synapse. Нам необходимо добавить конфигурацию сервера TURN в homeserver.yaml:

nano homeserver.yaml

Добавьте данные параметры в конец файла:

turn_uris: [ "turn:kremlinkernel.com?transport=udp", "turn:kremlinkernel.com?transport=tcp" ]
turn_shared_secret: # ваш секретный ключ
turn_user_lifetime: 86400000
turn_allow_guests: true

Замените kremlinkernel.com на ваш домен.

Сохраните этот файл и закройте пользователя Synapse. Все необходимые на этом этапе конфигурационные шаги в нем выполнены.

Переключитесь на пользователя root. Для последующего использования шифрования TLS web-сервером nginx необходимо получить сертификаты на ваш домен. Остановите его:

systemctl stop nginx

Запросите сертификаты для вашего домена:

certbot certonly

Если вас попросят выбрать способ подтверждения, выбирайте первый. Далее проблем возникнуть не должно.

Теперь нам необходимо настроить сам web-сервер Nginx. Создайте конфигурационный файл для вашего домена:

cd /etc/nginx/conf.d
nano {доменное имя вашего сайта}.conf

Скопируйте данную конфигурацию в этот файл:

server {
    listen 443 ssl;
    listen [::]:443 ssl;
    # For the federation port
    listen 8448 ssl default_server;
    listen [::]:8448 ssl default_server;
    server_name kremlinkernel.com;
    ssl_certificate /etc/letsencrypt/live/kremlinkernel.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/kremlinkernel.com/privkey.pem;
    ssl_protocols TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;
    location ~ ^(/_matrix|/_synapse/client) {
        proxy_pass http://localhost:8008;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $host:$server_port;
        client_max_body_size 50M;
    proxy_http_version 1.1;
    }
}

Замените kremlinkernel.com на своё доменное имя в параметре server_name и в путях до сертификатов Let’s encrypt.

Перезапустите Nginx:

systemctl restart nginx

IV. Управление

Запустить сервер Synapse из одноименного пользователя можно следующим образом:

source venv/bin/activate
synctl start

Зарегистрировать аккаунт можно так:

source venv/bin/activate
register_new_matrix_user -c homeserver.yaml

Далее вас интерактивно проведут по созданию нового аккаунта.

Стоит отметить, что данное руководство не подразумевает возможности регистрировать аккаунты без непосредственного участия администратора. Открытая регистрация — верный способ превратить ваш сервер в «помойку».

V. Приложения

Для iOS/Android существует клиент Element, которым я и рекомендую пользоваться. Его страницы в магазинах приложений:

Вместо регистрации на matrix.org используйте кнопку «sign in manually», потом «change account provider».

Для настольных компьютеров существует как и клиент Element, так и Nheko.