RAMBA Matrix: различия между версиями
Новая страница: «= Развёртывание корпоративного мессенджера RAMBA Matrix = == Цель проекта == Цель проекта — развернуть собственный корпоративный мессенджер для организации RAMBA на базе открытого протокола Matrix. Основные требования: * собственный сервер сообщений; * поддержк...» |
Artem (обсуждение | вклад) Нет описания правки |
||
| (не показана 1 промежуточная версия 1 участника) | |||
| Строка 1: | Строка 1: | ||
= | <div class="portal-header"> | ||
<div class="portal-title">RAMBA Matrix</div> | |||
<div class="portal-subtitle"> | |||
Корпоративный мессенджер RAMBA ART на базе открытого протокола Matrix | |||
</div> | |||
</div> | |||
= | <div class="portal-card"> | ||
'''RAMBA Matrix''' — собственная коммуникационная платформа RAMBA ART на базе открытого протокола Matrix. | |||
Система предоставляет обмен сообщениями, групповые комнаты, сквозное шифрование, веб- и мобильные клиенты, а также аудио- и видеозвонки. | |||
Основная задача проекта — получить независимый корпоративный мессенджер, полностью размещённый на собственной инфраструктуре. | |||
</div> | |||
__TOC__ | |||
== | == Назначение проекта == | ||
RAMBA Matrix создавался как собственная альтернатива внешним корпоративным мессенджерам. | |||
Основные требования: | |||
* собственный сервер сообщений; | |||
* хранение данных на инфраструктуре RAMBA ART; | |||
* Android и iOS; | |||
* веб-клиент; | |||
* сквозное шифрование; | |||
* личные и групповые комнаты; | |||
* аудио- и видеозвонки; | |||
* собственные Matrix ID; | |||
* закрытая регистрация; | |||
* возможность резервного копирования; | |||
* возможность дальнейшего масштабирования; | |||
* ориентация примерно на 1000 зарегистрированных пользователей. | |||
Matrix ID пользователей имеют вид: | |||
Matrix ID пользователей | |||
<syntaxhighlight lang="text"> | <syntaxhighlight lang="text"> | ||
| Строка 69: | Строка 44: | ||
<syntaxhighlight lang="text"> | <syntaxhighlight lang="text"> | ||
@ | @ivan_ivanov:ramba-art.ru | ||
</syntaxhighlight> | </syntaxhighlight> | ||
== | == Архитектура RAMBA Matrix == | ||
Общая схема: | |||
<syntaxhighlight lang="text"> | |||
INTERNET | |||
│ | |||
│ HTTPS | |||
▼ | |||
┌──────────────────┐ | |||
│ BrainyCP │ | |||
│ Nginx │ | |||
│ Reverse Proxy │ | |||
│ SSL │ | |||
└────────┬─────────┘ | |||
│ | |||
│ HTTP | |||
▼ | |||
┌─────────────────────┐ | |||
│ ramba-chat │ | |||
│ │ | |||
│ Dendrite │ | |||
│ PostgreSQL │ | |||
│ Coturn │ | |||
└─────────┬───────────┘ | |||
│ | |||
│ | |||
┌─────────┴───────────┐ | |||
│ │ | |||
▼ ▼ | |||
Media Store TURN Relay | |||
│ | |||
▼ | |||
OMV/NFS | |||
</syntaxhighlight> | |||
Публичный веб-клиент Element работает отдельно и подключается к Matrix homeserver через HTTPS. | |||
== Домены == | |||
{| class="wikitable" | |||
! Назначение | |||
! Адрес | |||
|- | |||
| Matrix Server Name | |||
| <code>ramba-art.ru</code> | |||
|- | |||
| Homeserver | |||
| <code>chat.ramba-art.ru</code> | |||
|- | |||
| Element Web | |||
| <code>element.ramba-art.ru</code> | |||
|} | |||
При этом серверное имя Matrix остаётся: | |||
<syntaxhighlight lang="text"> | |||
ramba-art.ru | |||
</syntaxhighlight> | |||
Благодаря этому пользовательские ID не содержат технический поддомен `chat`. | |||
== Компоненты системы == | |||
{| class="wikitable" | |||
! Компонент | |||
! Назначение | |||
|- | |||
| '''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. | |||
= | <syntaxhighlight lang="text"> | ||
Dendrite | |||
│ | |||
▼ | |||
PostgreSQL | |||
│ | |||
▼ | |||
Local SSD / VM Disk | |||
</syntaxhighlight> | |||
Размещать активную БД PostgreSQL на NFS не рекомендуется. | |||
== Element == | |||
'''Element''' используется как основной клиент RAMBA Matrix. | |||
Поддерживаются: | |||
* | * Element Web; | ||
* | * Element для Android; | ||
* | * Element для iOS; | ||
* | * desktop-клиенты. | ||
Веб-клиент доступен через: | |||
<syntaxhighlight lang="text"> | <syntaxhighlight lang="text"> | ||
https://element.ramba-art.ru | |||
</syntaxhighlight> | </syntaxhighlight> | ||
Он заранее настроен на homeserver: | |||
<syntaxhighlight lang=" | <syntaxhighlight lang="text"> | ||
https://chat.ramba-art.ru | |||
</syntaxhighlight> | |||
Поэтому обычному пользователю не требуется вручную указывать сервер. | |||
== | == Reverse Proxy == | ||
BrainyCP | Публичный HTTPS-трафик проходит через BrainyCP. | ||
Схема: | |||
<syntaxhighlight lang="text"> | |||
Client | |||
│ | |||
│ HTTPS | |||
▼ | |||
BrainyCP / Nginx | |||
│ | |||
│ proxy_pass | |||
▼ | |||
Dendrite | |||
</syntaxhighlight> | |||
Это позволяет: | |||
* | * централизованно управлять SSL; | ||
* | * не публиковать Dendrite напрямую; | ||
* | * использовать единый внешний веб-уровень; | ||
* | * независимо переносить backend между VM или узлами Proxmox. | ||
Основные proxy-заголовки: | |||
<syntaxhighlight lang="nginx"> | |||
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; | |||
</syntaxhighlight> | |||
После изменения конфигурации Nginx: | |||
<syntaxhighlight lang="bash"> | |||
nginx -t | |||
systemctl reload nginx | |||
</syntaxhighlight> | |||
== Matrix .well-known == | |||
Чтобы пользователи имели ID: | |||
<syntaxhighlight lang="text"> | |||
@user:ramba-art.ru | |||
</syntaxhighlight> | |||
а физический homeserver находился на `chat.ramba-art.ru`, используется Matrix delegation. | |||
=== Server discovery === | |||
Адрес: | |||
<syntaxhighlight lang="text"> | |||
https://ramba-art.ru/.well-known/matrix/server | |||
</syntaxhighlight> | |||
Ответ: | |||
<syntaxhighlight lang=" | <syntaxhighlight lang="json"> | ||
ramba- | { | ||
"m.server": "chat.ramba-art.ru:443" | |||
} | |||
</syntaxhighlight> | </syntaxhighlight> | ||
=== Client discovery === | |||
Адрес: | |||
<syntaxhighlight lang="text"> | <syntaxhighlight lang="text"> | ||
https://ramba-art.ru/.well-known/matrix/client | |||
</syntaxhighlight> | </syntaxhighlight> | ||
Ответ: | |||
<syntaxhighlight lang=" | <syntaxhighlight lang="json"> | ||
{ | |||
"m.homeserver": { | |||
"base_url": "https://chat.ramba-art.ru" | |||
} | |||
} | |||
</syntaxhighlight> | </syntaxhighlight> | ||
Проверка: | |||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
curl -s https://ramba-art.ru/.well-known/matrix/server | |||
curl -s https://ramba-art.ru/.well-known/matrix/client | |||
</syntaxhighlight> | </syntaxhighlight> | ||
== Проверка Matrix API == | |||
Основная проверка homeserver: | |||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
curl -s \ | |||
https://chat.ramba-art.ru/_matrix/client/versions | |||
</syntaxhighlight> | |||
При исправной конфигурации сервер возвращает JSON со списком поддерживаемых версий Matrix Client API. | |||
== | == Dendrite == | ||
Рабочая конфигурация находится в: | |||
<syntaxhighlight lang="text"> | |||
/opt/dendrite/dendrite.yaml | |||
</syntaxhighlight> | |||
Основные файлы: | |||
> dendrite.yaml | <syntaxhighlight lang="text"> | ||
/opt/dendrite/ | |||
├── dendrite | |||
├── dendrite.yaml | |||
├── matrix_key.pem | |||
└── media/ | |||
</syntaxhighlight> | |||
Ключевой параметр: | |||
<syntaxhighlight lang="yaml"> | <syntaxhighlight lang="yaml"> | ||
global: | global: | ||
server_name: ramba-art.ru | server_name: ramba-art.ru | ||
</syntaxhighlight> | |||
`server_name` после ввода системы в эксплуатацию менять не следует. | |||
Он является частью Matrix ID пользователей и идентичности homeserver. | |||
== Systemd == | |||
Dendrite запускается как системная служба. | |||
Управление: | |||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
systemctl start dendrite | |||
systemctl stop dendrite | |||
systemctl restart dendrite | |||
systemctl status dendrite | |||
</syntaxhighlight> | </syntaxhighlight> | ||
Просмотр журнала: | |||
<syntaxhighlight lang=" | <syntaxhighlight lang="bash"> | ||
journalctl -u dendrite -f | |||
</syntaxhighlight> | |||
Последние записи: | |||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
journalctl -u dendrite -n 100 --no-pager | |||
</syntaxhighlight> | </syntaxhighlight> | ||
== | == Регистрация пользователей == | ||
RAMBA Matrix работает как закрытая корпоративная система. | |||
Публичная регистрация пользователей отключена. | |||
Пользовательские записи создаются администратором. | |||
Общая схема: | |||
<syntaxhighlight lang="text"> | <syntaxhighlight lang="text"> | ||
Администратор | |||
│ | |||
▼ | |||
Создание аккаунта | |||
│ | |||
▼ | |||
@username:ramba-art.ru | |||
│ | |||
▼ | |||
Первый вход пользователя | |||
</syntaxhighlight> | </syntaxhighlight> | ||
Такой вариант позволяет контролировать доступ к системе и предотвращает автоматическую регистрацию посторонних пользователей. | |||
== Сквозное шифрование == | |||
Matrix поддерживает End-to-End Encryption. | |||
В зашифрованной комнате сообщение шифруется на клиенте отправителя и расшифровывается на устройстве получателя. | |||
Упрощённая схема: | |||
<syntaxhighlight lang="text"> | <syntaxhighlight lang="text"> | ||
Client A | |||
│ | |||
│ encrypted event | |||
▼ | |||
Matrix Server | |||
│ | |||
│ encrypted event | |||
▼ | |||
Client B | |||
</syntaxhighlight> | </syntaxhighlight> | ||
Homeserver хранит зашифрованное содержимое и не должен обладать ключами для расшифровки сообщений пользователей. | |||
Для пользователей особенно важно настроить восстановление ключей и не терять данные безопасного хранилища. | |||
== Media Store == | |||
Matrix хранит загружаемые изображения, документы, видео и другие вложения отдельно от основной PostgreSQL БД. | |||
Для RAMBA Matrix media store вынесен на отдельное хранилище. | |||
Схема: | |||
<syntaxhighlight lang="text"> | <syntaxhighlight lang="text"> | ||
Dendrite VM | |||
│ | |||
▼ | |||
Media directory | |||
│ | |||
▼ | |||
NFS | |||
│ | |||
▼ | |||
OMV Storage | |||
</syntaxhighlight> | </syntaxhighlight> | ||
Это позволяет не увеличивать системный диск VM по мере роста количества вложений. | |||
PostgreSQL при этом остаётся на локальном диске. | |||
== Права на NFS == | |||
При использовании NFS необходимо обеспечить правильные UID/GID пользователя, под которым работает Dendrite. | |||
После монтирования следует проверить: | |||
<syntaxhighlight lang=" | <syntaxhighlight lang="bash"> | ||
mount | grep matrix | |||
ls -ld /matrix-media | |||
</syntaxhighlight> | </syntaxhighlight> | ||
И тест записи: | |||
<syntaxhighlight lang=" | <syntaxhighlight lang="bash"> | ||
touch /matrix-media/test | |||
rm /matrix-media/test | |||
</syntaxhighlight> | </syntaxhighlight> | ||
Тест необходимо выполнять от имени пользователя Dendrite. | |||
== Coturn == | |||
Coturn используется для STUN/TURN и обеспечивает работу звонков в сложных NAT-сценариях. | |||
Без TURN два клиента могут успешно обмениваться сообщениями, но не иметь возможности установить аудио- или видеосоединение. | |||
Архитектура звонка: | |||
<syntaxhighlight lang="text"> | |||
Element A | |||
│ | |||
│ WebRTC | |||
▼ | |||
STUN / TURN | |||
│ | |||
▼ | |||
Coturn | |||
│ | |||
│ Relay | |||
▼ | |||
Element B | |||
</syntaxhighlight> | |||
== TURN-порты == | |||
В инфраструктуре используется ограниченный диапазон relay-портов: | |||
{| class="wikitable" | |||
! Порт | |||
! Протокол | |||
! Назначение | |||
|- | |||
| 3478 | |||
| TCP / UDP | |||
| STUN / TURN | |||
|- | |||
| 5349 | |||
| TCP | |||
| TURN over TLS | |||
|- | |||
| 49152–49252 | |||
| UDP | |||
| TURN Relay | |||
|} | |||
Этот диапазон должен быть разрешён firewall и корректно проброшен через NAT. | |||
Пример конфигурации | == Пример конфигурации Coturn == | ||
<syntaxhighlight lang="ini"> | <syntaxhighlight lang="ini"> | ||
listening-port=3478 | listening-port=3478 | ||
tls-listening-port=5349 | tls-listening-port=5349 | ||
use-auth-secret | use-auth-secret | ||
realm=ramba-art.ru | realm=ramba-art.ru | ||
fingerprint | fingerprint | ||
lt-cred-mech | lt-cred-mech | ||
min-port=49152 | |||
max-port=49252 | |||
no-multicast-peers | no-multicast-peers | ||
no-cli | no-cli | ||
</syntaxhighlight> | |||
Также должны быть корректно настроены: | |||
<syntaxhighlight lang="ini"> | |||
listening-ip= | |||
relay-ip= | |||
external-ip= | |||
</syntaxhighlight> | |||
Конкретные значения зависят от текущей сетевой архитектуры. | |||
== | == TURN в Dendrite == | ||
В | В конфигурации Dendrite указываются URI TURN-сервера: | ||
<syntaxhighlight lang="yaml"> | <syntaxhighlight lang="yaml"> | ||
| Строка 533: | Строка 574: | ||
turn: | turn: | ||
turn_user_lifetime: "5m" | turn_user_lifetime: "5m" | ||
turn_uris: | turn_uris: | ||
- "turn:turn.ramba-art.ru:3478?transport=udp" | - "turn:turn.ramba-art.ru:3478?transport=udp" | ||
- "turn:turn.ramba-art.ru:3478?transport=tcp" | - "turn:turn.ramba-art.ru:3478?transport=tcp" | ||
- "turns:turn.ramba-art.ru:5349?transport=tcp" | - "turns:turn.ramba-art.ru:5349?transport=tcp" | ||
turn_shared_secret: "SECRET" | turn_shared_secret: "SECRET" | ||
</syntaxhighlight> | </syntaxhighlight> | ||
`turn_shared_secret` должен совпадать с `static-auth-secret` Coturn. | |||
Проверка: | Секреты не следует публиковать в Wiki. | ||
== Проверка TURN == | |||
Проверка выдачи временных TURN credentials: | |||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
curl -s https://chat.ramba-art.ru/_matrix/client/v3/voip/turnServer | curl -s \ | ||
https://chat.ramba-art.ru/_matrix/client/v3/voip/turnServer | |||
</syntaxhighlight> | </syntaxhighlight> | ||
В рабочем состоянии сервер возвращает: | |||
* username; | |||
* password; | |||
* TTL; | |||
* список TURN URI. | |||
== Тестирование звонков == | |||
Для корректной проверки необходимо использовать два независимых устройства. | |||
Желательно: | |||
* одно устройство через Wi-Fi; | |||
* второе через мобильную сеть. | |||
Это заставляет WebRTC проходить через реальные NAT-сценарии. | |||
Проверяем: | |||
# текстовые сообщения; | |||
# зашифрованный личный чат; | |||
# аудиозвонок; | |||
# видеозвонок; | |||
# входящий вызов; | |||
# работу после переключения сети. | |||
Успешный звонок через разные сети подтверждает работу: | |||
<syntaxhighlight lang=" | <syntaxhighlight lang="text"> | ||
Element | |||
+ | |||
Dendrite | |||
+ | |||
WebRTC | |||
+ | |||
STUN | |||
+ | |||
TURN | |||
+ | |||
NAT | |||
+ | |||
Firewall | |||
</syntaxhighlight> | |||
== Element Web == | |||
Element Web работает на отдельном домене: | |||
<syntaxhighlight lang="text"> | <syntaxhighlight lang="text"> | ||
https://element.ramba-art.ru | |||
</syntaxhighlight> | |||
Пример основных параметров `config.json`: | |||
<syntaxhighlight lang="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" | |||
} | |||
</syntaxhighlight> | </syntaxhighlight> | ||
Благодаря этому пользователю достаточно открыть Element и войти под своим RAMBA Matrix аккаунтом. | |||
== Мобильные клиенты == | |||
На мобильных устройствах используются Matrix-совместимые клиенты. | |||
Для подключения используется homeserver: | |||
= | <syntaxhighlight lang="text"> | ||
https://chat.ramba-art.ru | |||
</syntaxhighlight> | |||
Либо автоматическое обнаружение через: | |||
<syntaxhighlight lang="text"> | <syntaxhighlight lang="text"> | ||
ramba-art.ru | |||
</syntaxhighlight> | </syntaxhighlight> | ||
После входа рекомендуется сразу настроить: | |||
<syntaxhighlight lang=" | * подтверждение устройства; | ||
* безопасное хранилище; | |||
* восстановление ключей; | |||
* PIN/Face ID клиента; | |||
* push-уведомления. | |||
== Федерация == | |||
Matrix поддерживает обмен событиями между независимыми homeserver. | |||
Для федерации используется server name: | |||
<syntaxhighlight lang="text"> | |||
ramba-art.ru | |||
</syntaxhighlight> | </syntaxhighlight> | ||
и delegation на: | |||
<syntaxhighlight lang="text"> | <syntaxhighlight lang="text"> | ||
chat.ramba-art.ru | |||
</syntaxhighlight> | </syntaxhighlight> | ||
Базовая проверка: | |||
<syntaxhighlight lang="bash"> | |||
curl -s \ | |||
https://ramba-art.ru/.well-known/matrix/server | |||
</syntaxhighlight> | |||
При проблемах с федерацией необходимо проверять: | |||
* | * DNS; | ||
* | * TLS; | ||
* | * `.well-known`; | ||
* | * доступность `chat.ramba-art.ru`; | ||
* Nginx; | |||
* журнал Dendrite. | |||
== | == Резервное копирование == | ||
Matrix нельзя считать защищённым только потому, что существует snapshot VM. | |||
Необходимо резервировать отдельно: | |||
{| class="wikitable" | |||
! Компонент | |||
! Требуется backup | |||
|- | |||
| PostgreSQL | |||
| Да | |||
|- | |||
| dendrite.yaml | |||
| Да | |||
|- | |||
| matrix_key.pem | |||
| '''Обязательно''' | |||
|- | |||
| Media Store | |||
| Да | |||
|- | |||
| Coturn config | |||
| Да | |||
|- | |||
| Element config.json | |||
| Да | |||
|- | |||
| BrainyCP / Nginx vhost | |||
| Да | |||
|} | |||
Особенно критичен: | |||
<syntaxhighlight lang="text"> | <syntaxhighlight lang="text"> | ||
matrix_key.pem | |||
</syntaxhighlight> | </syntaxhighlight> | ||
Это identity key Matrix homeserver. Его потеря может привести к серьёзным проблемам с федерацией и идентичностью сервера. | |||
== PostgreSQL backup == | |||
Пример: | |||
<syntaxhighlight lang="bash"> | |||
sudo -u postgres \ | |||
pg_dump dendrite \ | |||
> /root/dendrite-$(date +%F).sql | |||
</syntaxhighlight> | |||
Проверяем: | |||
== | <syntaxhighlight lang="bash"> | ||
ls -lh /root/dendrite-*.sql | |||
</syntaxhighlight> | |||
Для production рекомендуется автоматизировать резервное копирование и периодически тестировать восстановление. | |||
== Backup конфигурации == | |||
Пример: | |||
<syntaxhighlight lang="bash"> | |||
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 | |||
</syntaxhighlight> | |||
Файл с `matrix_key.pem` должен храниться в защищённом месте. | |||
== Proxmox Backup == | |||
Виртуальная машина RAMBA Matrix также резервируется средствами Proxmox. | |||
Схема: | |||
<syntaxhighlight lang="text"> | <syntaxhighlight lang="text"> | ||
RAMBA Matrix VM | |||
│ | |||
▼ | |||
Proxmox VE | |||
│ | |||
▼ | |||
Proxmox Backup Server | |||
</syntaxhighlight> | </syntaxhighlight> | ||
Backup VM полезен для быстрого полного восстановления, но не заменяет логический dump PostgreSQL. | |||
== Мониторинг == | |||
Минимальный набор проверок: | |||
=== Dendrite === | |||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
systemctl status dendrite | |||
</syntaxhighlight> | </syntaxhighlight> | ||
=== PostgreSQL === | |||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
systemctl status postgresql | |||
</syntaxhighlight> | </syntaxhighlight> | ||
== | === Coturn === | ||
<syntaxhighlight lang="bash"> | |||
systemctl status coturn | |||
</syntaxhighlight> | |||
=== Matrix API === | |||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
curl -s https://ramba-art.ru/ | curl -s \ | ||
curl -s https://ramba-art.ru/ | https://chat.ramba-art.ru/_matrix/client/versions | ||
</syntaxhighlight> | |||
=== TURN === | |||
<syntaxhighlight lang="bash"> | |||
curl -s \ | |||
https://chat.ramba-art.ru/_matrix/client/v3/voip/turnServer | |||
</syntaxhighlight> | |||
=== Media storage === | |||
<syntaxhighlight lang="bash"> | |||
df -h | |||
mount | grep matrix | |||
</syntaxhighlight> | |||
== Диагностика == | |||
=== Dendrite не запускается === | |||
<syntaxhighlight lang="bash"> | |||
systemctl status dendrite | |||
journalctl -u dendrite -n 100 --no-pager | |||
</syntaxhighlight> | |||
=== Matrix API недоступен === | |||
Проверяем цепочку: | |||
<syntaxhighlight lang="text"> | |||
Client | |||
│ | |||
▼ | |||
DNS | |||
│ | |||
▼ | |||
BrainyCP | |||
│ | |||
▼ | |||
Nginx | |||
│ | |||
▼ | |||
Dendrite | |||
</syntaxhighlight> | </syntaxhighlight> | ||
Проверяем внешний адрес: | |||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
curl - | curl -Iv https://chat.ramba-art.ru/ | ||
</syntaxhighlight> | </syntaxhighlight> | ||
И backend непосредственно из LAN: | |||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
curl -I http://MATRIX_BACKEND_IP:8008/ | |||
</syntaxhighlight> | </syntaxhighlight> | ||
=== Звонок соединяется без аудио === | |||
В первую очередь проверяем: | |||
* Coturn; | |||
* relay UDP range; | |||
* NAT; | |||
* `external-ip`; | |||
* firewall; | |||
* TURN credentials. | |||
Проверяем: | |||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
ss -tulpn | grep turnserver | |||
</syntaxhighlight> | </syntaxhighlight> | ||
=== Не загружаются медиа === | |||
Проверяем: | |||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
mount | grep matrix | |||
df -h | |||
ls -ld /matrix-media | |||
</syntaxhighlight> | |||
Также необходимо проверить права пользователя Dendrite на NFS. | |||
== Производительность == | |||
Основная нагрузка Matrix распределяется между: | |||
<syntaxhighlight lang="text"> | |||
CPU | |||
│ | |||
├── Dendrite | |||
├── PostgreSQL | |||
└── Federation | |||
RAM | |||
│ | |||
├── Dendrite | |||
└── PostgreSQL | |||
Disk | |||
│ | |||
├── PostgreSQL | |||
└── Media | |||
Network | |||
│ | |||
├── Federation | |||
├── Media | |||
└── TURN | |||
</syntaxhighlight> | </syntaxhighlight> | ||
Для небольшого и среднего deployment особенно важны: | |||
* быстрый локальный диск PostgreSQL; | |||
* достаточный объём RAM; | |||
* стабильное сетевое подключение; | |||
* отдельное пространство для media store. | |||
== Масштабирование == | |||
Текущая архитектура намеренно проста: | |||
<syntaxhighlight lang="text"> | |||
1 VM | |||
* | │ | ||
* | ├── Dendrite | ||
├── PostgreSQL | |||
└── Coturn | |||
</syntaxhighlight> | |||
По мере роста можно отдельно масштабировать: | |||
* PostgreSQL; | |||
* media store; | |||
* TURN; | * TURN; | ||
* reverse proxy; | * reverse proxy; | ||
* | * мониторинг; | ||
* резервное копирование. | |||
Media Store уже удобно отделять от системного диска через NFS. | |||
* | == Безопасность == | ||
* | |||
* | Для RAMBA Matrix рекомендуется: | ||
* | |||
* | * держать публичную регистрацию отключённой; | ||
* | * использовать E2EE; | ||
* | * не публиковать PostgreSQL; | ||
* | * не публиковать внутренний порт Dendrite; | ||
* | * не хранить секреты в Wiki; | ||
* | * регулярно менять административные пароли; | ||
* ограничивать SSH; | |||
* резервировать `matrix_key.pem`; | |||
* хранить backup вне основной VM; | |||
* обновлять Dendrite, PostgreSQL, Element и Coturn; | |||
* проверять журналы после обновлений. | |||
== Полезные команды == | |||
{| class="wikitable" | |||
! Задача | |||
! Команда | |||
|- | |||
| Статус Dendrite | |||
| <code>systemctl status dendrite</code> | |||
|- | |||
| Перезапуск Dendrite | |||
| <code>systemctl restart dendrite</code> | |||
|- | |||
| Логи Dendrite | |||
| <code>journalctl -u dendrite -f</code> | |||
|- | |||
| Статус PostgreSQL | |||
| <code>systemctl status postgresql</code> | |||
|- | |||
| Статус Coturn | |||
| <code>systemctl status coturn</code> | |||
|- | |||
| Проверить Matrix API | |||
| <code>curl -s https://chat.ramba-art.ru/_matrix/client/versions</code> | |||
|- | |||
| Проверить TURN | |||
| <code>curl -s https://chat.ramba-art.ru/_matrix/client/v3/voip/turnServer</code> | |||
|- | |||
| Проверить NFS | |||
| <code>mount | grep matrix</code> | |||
|- | |||
| Проверить диск | |||
| <code>df -h</code> | |||
|} | |||
== Итоговая схема == | |||
<syntaxhighlight lang="text"> | |||
USERS | |||
│ | |||
┌────────────┴────────────┐ | |||
│ │ | |||
▼ ▼ | |||
Element Web Element Mobile | |||
│ │ | |||
└────────────┬────────────┘ | |||
│ | |||
│ HTTPS | |||
▼ | |||
┌─────────────────┐ | |||
│ BrainyCP │ | |||
│ Nginx │ | |||
│ SSL │ | |||
└────────┬────────┘ | |||
│ | |||
▼ | |||
┌─────────────────┐ | |||
│ Dendrite │ | |||
└──────┬─────┬────┘ | |||
│ │ | |||
│ └──────────────┐ | |||
▼ ▼ | |||
PostgreSQL Coturn | |||
│ │ | |||
│ ▼ | |||
│ TURN Relay | |||
│ | |||
▼ | |||
Local Disk | |||
Media API | |||
│ | |||
▼ | |||
OMV / NFS | |||
</syntaxhighlight> | |||
== Результат == | |||
RAMBA Matrix представляет собой полностью самостоятельную коммуникационную платформу, работающую на инфраструктуре RAMBA ART. | |||
Система обеспечивает: | |||
* собственные Matrix ID; | |||
* личные и групповые чаты; | |||
* E2EE; | |||
* Android и iOS; | |||
* Element Web; | |||
* голосовые звонки; | |||
* видеозвонки; | |||
* собственное хранение данных; | |||
* резервное копирование; | |||
* федерацию; | |||
* возможность дальнейшего масштабирования. | |||
При этом публичный веб-уровень, Matrix backend, база данных и media store разделены между отдельными компонентами инфраструктуры. | |||
== | == См. также == | ||
* [[BrainyCP]] | |||
* [[Proxmox VE]] | |||
* [[Proxmox Backup Server]] | |||
* [[OpenMediaVault]] | |||
* [[RAMBA Wiki]] | |||
* [[Мониторинг]] | |||
== Внешние ссылки == | |||
* [https://matrix.org/ Matrix.org] | |||
* [https://spec.matrix.org/ Matrix Specification] | |||
* [https://github.com/element-hq/dendrite Dendrite] | |||
* [https://element.io/ Element] | |||
* [https://github.com/coturn/coturn Coturn] | |||
[[Категория:Matrix]] | |||
[[Категория:RAMBA Matrix]] | |||
[[Категория:Мессенджеры]] | |||
[[Категория:Linux]] | |||
[[Категория:Proxmox]] | |||
[[Категория:Сетевая инфраструктура]] | |||
[[Категория:RAMBA ART]] | |||
Текущая версия от 13:37, 2 сентября 2026
Корпоративный мессенджер 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-сценарии.
Проверяем:
- текстовые сообщения;
- зашифрованный личный чат;
- аудиозвонок;
- видеозвонок;
- входящий вызов;
- работу после переключения сети.
Успешный звонок через разные сети подтверждает работу:
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 разделены между отдельными компонентами инфраструктуры.