Перейти к содержанию

RAMBA Matrix

Материал из RAMBA Wiki
RAMBA Matrix

Корпоративный мессенджер RAMBA ART на базе открытого протокола Matrix

RAMBA Matrix — собственная коммуникационная платформа RAMBA ART на базе открытого протокола Matrix.

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

Основная задача проекта — получить независимый корпоративный мессенджер, полностью размещённый на собственной инфраструктуре.

Назначение проекта

RAMBA Matrix создавался как собственная альтернатива внешним корпоративным мессенджерам.

Основные требования:

  • собственный сервер сообщений;
  • хранение данных на инфраструктуре RAMBA ART;
  • Android и iOS;
  • веб-клиент;
  • сквозное шифрование;
  • личные и групповые комнаты;
  • аудио- и видеозвонки;
  • собственные Matrix ID;
  • закрытая регистрация;
  • возможность резервного копирования;
  • возможность дальнейшего масштабирования;
  • ориентация примерно на 1000 зарегистрированных пользователей.

Matrix ID пользователей имеют вид:

@username:ramba-art.ru

Например:

@ivan_ivanov:ramba-art.ru

Архитектура RAMBA Matrix

Общая схема:

                         INTERNET
                            │
                            │ HTTPS
                            ▼
                  ┌──────────────────┐
                  │     BrainyCP     │
                  │      Nginx       │
                  │  Reverse Proxy   │
                  │       SSL        │
                  └────────┬─────────┘
                           │
                           │ HTTP
                           ▼
                ┌─────────────────────┐
                │      ramba-chat     │
                │                     │
                │      Dendrite       │
                │     PostgreSQL      │
                │       Coturn        │
                └─────────┬───────────┘
                          │
                          │
                ┌─────────┴───────────┐
                │                     │
                ▼                     ▼
           Media Store          TURN Relay
                │
                ▼
              OMV/NFS

Публичный веб-клиент Element работает отдельно и подключается к Matrix homeserver через HTTPS.

Домены

Назначение Адрес
Matrix Server Name ramba-art.ru
Homeserver chat.ramba-art.ru
Element Web element.ramba-art.ru

При этом серверное имя Matrix остаётся:

ramba-art.ru

Благодаря этому пользовательские ID не содержат технический поддомен `chat`.

Компоненты системы

Компонент Назначение
Dendrite Matrix homeserver
PostgreSQL Основная база данных
Element Web Веб-клиент Matrix
Element Mobile Клиенты Android и iOS
Coturn STUN/TURN для WebRTC
BrainyCP / Nginx Reverse proxy и SSL
OMV / NFS Хранилище медиафайлов
Proxmox VE Виртуализация и резервное копирование VM

Почему выбран Matrix

Matrix — открытый федеративный протокол для обмена сообщениями в реальном времени.

Основные преимущества:

  • открытая спецификация;
  • отсутствие привязки к одному поставщику;
  • собственный сервер;
  • собственный домен;
  • поддержка E2EE;
  • федерация;
  • множество клиентских приложений;
  • интеграции и боты;
  • возможность работы полностью на собственной инфраструктуре.

Недостатки:

  • инфраструктура сложнее обычного SaaS-мессенджера;
  • необходимо обслуживать серверную часть;
  • требуется отдельная настройка TURN для звонков;
  • необходимо резервировать БД и media store;
  • клиенты Matrix требуют корректного управления ключами шифрования.

Почему Dendrite

В качестве Matrix homeserver используется Dendrite.

Dendrite написан на Go и может работать в компактной монолитной конфигурации.

Для RAMBA ART это позволило разместить Matrix homeserver на одной виртуальной машине без большого количества отдельных сервисов.

Преимущества:

  • компактная архитектура;
  • написан на Go;
  • сравнительно небольшое потребление ресурсов;
  • поддержка PostgreSQL;
  • поддержка Matrix Client API;
  • федерация;
  • E2EE;
  • media API;
  • интеграция с TURN.

Особенность выбранной архитектуры — Dendrite работает как единый монолитный процесс.

PostgreSQL

PostgreSQL используется для постоянного хранения данных Matrix.

В базе находятся:

  • события комнат;
  • пользователи;
  • состояния комнат;
  • устройства;
  • ключи;
  • данные федерации;
  • служебные данные homeserver.

PostgreSQL должен размещаться на локальном быстром диске VM.

Dendrite
    │
    ▼
PostgreSQL
    │
    ▼
Local SSD / VM Disk

Размещать активную БД PostgreSQL на NFS не рекомендуется.

Element

Element используется как основной клиент RAMBA Matrix.

Поддерживаются:

  • Element Web;
  • Element для Android;
  • Element для iOS;
  • desktop-клиенты.

Веб-клиент доступен через:

https://element.ramba-art.ru

Он заранее настроен на homeserver:

https://chat.ramba-art.ru

Поэтому обычному пользователю не требуется вручную указывать сервер.

Reverse Proxy

Публичный HTTPS-трафик проходит через BrainyCP.

Схема:

Client
  │
  │ HTTPS
  ▼
BrainyCP / Nginx
  │
  │ proxy_pass
  ▼
Dendrite

Это позволяет:

  • централизованно управлять SSL;
  • не публиковать Dendrite напрямую;
  • использовать единый внешний веб-уровень;
  • независимо переносить backend между VM или узлами Proxmox.

Основные proxy-заголовки:

proxy_set_header Host $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 https;

После изменения конфигурации Nginx:

nginx -t
systemctl reload nginx

Matrix .well-known

Чтобы пользователи имели ID:

@user:ramba-art.ru

а физический homeserver находился на `chat.ramba-art.ru`, используется Matrix delegation.

Server discovery

Адрес:

https://ramba-art.ru/.well-known/matrix/server

Ответ:

{
  "m.server": "chat.ramba-art.ru:443"
}

Client discovery

Адрес:

https://ramba-art.ru/.well-known/matrix/client

Ответ:

{
  "m.homeserver": {
    "base_url": "https://chat.ramba-art.ru"
  }
}

Проверка:

curl -s https://ramba-art.ru/.well-known/matrix/server
curl -s https://ramba-art.ru/.well-known/matrix/client

Проверка Matrix API

Основная проверка homeserver:

curl -s \
https://chat.ramba-art.ru/_matrix/client/versions

При исправной конфигурации сервер возвращает JSON со списком поддерживаемых версий Matrix Client API.

Dendrite

Рабочая конфигурация находится в:

/opt/dendrite/dendrite.yaml

Основные файлы:

/opt/dendrite/
├── dendrite
├── dendrite.yaml
├── matrix_key.pem
└── media/

Ключевой параметр:

global:
  server_name: ramba-art.ru

`server_name` после ввода системы в эксплуатацию менять не следует.

Он является частью Matrix ID пользователей и идентичности homeserver.

Systemd

Dendrite запускается как системная служба.

Управление:

systemctl start dendrite
systemctl stop dendrite
systemctl restart dendrite
systemctl status dendrite

Просмотр журнала:

journalctl -u dendrite -f

Последние записи:

journalctl -u dendrite -n 100 --no-pager

Регистрация пользователей

RAMBA Matrix работает как закрытая корпоративная система.

Публичная регистрация пользователей отключена.

Пользовательские записи создаются администратором.

Общая схема:

Администратор
      │
      ▼
Создание аккаунта
      │
      ▼
@username:ramba-art.ru
      │
      ▼
Первый вход пользователя

Такой вариант позволяет контролировать доступ к системе и предотвращает автоматическую регистрацию посторонних пользователей.

Сквозное шифрование

Matrix поддерживает End-to-End Encryption.

В зашифрованной комнате сообщение шифруется на клиенте отправителя и расшифровывается на устройстве получателя.

Упрощённая схема:

Client A
   │
   │ encrypted event
   ▼
Matrix Server
   │
   │ encrypted event
   ▼
Client B

Homeserver хранит зашифрованное содержимое и не должен обладать ключами для расшифровки сообщений пользователей.

Для пользователей особенно важно настроить восстановление ключей и не терять данные безопасного хранилища.

Media Store

Matrix хранит загружаемые изображения, документы, видео и другие вложения отдельно от основной PostgreSQL БД.

Для RAMBA Matrix media store вынесен на отдельное хранилище.

Схема:

Dendrite VM
     │
     ▼
Media directory
     │
     ▼
NFS
     │
     ▼
OMV Storage

Это позволяет не увеличивать системный диск VM по мере роста количества вложений.

PostgreSQL при этом остаётся на локальном диске.

Права на NFS

При использовании NFS необходимо обеспечить правильные UID/GID пользователя, под которым работает Dendrite.

После монтирования следует проверить:

mount | grep matrix
ls -ld /matrix-media

И тест записи:

touch /matrix-media/test
rm /matrix-media/test

Тест необходимо выполнять от имени пользователя Dendrite.

Coturn

Coturn используется для STUN/TURN и обеспечивает работу звонков в сложных NAT-сценариях.

Без TURN два клиента могут успешно обмениваться сообщениями, но не иметь возможности установить аудио- или видеосоединение.

Архитектура звонка:

Element A
    │
    │ WebRTC
    ▼
STUN / TURN
    │
    ▼
 Coturn
    │
    │ Relay
    ▼
Element B

TURN-порты

В инфраструктуре используется ограниченный диапазон relay-портов:

Порт Протокол Назначение
3478 TCP / UDP STUN / TURN
5349 TCP TURN over TLS
49152–49252 UDP TURN Relay

Этот диапазон должен быть разрешён firewall и корректно проброшен через NAT.

Пример конфигурации Coturn

listening-port=3478
tls-listening-port=5349

use-auth-secret
realm=ramba-art.ru

fingerprint
lt-cred-mech

min-port=49152
max-port=49252

no-multicast-peers
no-cli

Также должны быть корректно настроены:

listening-ip=
relay-ip=
external-ip=

Конкретные значения зависят от текущей сетевой архитектуры.

TURN в Dendrite

В конфигурации Dendrite указываются URI TURN-сервера:

client_api:
  turn:
    turn_user_lifetime: "5m"

    turn_uris:
      - "turn:turn.ramba-art.ru:3478?transport=udp"
      - "turn:turn.ramba-art.ru:3478?transport=tcp"
      - "turns:turn.ramba-art.ru:5349?transport=tcp"

    turn_shared_secret: "SECRET"

`turn_shared_secret` должен совпадать с `static-auth-secret` Coturn.

Секреты не следует публиковать в Wiki.

Проверка TURN

Проверка выдачи временных TURN credentials:

curl -s \
https://chat.ramba-art.ru/_matrix/client/v3/voip/turnServer

В рабочем состоянии сервер возвращает:

  • username;
  • password;
  • TTL;
  • список TURN URI.

Тестирование звонков

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

Желательно:

  • одно устройство через Wi-Fi;
  • второе через мобильную сеть.

Это заставляет WebRTC проходить через реальные NAT-сценарии.

Проверяем:

  1. текстовые сообщения;
  2. зашифрованный личный чат;
  3. аудиозвонок;
  4. видеозвонок;
  5. входящий вызов;
  6. работу после переключения сети.

Успешный звонок через разные сети подтверждает работу:

Element
   +
Dendrite
   +
WebRTC
   +
STUN
   +
TURN
   +
NAT
   +
Firewall

Element Web

Element Web работает на отдельном домене:

https://element.ramba-art.ru

Пример основных параметров `config.json`:

{
  "default_server_config": {
    "m.homeserver": {
      "base_url": "https://chat.ramba-art.ru",
      "server_name": "ramba-art.ru"
    }
  },

  "disable_custom_urls": true,
  "disable_guests": true,
  "brand": "RAMBA Chat",
  "default_theme": "dark"
}

Благодаря этому пользователю достаточно открыть Element и войти под своим RAMBA Matrix аккаунтом.

Мобильные клиенты

На мобильных устройствах используются Matrix-совместимые клиенты.

Для подключения используется homeserver:

https://chat.ramba-art.ru

Либо автоматическое обнаружение через:

ramba-art.ru

После входа рекомендуется сразу настроить:

  • подтверждение устройства;
  • безопасное хранилище;
  • восстановление ключей;
  • PIN/Face ID клиента;
  • push-уведомления.

Федерация

Matrix поддерживает обмен событиями между независимыми homeserver.

Для федерации используется server name:

ramba-art.ru

и delegation на:

chat.ramba-art.ru

Базовая проверка:

curl -s \
https://ramba-art.ru/.well-known/matrix/server

При проблемах с федерацией необходимо проверять:

  • DNS;
  • TLS;
  • `.well-known`;
  • доступность `chat.ramba-art.ru`;
  • Nginx;
  • журнал Dendrite.

Резервное копирование

Matrix нельзя считать защищённым только потому, что существует snapshot VM.

Необходимо резервировать отдельно:

Компонент Требуется backup
PostgreSQL Да
dendrite.yaml Да
matrix_key.pem Обязательно
Media Store Да
Coturn config Да
Element config.json Да
BrainyCP / Nginx vhost Да

Особенно критичен:

matrix_key.pem

Это identity key Matrix homeserver. Его потеря может привести к серьёзным проблемам с федерацией и идентичностью сервера.

PostgreSQL backup

Пример:

sudo -u postgres \
pg_dump dendrite \
> /root/dendrite-$(date +%F).sql

Проверяем:

ls -lh /root/dendrite-*.sql

Для production рекомендуется автоматизировать резервное копирование и периодически тестировать восстановление.

Backup конфигурации

Пример:

tar -czf /root/ramba-matrix-config-$(date +%F).tar.gz \
    /opt/dendrite/dendrite.yaml \
    /opt/dendrite/matrix_key.pem \
    /etc/turnserver.conf \
    /etc/systemd/system/dendrite.service

Файл с `matrix_key.pem` должен храниться в защищённом месте.

Proxmox Backup

Виртуальная машина RAMBA Matrix также резервируется средствами Proxmox.

Схема:

RAMBA Matrix VM
      │
      ▼
Proxmox VE
      │
      ▼
Proxmox Backup Server

Backup VM полезен для быстрого полного восстановления, но не заменяет логический dump PostgreSQL.

Мониторинг

Минимальный набор проверок:

Dendrite

systemctl status dendrite

PostgreSQL

systemctl status postgresql

Coturn

systemctl status coturn

Matrix API

curl -s \
https://chat.ramba-art.ru/_matrix/client/versions

TURN

curl -s \
https://chat.ramba-art.ru/_matrix/client/v3/voip/turnServer

Media storage

df -h
mount | grep matrix

Диагностика

Dendrite не запускается

systemctl status dendrite
journalctl -u dendrite -n 100 --no-pager

Matrix API недоступен

Проверяем цепочку:

Client
  │
  ▼
DNS
  │
  ▼
BrainyCP
  │
  ▼
Nginx
  │
  ▼
Dendrite

Проверяем внешний адрес:

curl -Iv https://chat.ramba-art.ru/

И backend непосредственно из LAN:

curl -I http://MATRIX_BACKEND_IP:8008/

Звонок соединяется без аудио

В первую очередь проверяем:

  • Coturn;
  • relay UDP range;
  • NAT;
  • `external-ip`;
  • firewall;
  • TURN credentials.

Проверяем:

ss -tulpn | grep turnserver

Не загружаются медиа

Проверяем:

mount | grep matrix
df -h
ls -ld /matrix-media

Также необходимо проверить права пользователя Dendrite на NFS.

Производительность

Основная нагрузка Matrix распределяется между:

CPU
 │
 ├── Dendrite
 ├── PostgreSQL
 └── Federation

RAM
 │
 ├── Dendrite
 └── PostgreSQL

Disk
 │
 ├── PostgreSQL
 └── Media

Network
 │
 ├── Federation
 ├── Media
 └── TURN

Для небольшого и среднего deployment особенно важны:

  • быстрый локальный диск PostgreSQL;
  • достаточный объём RAM;
  • стабильное сетевое подключение;
  • отдельное пространство для media store.

Масштабирование

Текущая архитектура намеренно проста:

1 VM
 │
 ├── Dendrite
 ├── PostgreSQL
 └── Coturn

По мере роста можно отдельно масштабировать:

  • PostgreSQL;
  • media store;
  • TURN;
  • reverse proxy;
  • мониторинг;
  • резервное копирование.

Media Store уже удобно отделять от системного диска через NFS.

Безопасность

Для RAMBA Matrix рекомендуется:

  • держать публичную регистрацию отключённой;
  • использовать E2EE;
  • не публиковать PostgreSQL;
  • не публиковать внутренний порт Dendrite;
  • не хранить секреты в Wiki;
  • регулярно менять административные пароли;
  • ограничивать SSH;
  • резервировать `matrix_key.pem`;
  • хранить backup вне основной VM;
  • обновлять Dendrite, PostgreSQL, Element и Coturn;
  • проверять журналы после обновлений.

Полезные команды

Задача Команда
Статус Dendrite systemctl status dendrite
Перезапуск Dendrite systemctl restart dendrite
Логи Dendrite journalctl -u dendrite -f
Статус PostgreSQL systemctl status postgresql
Статус Coturn systemctl status coturn
Проверить Matrix API curl -s https://chat.ramba-art.ru/_matrix/client/versions
Проверить TURN curl -s https://chat.ramba-art.ru/_matrix/client/v3/voip/turnServer
Проверить NFS grep matrix
Проверить диск df -h

Итоговая схема

                        USERS
                          │
             ┌────────────┴────────────┐
             │                         │
             ▼                         ▼
       Element Web               Element Mobile
             │                         │
             └────────────┬────────────┘
                          │
                          │ HTTPS
                          ▼
                 ┌─────────────────┐
                 │     BrainyCP    │
                 │      Nginx      │
                 │       SSL       │
                 └────────┬────────┘
                          │
                          ▼
                 ┌─────────────────┐
                 │    Dendrite     │
                 └──────┬─────┬────┘
                        │     │
                        │     └──────────────┐
                        ▼                    ▼
                  PostgreSQL              Coturn
                        │                    │
                        │                    ▼
                        │               TURN Relay
                        │
                        ▼
                   Local Disk

                    Media API
                        │
                        ▼
                    OMV / NFS

Результат

RAMBA Matrix представляет собой полностью самостоятельную коммуникационную платформу, работающую на инфраструктуре RAMBA ART.

Система обеспечивает:

  • собственные Matrix ID;
  • личные и групповые чаты;
  • E2EE;
  • Android и iOS;
  • Element Web;
  • голосовые звонки;
  • видеозвонки;
  • собственное хранение данных;
  • резервное копирование;
  • федерацию;
  • возможность дальнейшего масштабирования.

При этом публичный веб-уровень, Matrix backend, база данных и media store разделены между отдельными компонентами инфраструктуры.

См. также

Внешние ссылки