Как сделать собственный мессенджер?

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

Стоит отметить, что сейчас сделать свой мессенджер относительно просто; за последний десяток лет «расплодилось» множество протоколов для децентрализованной коммуникации, в числе которых — Matrix, SMP, и прочие. Ввиду простоты первого именно о нем далее пойдёт речь.

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

  • VPS/VDS с 2GB ОЗУ и 2 vCPU;
  • Доменное имя*;
  • Базовое знание терминала *nix.

Примечание: лучше регистрировать домен у зарубежного регистрара ввиду отсутствия необходимости «показывать паспорт». В дальнейшем на работу сервера это не повлияет.

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

В качестве ОС для сервера мы будем использовать Ubuntu 24.04. Можно и Debian 12, но работа конкретно этого руководства на нем не проверялась.

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

  • Хост: @
  • IP-адрес: IP вашего сервера

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

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

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

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

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

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

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

apt update && apt upgrade

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

reboot

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

apt install python3-full python3-virtualenv nginx certbot

После установки пакетов создайте «среду» для сервера:

mkdir -p ~/synapse
python3.12 -m venv ~/synapse/env

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

source ~/synapse/env/bin/activate

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

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

Установите непосредственно сам сервер Synapse:

pip install matrix-synapse

На данный момент у вас уже есть сервер, но в состоянии «слепого котёнка». Для того, чтобы до него можно было «достучаться», необходимо провести некоторое количество дополнительных конфигурационных работ.

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

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

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

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

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

certbot certonly

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

Для того, чтобы до вашего сервера можно было «достучаться» извне, вам необходимо настроить reverse proxy с использованием 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.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;
    location ~ ^(/_matrix|/_synapse/client) {
        # note: do not add a path (even a single /) after the port in `proxy_pass`,
        # otherwise nginx will canonicalise the URI and cause signature verification
        # errors.
        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;
        # Nginx by default only allows file uploads up to 1M in size
        # Increase client_max_body_size to match max_upload_size defined in homeserver.yaml
        client_max_body_size 50M;
   
    # Synapse responses may be chunked, which is an HTTP/1.1 feature.
    proxy_http_version 1.1;
    }
}

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

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

systemctl reload nginx

Вернитесь в директорию сервера Synapse:

cd ~/synapse

Запустите сервер Synapse:

synctl start

Если вы сделали все правильно, сервер запустится успешно с сообщением started synapse.app.homeserver(homeserver.yaml)

Теперь у вас есть полнофункциональный сервер. Проверить его доступность можно, например, с помощью WEB-клиента Element.

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

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

cd ~/synapse
source ~/synapse/env/bin/activate
synctl start

Зарегистрировать пользователя можно так:

cd ~/synapse
source ~/synapse/env/bin/activate
register_new_matrix_user -c homeserver.yaml

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

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

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

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

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

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