Решение проблемы

Настройка чат сервера Matrix Synapse и клиента Riot


Для меня остается открытым вопрос использования бесплатного корпоративного чата, не определился с ним. В данной статье хочу рассмотреть установку и настройку бесплатного чат сервера Matrix Synapse и web клиента для него Riot. В целом, проект мне показался интересным и вполне рабочим, но со своими нюансами. Далее постараюсь подробно раскрыть эту тему.

Содержание:

  • 1 Введение
  • 2 Установка Matrix Synapse home server
  • 3 Использование ssl сертификата Let’s Encrypt
  • 4 Установка клиента Riot
  • 5 Настройка matrix synapse сервера
    • 5.1 Создание учетной записи администратора
    • 5.2 Включение свободной регистрации
    • 5.3 Настройка почтовых уведомлений
    • 5.4 Автозагрузка чат сервера со стартом системы
  • 6 Заключение

Введение

Настройка чат сервера Matrix Synapse и клиента Riot

Ранее я рассказывал об установке и настройке корпоративного мессенджера mattermost, раннего форка популярного сейчас slack. В той статье я перечислил актуальные для меня плюсы и минусы этого мессенджера. Мне его довелось увидеть в деле в работе небольшого коллектива. В целом, решение не плохое, но лично мне хотелось больше, чем там есть. В комментариях мне посоветовали обратить внимание на matrix, что я и делаю. Данная статья будет моим знакомством и руководством по установке и начальной настройке. Практического опыта использования matrix у меня нет, так как реальных внедрений еще не делал, но планы есть.

Информация по Matrix Synapse без проблем гуглится, поэтому не буду подробно рассказывать, что это такое. Кратко пройдемся по основному:

  1. Matrix — это открытый протокол для децентрализованной коммуникации. Он может быть реализован в различных серверах и мессенджерах.
  2. Synapse — локальный сервер, который работает на протоколе matrix, обеспечивает возможность подключения и общения клиентов.
  3. Riot — клиент, который может подключаться к любому серверу, работающему по протоколу matrix, в том числе к synapse. Представлен в виде десктропной или web версии, которую можно установить на свой сервер.

Далее мы займемся установкой локальной версии Matrix Synapse для подключения своих клиентов. На этом же сервере разместим веб клиента Riot. Все это дело снабдим ssl сертификатом. В общем, на выходе должны получить готовое бесплатное локальное решение для корпоративного чата.

Сразу хочу предупредить, что мое описание не подходит под готовое руководство, которое позволит простым копипастом все настроить. Это руководство именно по matrix и riot, вы должны как минимум уметь настраивать web сервер с nginx, устанавливать сертификаты, проксировать запросы, если вам это понадобится.

Установка Matrix Synapse home server

Я буду устанавливать чат сервер на CentOS 7. Если у вас еще нет сервера, то смотрите мои статьи по установке и базовой настройке centos.

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

Для работы synapse server необходим Python 2.7, который в CentOS 7 установлен по-умолчанию. Убедиться в этом можно введя в консоли:

# python -V

Python 2.7.5

Сервер чата synapse может использовать различные базы данных. По-умолчанию, он работает с SQLite, что подходит только для теста. В продакшене использовать эту базы плохое решение. Но даже для теста у меня не получилось настроить работу с SQLite. По-умолчанию, в CentOS устанавливается очень старая версия базы. При ее использовании возникает ошибка и сервер не работает. Я обновил базу до последней версии, но как оказалось, с ней тоже возникают проблемы. Я почитал на эту тему обсуждения и понял, что проблема распространенная, а не уникальная, поэтому решил в ней не разбираться. Вместо этого сразу буду использовать postgresql, что является самым надежным и разумным выбором.

С этого и начнем. Установим postgresql на Centos 7. У меня установлена следующая версия системы:

# cat /etc/redhat-release 

CentOS Linux release 7.4.1708 (Core)

Устанавливаю соответствующий моей версии репозиторий:

# rpm -Uvh https://download.postgresql.org/pub/repos/yum/10/redhat/rhel-7.4-x86_64/pgdg-centos10-10-2.noarch.rpm

Ставим самую свежую на момент написания статьи версию postgresql:

# yum install postgresql10-server postgresql10-contrib

Инициализируем базу данных:

# /usr/pgsql-10/bin/postgresql-10-setup initdb

Редактируем конфигурационный файл для включения MD5 аутентификации.

# mcedit /var/lib/pgsql/10/data/pg_hba.conf

Меняем строки в самом конце:

host all all 127.0.0.1/32 ident

host all all ::1/128 ident

на

host all all 127.0.0.1/32 md5

host all all ::1/128 md5

Запускаем PostgreSQL и добавляем в автозагрузку:

# systemctl start postgresql-10

# systemctl enable postgresql-10

Заходим в систему под пользователем postgres:

# su - postgres

Создаем пользователя базы данных:

$ createuser synapse

Запускаем консольный клиент для работы с базой данных:

$ psql

Задаем пароль userpass для только что созданного пользователя:

# ALTER USER synapse WITH ENCRYPTED password 'userpass';

Создаем базу данных для чат сервера matrix synapse:

# CREATE DATABASE synapse ENCODING 'UTF8' LC_COLLATE='C' LC_CTYPE='C' template=template0 OWNER synapse;

Выходим из консоли управления и учетной записи postgres.

# q

# exit

Установим еще несколько пакетов, необходимых для взаимодействия synapse с postgresql.

# yum install postgresql-devel libpqxx-devel.x86_64

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

# yum install libtiff-devel libjpeg-devel libzip-devel freetype-devel lcms2-devel libwebp-devel tcl-devel tk-devel redhat-rpm-config python-virtualenv libffi-devel openssl-devel

# yum groupinstall "Development tools"

Устанавливаем менеджер пакетов Python — pip.

# wget https://bootstrap.pypa.io/get-pip.py

# python get-pip.py

Создаем виртуальную среду для приложения synapse. Она используется для изоляции отдельного python проекта. Проект будет использовать свои собственные директории и библиотеки, без взаимодействия с глобальным окружением.

# virtualenv -p python2.7 ~/.synapse

# source ~/.synapse/bin/activate

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

# pip install --upgrade pip virtualenv six packaging appdirs psycopg2

Обновляем setuptools:

# pip install --upgrade setuptools

Устанавливаем сам сервер matrix synapse.

# pip install https://github.com/matrix-org/synapse/tarball/master

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

# cd ~/.synapse

# python -m synapse.app.homeserver --server-name chat.serveradmin.ru --config-path homeserver.yaml --generate-config --report-stats=yes

Я использую доменное имя для своего чат сервера chat.serveradmin.ru. Обращаю внимание на этот параметр. Он важен, если вы захотите использовать полноценный ssl сертификат и https подключения. Используйте реальное доменное имя, на которое потом будете получать сертификат. После выполнения команды вы получите примерно такой вывод:

Создание конфигурации для synapse сервера

A config file has been generated in 'homeserver.yaml' for server name 'chat.serveradmin.ru' with corresponding SSL keys and self-signed certificates. Please review this file and customise it to your needs.

If this server name is incorrect, you will need to regenerate the SSL certificates

По умолчанию, в файле конфигурации homeserver.yaml будет указано использовать базу данных SQLite. Комментируем строки, отвечающие за эту настройку и добавляем параметры для подключения созданной ранее postgresql базы.

#database:

# The database engine name
#name: "sqlite3"
# Arguments to pass to the engine
#args:
# Path to the database
#database: "/root/.synapse/homeserver.db"
database:
name: psycopg2
args:
user: synapse
password: userpass
database: synapse
host: localhost
cp_min: 5
cp_max: 10
Обращаю внимание на отступы в файле конфигурации. Они принципиально важны. Должно быть именно так, как показано — database без отступа, name, args один пробел с начала строки. Все остальное — два пробела.

На этом установка сервера закончена, двигаемся дальше.

Использование ssl сертификата Let’s Encrypt

Настройка чат сервера Matrix Synapse и клиента Riot

Прежде чем начать настройку сервера, установим на него полноценный ssl сертификат. Если вам это не нужно, можно пропустить данный пункт. Просто посмотреть на чат можно и с самописным сертификатом, который мы получили ранее. Но есть один нюанс. Клиент Riot, который я буду использовать для подключения к серверу, не будет работать с самописным сертификатом. Он будет ругаться на него во время подключения. Так что если вы хотите полноценно протестировать работу мессенджера Riot в связке с matrix synapse, придется установить нормальный сертификат.

Мой сервер с чатом напрямую не смотрит в интернет. Я буду проксировать все подключения к нему через web сервер, на котором установлен nginx. Поэтому получение сертификата нужно выполнять именно на нем. Если у вас matrix сервер будет смотреть напрямую в интернет, то настраивать получение ssl сертификата надо именно на нем.

Прежде чем получить сертификат, нарисовал примерно такой конфиг виртуального домена для nginx.

server {

listen 80;
server_name chat.serveradmin.ru;
location /.well-known {
root /web/sites/chat.serveradmin.ru/www/;
}
}

Подробно про получение сертификатов Let’s Encrypt я рассказывал в статье по настройке веб сервера. За всеми подробностями можете заглянуть туда. Здесь же без подробных пояснений выполняем необходимые действия.

Устанавливаем certbot.

# yum install certbot

Запускаем запрос сертификата.

# certbot certonly

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

2: Place files in webroot directory (webroot)

Далее указываю имя домена:

Please enter in your domain name(s) (comma and/or space separated) (Enter 'c' to cancel): chat.serveradmin.ru

Указываю директорию веб сервера:

Input the webroot for chat.serveradmin.ru: (Enter 'c' to cancel): /web/sites/chat.serveradmin.ru/www

Сертификат получил. Дальше рисую следующий конфиг для виртуального хоста nginx уже для работы по https.

upstream matrix {

server 77.37.225.129:22991;
}
server {
listen 80;
server_name chat.serveradmin.ru;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name chat.serveradmin.ru;
ssl on;
ssl_certificate /etc/letsencrypt/live/chat.serveradmin.ru/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/chat.serveradmin.ru/privkey.pem;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
location /.well-known {
root /web/sites/chat.serveradmin.ru/www/;
}
location / {
client_max_body_size 50M;
proxy_set_header Connection "";
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Frame-Options SAMEORIGIN;
proxy_pass http://matrix;
}
}

На сервере 77.37.225.129 сделан проброс внешнего порта 22991 на локальный 8008. На этом порту работает synapse по незащищенному соединению. Редиректить надо именно на этот порт, так как если сделать переадресацию на защищенный порт, который работает со своим сертификатом, будут проблемы при совместной работе этого локального сертификата и внешнего от Let’s Encrypt.

С сертификатом и самим сервером synapse разобрались. Дальше я предлагаю сначала установить и настроить бесплатный web клиент для чата — Riot. Если он вам не нужен, можно сразу переходить к настройке самого сервера.

Установка клиента Riot

Вам не обязательно устанавливать собственную версию веб клиента riot. Вы можете использовать публичный web клиент https://riot.im/app/, и с его помощью подключаться к своему серверу. Для этого надо указать адрес своего сервера во время подключения.

Установка web клиента Riot

Чтобы подключиться через riot, у вас обязательно должно быть настроено подключение по https. По обычному протоколу подключиться не получится, будет ошибка.

Can't connect to homeserver - please check your connectivity and ensure your homeserver's SSL certificate is trusted.

или вот такая:

Can't connect; check your SSL settings and trust the server

Я и так и сяк пробовал, но оказалось проще и быстрее сделать ssl сертификат от Let’s Encrypt, чем разбираться с ошибками. В общем, получайте сертификат любым удобным для вас способом.

Для того, чтобы установить собственный web клиент riot достаточно скачать его исходники и разместить их на веб сервере. Последнюю версию можно скачать отсюда — https://github.com/vector-im/riot-web/releases. Далее я использую свежую версию на момент написания статьи.

# wget https://github.com/vector-im/riot-web/releases/download/v0.13.3/riot-v0.13.3.tar.gz

# tar -xzvf riot-v0.13.3.tar.gz

Дальше копируем содержимое распакованной директории в корневую папку веб сервера для домена, который вы назначили. В моем примере это /web/sites/riot.serveradmin.ru/www/.

Рисуем примерно такой конфиг для публикации riot в web.

# cat /etc/nginx/conf.d/riot.conf
server {

listen 80;
server_name riot.serveradmin.ru;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name riot.serveradmin.ru;
root /web/sites/riot.serveradmin.ru/www/;
index index.php index.html index.htm;
access_log /web/sites/riot.serveradmin.ru/log/access.log main;
error_log /web/sites/riot.serveradmin.ru/log/error.log;
ssl on;
ssl_certificate /etc/letsencrypt/live/riot.serveradmin.ru/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/riot.serveradmin.ru/privkey.pem;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
location /.well-known {
root /web/sites/riot.serveradmin.ru/www/;
}
}

Перечитываем конфиг nginx и можно заходить по указанному веб адресу для использования своего клиента riot. В директории с клиентом есть конфигурационный файл config.sample.json. Переименуйте его в config.json и измените параметр сервера подключения по-умолчанию. Укажите свой.

"default_hs_url": "https://chat.serveradmin.ru",

Этого достаточно для использования своего собственного веб клиента riot по настроенному адресу.

Настройка matrix synapse сервера

Настройка чат сервера Matrix Synapse и клиента Riot

Запускаем установленный сервер.

# source ~/.synapse/bin/activate

# synctl start

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

Запуск matrix synapse сервера

Проверим, на каких портах запустилась служба чата.

# netstat -tulnp | grep python

tcp 0 0 0.0.0.0:8448 0.0.0.0:* LISTEN 26827/python2.7
tcp 0 0 0.0.0.0:8008 0.0.0.0:* LISTEN 26827/python2.7

Порт 8448 для шифрованных соединений, 8008 для обычных.

Создание учетной записи администратора

Создадим первую учетную запись администратора.

# register_new_matrix_user -c homeserver.yaml http://localhost:8008

New user localpart [root]: admin
Password:
Confirm password:
Make admin [no]: yes
Sending registration request...
Success.

Теперь можно пройти по адресу https://chat.serveradmin.ru и залогиниться в систему под созданным пользователем администратора.

Вход в чат matrix

Если вы не настраивали проксирование через nginx, то можно зайти напрямую на сервер с чатом по его ip адресу — http://192.168.13.31:8008 В моем случае я вижу ту же самую страницу.

В веб интерфейсе нет практически никаких настроек. Вы можете только создать нужные комнаты и изменить некоторые настройки пользователя. Так же вы можете заходить и общаться в чатах, но стандартный серверный интерфейс для этого беден и неинтересен. Позже мы подключимся к серверу более удобным клиентом Riot, а пока изменим некоторые настройки сервера.

Включение свободной регистрации

Первым делом вам надо решить, будет ли у вас открыта свободная регистрация пользователей, или вы будете каждого создавать вручную. За это отвечает параметр в файле конфигураций homeserver.yaml

enable_registration: True

Я разрешил свободную регистрацию в своем примере. По-умолчанию она запрещена. Если у вас будет публичный чат-сервер, то обязательно надо настроить каптчу. В synapse уже интегрирована гугловская reCAPTCHA. Чтобы она заработала, вам надо зарегистрировать свой сайт в гугле — https://developers.google.com/recaptcha/, затем указать следующие параметры в конфиге:

recaptcha_public_key: PUBLIC_KEY

recaptcha_private_key: PRIVATE_KEY
enable_registration_captcha: true

Public и Private ключи вы получаете после регистрации каптчи для вашего доменного имени в гугле.

reCAPTCHA для регистрации в matrix

Настройка почтовых уведомлений

Сервер корпоративного чата synapse matrix умеет отправлять почтовые уведомления на различные события. Настройка этих событий выполняется в пользовательских настройках. Но чтобы сервер мог отправлять оповещения, их надо настроить в конфигурации самого сервера. Для этого в конфиге рисуем такие параметры для отправки почты через локальный сервер.

email:

enable_notifs: true
smtp_host: "localhost"
smtp_port: 25
notif_from: "Your Friendly %(app)s Home Server <chat@serveradmin.ru>"
app_name: Matrix
template_dir: res/templates
notif_template_html: notif_mail.html
notif_template_text: notif_mail.txt
notif_for_new_users: True
riot_base_url: "https://riot.serveradmin.ru"

Перезапускаем сервер и проверяем.

# source ~/.synapse/bin/activate

# synctl restart

Я сразу же получил ошибку на тему того, что файл notif_mail.html не найден. Долго разбирался, в чем может быть проблема. Потом все-таки понял, когда скачал вручную полные исходники сервера из github, что у меня не хватает директории res/templates. Похоже, их просто забыли положить в сборку, которая качается через pip. Так что вам нужно будет сделать то же самое, если этот баг не пофиксят к тому моменту, как вы будете пробовать настраивать свой сервер чата. Я поступил вот так:

# cd /usr/src

# git clone https://github.com/matrix-org/synapse
# mv /usr/src/synapse/res ~/.synapse

После этого еще раз перезапускайте сервер и проверяйте.

Я очень много времени потратил на отладку оповещений. Так и не понял, как их внятно настроить и когда они будут срабатывать. Вроде в профиле все включаю, ухожу юзером в офлайн, шлю ему в чат письмо. Иногда оповещение приходит через 10 минут, иногда нет. Где настраивается этот интервал в 10 минут — не понял. Вроде в основном конфиге есть некоторые намеки на этот интервал, но явно не указано, что он влияет на время, через которое будет отправлено оповещение на почту. По логике, его бы надо сразу отправлять, если пользователя нет, а не ждать 10 минут.

Наверно есть какой-то механизм аккумулирования оповещений, возможно у него какая то своя логика, которую я не понял, поэтому мне не до конца ясно, как работают оповещения. Шаблон самих сообщений по-умолчанию очень корявый, по нему толком не понятно, где и в каком чате произошло событие. Вот пример:

Почтовое уведомление от чата matrix syanpse

Я кое-как восстановил последовательность событий по сообщениям в чатах, но в целом все не очевидно. Этот момент можно самому доработать, шаблоны можно настраивать. Но это нужно разбираться и тратить время. В этом моменте продукт явно не готов в текущем виде к продуктовому использованию.

Так же у меня не получилось настроить оповещения через внешние почтовые сервисы. В частности, пробовал через ящик на Яндексе, но мне ничего не приходило. То ли проблема с почтовыми настройками, то ли с самими оповещениями, не разобрался. Дебажить эти моменты неудобно. Лог самого сервера завален спамовыми запросами от web клиентов. В общем, тема неоднозначная и неочевидная. Документации по ней нету. Разобраться, в принципе, можно, по идее то работает, но надо тратить время.

Автозагрузка чат сервера со стартом системы

Из коробки никакое решение для автостарта сервиса после загрузки системы не предлагается, если вы используете систему centos. Для debian есть готовый пакет, который можно просто установить в систему через apt. В комплекте будет конфиг для systemd. У нас же сервер запускается из домашней директории root в virtualenv, что не очень удобно для настройки автозагрузки. Но все решаемо. Рисуем такой конфиг для systemd по следующему пути — /etc/systemd/system/synapse.service.

[Unit]

Description=Synapse Matrix homeserver
[Service]
Type=simple
User=root
Group=root
WorkingDirectory=/root/.synapse
ExecStart=/root/.synapse/bin/python -B -u -m synapse.app.homeserver -c /root/.synapse/homeserver.yaml
ExecStop=/root/.synapse/bin/synctl stop /root/.synapse/homeserver.yaml
[Install]
WantedBy=multi-user.target

Вообще, не очень правильно, что у нас сервер работает от root. Но так как у меня это тест, я не стал заморачиваться и создавать отдельного юзера и делать все под ним. Да и вспомнил об этом только в самом конце, когда этот конфиг рисовал. Добавляем сервер в автозагрузку и запускаем:

# systemctl enable synapse

# systemctl start synapse

Проверим, все ли в порядке.

# systemctl status synapse

Запуск сервера чата как службы через systemd

Не очень удобно, что сервер будет дублировать свои логи в системный лог /var/log/messages, но это уже мелочи. Если реально будет мешать, можно это дело поправить.

Заключение

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

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

Плюсы:

  • Обширный бесплатный функционал.
  • Свой локальный сервер
  • Гибкие настройки email оповещений. Хоть и не очень понятные настройки, но думаю, если разобраться, будет в итоге работать.
  • Контроль набора текста и прочтения сообщения. Вы видите, когда пользователь прочтет отправленное ему сообщение. Это важный и удобный функционал. Тот же mattermost или rocket.chat не предлагают этого в бесплатной версии.
  • Хороший выбор клиентов. Тот же riot есть как приложение для десктопа, для смартфона и web версия через браузер.
  • Звонки между клиентами. Никаких настроек не надо, работают сразу.

Минусы:

  • Много багов, с которыми сталкиваешься сразу же во время установки. Забыть положить файлы с шаблонами в дистрибутив и не исправить это. Мне не понятен такой подход.
  • Нету документации, кроме небольшой справки на github.
  • Очень много вопросов на гитхабе, в основном с ошибками. Пропадают сообщения, комнаты, юзеры, кого-то куда-то не пускает и т.д. Думаю со всем этим придется столкнутся после масштабного внедрения.
  • Мало информации в интернете. В русскоязычном интернете вообще ничего, кроме нескольких упоминаний, все только в англоязычном сегменте, да и то в основном краткие руководства по установке. Даже по настройке ничего не нашел, разбирался во всем сам.

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

Не понравилась статья и хочешь научить меня администрировать? Пожалуйста, я люблю учиться. Комментарии в твоем распоряжении. Расскажи, как сделать правильно!

СМОТРИ ТАКЖЕ