<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://wiki.ramba-art.ru/index.php?action=history&amp;feed=atom&amp;title=RAMBA_Matrix</id>
	<title>RAMBA Matrix - История изменений</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.ramba-art.ru/index.php?action=history&amp;feed=atom&amp;title=RAMBA_Matrix"/>
	<link rel="alternate" type="text/html" href="https://wiki.ramba-art.ru/index.php?title=RAMBA_Matrix&amp;action=history"/>
	<updated>2026-08-24T01:08:47Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.39.2</generator>
	<entry>
		<id>https://wiki.ramba-art.ru/index.php?title=RAMBA_Matrix&amp;diff=105&amp;oldid=prev</id>
		<title>192.168.1.1 в 12:53, 19 июня 2026</title>
		<link rel="alternate" type="text/html" href="https://wiki.ramba-art.ru/index.php?title=RAMBA_Matrix&amp;diff=105&amp;oldid=prev"/>
		<updated>2026-06-19T12:53:42Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;ru&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Предыдущая версия&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Версия от 12:53, 19 июня 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l69&quot;&gt;Строка 69:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 69:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;@&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;artem&lt;/del&gt;:ramba-art.ru&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;@&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;ivan_ivanov&lt;/ins&gt;:ramba-art.ru&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>192.168.1.1</name></author>
	</entry>
	<entry>
		<id>https://wiki.ramba-art.ru/index.php?title=RAMBA_Matrix&amp;diff=104&amp;oldid=prev</id>
		<title>192.168.1.1: Новая страница: «= Развёртывание корпоративного мессенджера RAMBA Matrix =  == Цель проекта ==  Цель проекта — развернуть собственный корпоративный мессенджер для организации RAMBA на базе открытого протокола Matrix.  Основные требования:  * собственный сервер сообщений; * поддержк...»</title>
		<link rel="alternate" type="text/html" href="https://wiki.ramba-art.ru/index.php?title=RAMBA_Matrix&amp;diff=104&amp;oldid=prev"/>
		<updated>2026-06-19T12:51:54Z</updated>

		<summary type="html">&lt;p&gt;Новая страница: «= Развёртывание корпоративного мессенджера RAMBA Matrix =  == Цель проекта ==  Цель проекта — развернуть собственный корпоративный мессенджер для организации RAMBA на базе открытого протокола Matrix.  Основные требования:  * собственный сервер сообщений; * поддержк...»&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;= Развёртывание корпоративного мессенджера RAMBA Matrix =&lt;br /&gt;
&lt;br /&gt;
== Цель проекта ==&lt;br /&gt;
&lt;br /&gt;
Цель проекта — развернуть собственный корпоративный мессенджер для организации RAMBA на базе открытого протокола Matrix.&lt;br /&gt;
&lt;br /&gt;
Основные требования:&lt;br /&gt;
&lt;br /&gt;
* собственный сервер сообщений;&lt;br /&gt;
* поддержка мобильных клиентов Android и iOS;&lt;br /&gt;
* поддержка веб-клиента;&lt;br /&gt;
* аудио- и видеозвонки;&lt;br /&gt;
* сквозное шифрование;&lt;br /&gt;
* контроль над данными;&lt;br /&gt;
* возможность работы примерно до 1000 пользователей;&lt;br /&gt;
* возможность дальнейшего резервного копирования и масштабирования.&lt;br /&gt;
&lt;br /&gt;
== Итоговая архитектура ==&lt;br /&gt;
&lt;br /&gt;
В проекте используется следующая схема:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Пользователь&lt;br /&gt;
  |&lt;br /&gt;
  | Element Web / Element Mobile&lt;br /&gt;
  |&lt;br /&gt;
Интернет&lt;br /&gt;
  |&lt;br /&gt;
  | HTTPS&lt;br /&gt;
  |&lt;br /&gt;
Reverse Proxy / SSL&lt;br /&gt;
BrainyCP: 192.168.1.12&lt;br /&gt;
  |&lt;br /&gt;
  | proxy_pass&lt;br /&gt;
  |&lt;br /&gt;
VM ramba-chat&lt;br /&gt;
Ubuntu Server 26.04&lt;br /&gt;
  |&lt;br /&gt;
  |-- Dendrite&lt;br /&gt;
  |-- PostgreSQL&lt;br /&gt;
  |-- Coturn&lt;br /&gt;
  |-- Media Store&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Основные домены:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Назначение&lt;br /&gt;
&lt;br /&gt;
| ! Домен              |&lt;br /&gt;
| -------------------- |&lt;br /&gt;
| Matrix Homeserver    |&lt;br /&gt;
| chat.ramba-art.ru    |&lt;br /&gt;
| -                    |&lt;br /&gt;
| Element Web          |&lt;br /&gt;
| element.ramba-art.ru |&lt;br /&gt;
| -                    |&lt;br /&gt;
| Matrix Server Name   |&lt;br /&gt;
| ramba-art.ru         |&lt;br /&gt;
| }                    |&lt;br /&gt;
&lt;br /&gt;
Matrix ID пользователей имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
@username:ramba-art.ru&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Например:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
@artem:ramba-art.ru&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Почему выбран Matrix ==&lt;br /&gt;
&lt;br /&gt;
Matrix — открытый протокол для обмена сообщениями, голосовой и видеосвязи.&lt;br /&gt;
&lt;br /&gt;
Преимущества Matrix:&lt;br /&gt;
&lt;br /&gt;
* открытый протокол;&lt;br /&gt;
* нет привязки к одному поставщику;&lt;br /&gt;
* поддержка федерации между серверами;&lt;br /&gt;
* поддержка сквозного шифрования;&lt;br /&gt;
* есть готовые клиенты для Android, iOS, Web, Windows, Linux и macOS;&lt;br /&gt;
* можно хранить данные на собственной инфраструктуре;&lt;br /&gt;
* можно использовать собственный домен для пользователей.&lt;br /&gt;
&lt;br /&gt;
Недостатки Matrix:&lt;br /&gt;
&lt;br /&gt;
* сложнее в администрировании, чем обычные SaaS-мессенджеры;&lt;br /&gt;
* требуется следить за обновлениями;&lt;br /&gt;
* требуется корректная настройка TURN/STUN для звонков;&lt;br /&gt;
* требуется резервное копирование базы данных и медиафайлов;&lt;br /&gt;
* при больших нагрузках нужно планировать ресурсы заранее.&lt;br /&gt;
&lt;br /&gt;
== Почему выбран Dendrite ==&lt;br /&gt;
&lt;br /&gt;
В качестве homeserver выбран Dendrite.&lt;br /&gt;
&lt;br /&gt;
Dendrite — сервер Matrix, написанный на Go. Он легче по ресурсам, чем классический Synapse, и подходит для компактного развёртывания.&lt;br /&gt;
&lt;br /&gt;
Плюсы Dendrite:&lt;br /&gt;
&lt;br /&gt;
* низкое потребление памяти;&lt;br /&gt;
* простая монолитная установка;&lt;br /&gt;
* высокая скорость запуска;&lt;br /&gt;
* удобная сборка из исходного кода;&lt;br /&gt;
* хорошо подходит для собственного сервера организации;&lt;br /&gt;
* использует PostgreSQL как основную базу данных.&lt;br /&gt;
&lt;br /&gt;
Минусы Dendrite:&lt;br /&gt;
&lt;br /&gt;
* менее зрелый проект по сравнению с Synapse;&lt;br /&gt;
* часть экосистемы Matrix исторически лучше тестировалась на Synapse;&lt;br /&gt;
* меньше готовых инструкций и примеров;&lt;br /&gt;
* при нестандартных интеграциях может потребоваться ручная отладка.&lt;br /&gt;
&lt;br /&gt;
Вывод: для RAMBA выбран Dendrite, потому что он проще и легче для собственного сервера, при этом покрывает основные требования проекта: сообщения, Element, федерация, E2EE и звонки.&lt;br /&gt;
&lt;br /&gt;
== Почему выбран PostgreSQL ==&lt;br /&gt;
&lt;br /&gt;
PostgreSQL используется как основная база данных Dendrite.&lt;br /&gt;
&lt;br /&gt;
Плюсы PostgreSQL:&lt;br /&gt;
&lt;br /&gt;
* надёжная промышленная СУБД;&lt;br /&gt;
* хорошо подходит для постоянного хранения событий Matrix;&lt;br /&gt;
* поддерживается Dendrite;&lt;br /&gt;
* удобно резервировать через pg_dump;&lt;br /&gt;
* проще восстановить отдельно от файловой системы.&lt;br /&gt;
&lt;br /&gt;
Минусы PostgreSQL:&lt;br /&gt;
&lt;br /&gt;
* требует отдельного контроля резервных копий;&lt;br /&gt;
* нельзя полагаться только на snapshot VM;&lt;br /&gt;
* желательно не размещать базу на медленном сетевом хранилище.&lt;br /&gt;
&lt;br /&gt;
Вывод: PostgreSQL следует хранить на локальном диске VM, а не на NFS.&lt;br /&gt;
&lt;br /&gt;
== Почему выбран Element ==&lt;br /&gt;
&lt;br /&gt;
Element выбран как основной клиент Matrix.&lt;br /&gt;
&lt;br /&gt;
Используются:&lt;br /&gt;
&lt;br /&gt;
* Element Web — через element.ramba-art.ru;&lt;br /&gt;
* Element Mobile — для Android и iOS.&lt;br /&gt;
&lt;br /&gt;
Плюсы Element:&lt;br /&gt;
&lt;br /&gt;
* официальный и наиболее развитый клиент Matrix;&lt;br /&gt;
* поддержка E2EE;&lt;br /&gt;
* поддержка аудио- и видеозвонков;&lt;br /&gt;
* есть веб-версия;&lt;br /&gt;
* есть мобильные приложения;&lt;br /&gt;
* можно заранее указать свой homeserver в config.json.&lt;br /&gt;
&lt;br /&gt;
Минусы Element:&lt;br /&gt;
&lt;br /&gt;
* пользователю нужно привыкнуть к интерфейсу Matrix;&lt;br /&gt;
* при первом входе важно правильно настроить безопасное восстановление ключей;&lt;br /&gt;
* при работе через браузер возможны предупреждения Safe Browsing, если домен имеет плохую репутацию.&lt;br /&gt;
&lt;br /&gt;
== Почему выбран Coturn ==&lt;br /&gt;
&lt;br /&gt;
Coturn используется для аудио- и видеозвонков.&lt;br /&gt;
&lt;br /&gt;
Для звонков Matrix/Element использует WebRTC. Если два клиента не могут соединиться напрямую через NAT, используется TURN-сервер.&lt;br /&gt;
&lt;br /&gt;
Плюсы Coturn:&lt;br /&gt;
&lt;br /&gt;
* стандартное решение для STUN/TURN;&lt;br /&gt;
* совместим с WebRTC;&lt;br /&gt;
* поддерживает временные креды через shared secret;&lt;br /&gt;
* можно использовать с Matrix;&lt;br /&gt;
* можно ограничить диапазон relay-портов.&lt;br /&gt;
&lt;br /&gt;
Минусы Coturn:&lt;br /&gt;
&lt;br /&gt;
* требует проброса портов на маршрутизаторе;&lt;br /&gt;
* требует правильной настройки external-ip;&lt;br /&gt;
* при неправильном firewall звонок может подключаться без аудио или видео;&lt;br /&gt;
* relay-трафик может создавать нагрузку на канал.&lt;br /&gt;
&lt;br /&gt;
В проекте используются порты:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
3478/tcp&lt;br /&gt;
3478/udp&lt;br /&gt;
5349/tcp&lt;br /&gt;
49152-49252/udp&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример ключевых настроек Coturn:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
use-auth-secret&lt;br /&gt;
realm=ramba-art.ru&lt;br /&gt;
listening-ip=192.168.1.50&lt;br /&gt;
external-ip=195.138.232.82&lt;br /&gt;
fingerprint&lt;br /&gt;
lt-cred-mech&lt;br /&gt;
&lt;br /&gt;
min-port=49152&lt;br /&gt;
max-port=49252 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Почему используется Reverse Proxy BrainyCP ==&lt;br /&gt;
&lt;br /&gt;
BrainyCP используется как внешний reverse proxy и точка управления SSL-сертификатами.&lt;br /&gt;
&lt;br /&gt;
Плюсы такого решения:&lt;br /&gt;
&lt;br /&gt;
* SSL-сертификаты управляются централизованно;&lt;br /&gt;
* внешние домены обслуживаются в одном месте;&lt;br /&gt;
* Dendrite и Element не публикуются напрямую;&lt;br /&gt;
* проще управлять HTTPS;&lt;br /&gt;
* можно разделить публичный фронт и внутренние сервисы.&lt;br /&gt;
&lt;br /&gt;
Минусы:&lt;br /&gt;
&lt;br /&gt;
* появляется дополнительная точка отказа;&lt;br /&gt;
* ошибки в Nginx-конфигурации могут повлиять на Matrix;&lt;br /&gt;
* нужно следить за корректной передачей заголовков;&lt;br /&gt;
* при проблемах с HTTP/2 или TLS диагностика становится сложнее.&lt;br /&gt;
&lt;br /&gt;
== Почему VM, а не LXC ==&lt;br /&gt;
&lt;br /&gt;
Для Matrix выбран вариант с отдельной VM в Proxmox.&lt;br /&gt;
&lt;br /&gt;
Плюсы VM:&lt;br /&gt;
&lt;br /&gt;
* лучшая изоляция;&lt;br /&gt;
* проще переносить между узлами Proxmox;&lt;br /&gt;
* полноценная система с собственным ядром;&lt;br /&gt;
* удобнее делать snapshot и backup;&lt;br /&gt;
* меньше неожиданных ограничений, чем в LXC.&lt;br /&gt;
&lt;br /&gt;
Минусы VM:&lt;br /&gt;
&lt;br /&gt;
* потребляет больше ресурсов, чем LXC;&lt;br /&gt;
* нужно отдельно следить за обновлениями ОС;&lt;br /&gt;
* требуется больше дискового пространства.&lt;br /&gt;
&lt;br /&gt;
Вывод: для корпоративного мессенджера VM предпочтительнее, так как важнее надёжность и изоляция.&lt;br /&gt;
&lt;br /&gt;
== Развёртывание VM ==&lt;br /&gt;
&lt;br /&gt;
Рекомендуемые параметры VM для старта:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Ресурс&lt;br /&gt;
&lt;br /&gt;
| ! Значение          |&lt;br /&gt;
| ------------------- |&lt;br /&gt;
| CPU                 |&lt;br /&gt;
| 4 vCPU              |&lt;br /&gt;
| -                   |&lt;br /&gt;
| RAM                 |&lt;br /&gt;
| 8-16 GB             |&lt;br /&gt;
| -                   |&lt;br /&gt;
| Disk                |&lt;br /&gt;
| 100 GB              |&lt;br /&gt;
| -                   |&lt;br /&gt;
| OS                  |&lt;br /&gt;
| Ubuntu Server 26.04 |&lt;br /&gt;
| -                   |&lt;br /&gt;
| Network             |&lt;br /&gt;
| Static IP           |&lt;br /&gt;
| }                   |&lt;br /&gt;
&lt;br /&gt;
В проекте используется VM:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
ramba-chat&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
IP VM:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
192.168.1.50&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Установка системных пакетов ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt update&lt;br /&gt;
sudo apt install -y git curl wget build-essential postgresql coturn nginx&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для сборки Dendrite также требуется Go.&lt;br /&gt;
&lt;br /&gt;
== Установка PostgreSQL ==&lt;br /&gt;
&lt;br /&gt;
Создаётся пользователь и база данных:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo -u postgres createuser dendrite&lt;br /&gt;
sudo -u postgres createdb -O dendrite dendrite&lt;br /&gt;
sudo -u postgres psql&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Внутри psql задаётся пароль:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
ALTER USER dendrite WITH PASSWORD 'strong_password';&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Сборка Dendrite ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /opt&lt;br /&gt;
sudo git clone https://github.com/matrix-org/dendrite.git&lt;br /&gt;
sudo chown -R $USER:$USER /opt/dendrite&lt;br /&gt;
cd /opt/dendrite&lt;br /&gt;
&lt;br /&gt;
go build -o bin/dendrite ./cmd/dendrite&lt;br /&gt;
go build -o bin/create-account ./cmd/create-account&lt;br /&gt;
go build -o bin/generate-config ./cmd/generate-config&lt;br /&gt;
go build -o bin/generate-keys ./cmd/generate-keys &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Генерация конфигурации Dendrite ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /opt/dendrite&lt;br /&gt;
&lt;br /&gt;
./bin/generate-keys --private-key matrix_key.pem&lt;br /&gt;
&lt;br /&gt;
./bin/generate-config &lt;br /&gt;
--server ramba-art.ru &lt;br /&gt;
--db postgresql://dendrite:password@localhost/dendrite?sslmode=disable &lt;br /&gt;
--private-key matrix_key.pem \&lt;br /&gt;
&lt;br /&gt;
&amp;gt; dendrite.yaml&lt;br /&gt;
&amp;gt;&lt;br /&gt;
&amp;gt; &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После генерации конфиг редактируется вручную.&lt;br /&gt;
&lt;br /&gt;
Важные параметры:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
global:&lt;br /&gt;
  server_name: ramba-art.ru&lt;br /&gt;
&lt;br /&gt;
media_api:&lt;br /&gt;
base_path: media&lt;br /&gt;
max_file_size_bytes: 10485760 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Systemd-сервис Dendrite ==&lt;br /&gt;
&lt;br /&gt;
Создаётся файл:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo nano /etc/systemd/system/dendrite.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Dendrite Matrix Server&lt;br /&gt;
After=network.target postgresql.service&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=simple&lt;br /&gt;
WorkingDirectory=/opt/dendrite&lt;br /&gt;
ExecStart=/opt/dendrite/dendrite -config /opt/dendrite/dendrite.yaml&lt;br /&gt;
Restart=always&lt;br /&gt;
RestartSec=5&lt;br /&gt;
User=artem&lt;br /&gt;
Group=artem&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Запуск:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo systemctl daemon-reload&lt;br /&gt;
sudo systemctl enable --now dendrite&lt;br /&gt;
sudo systemctl status dendrite&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Настройка Reverse Proxy для Dendrite ==&lt;br /&gt;
&lt;br /&gt;
На стороне BrainyCP/Nginx создаётся HTTPS-сайт:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
chat.ramba-art.ru&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Он проксирует запросы на:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
http://192.168.1.50:8008&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Важные заголовки:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nginx&amp;quot;&amp;gt;&lt;br /&gt;
proxy_set_header Host $host;&lt;br /&gt;
proxy_set_header X-Real-IP $remote_addr;&lt;br /&gt;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;&lt;br /&gt;
proxy_set_header X-Forwarded-Proto https;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Настройка .well-known ==&lt;br /&gt;
&lt;br /&gt;
Для красивых Matrix ID вида:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
@user:ramba-art.ru&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
нужно настроить .well-known на основном домене.&lt;br /&gt;
&lt;br /&gt;
Файл:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
https://ramba-art.ru/.well-known/matrix/server&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Содержимое:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;m.server&amp;quot;: &amp;quot;chat.ramba-art.ru:443&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
https://ramba-art.ru/.well-known/matrix/client&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Содержимое:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;m.homeserver&amp;quot;: {&lt;br /&gt;
    &amp;quot;base_url&amp;quot;: &amp;quot;https://chat.ramba-art.ru&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Установка Element Web ==&lt;br /&gt;
&lt;br /&gt;
Element Web размещается на отдельном поддомене:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
element.ramba-art.ru&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример config.json:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;default_server_config&amp;quot;: {&lt;br /&gt;
    &amp;quot;m.homeserver&amp;quot;: {&lt;br /&gt;
      &amp;quot;base_url&amp;quot;: &amp;quot;https://chat.ramba-art.ru&amp;quot;,&lt;br /&gt;
      &amp;quot;server_name&amp;quot;: &amp;quot;ramba-art.ru&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;disable_custom_urls&amp;quot;: true,&lt;br /&gt;
  &amp;quot;disable_guests&amp;quot;: true,&lt;br /&gt;
  &amp;quot;brand&amp;quot;: &amp;quot;RAMBA Chat&amp;quot;,&lt;br /&gt;
  &amp;quot;default_theme&amp;quot;: &amp;quot;dark&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Плюсы отдельного поддомена для Element:&lt;br /&gt;
&lt;br /&gt;
* проще обслуживать веб-клиент;&lt;br /&gt;
* можно независимо обновлять Element;&lt;br /&gt;
* можно брендировать интерфейс;&lt;br /&gt;
* пользователю не нужно вручную вводить homeserver.&lt;br /&gt;
&lt;br /&gt;
Минусы:&lt;br /&gt;
&lt;br /&gt;
* нужен отдельный SSL-сертификат;&lt;br /&gt;
* при проблемах с репутацией домена браузер может блокировать страницу.&lt;br /&gt;
&lt;br /&gt;
== Настройка Coturn ==&lt;br /&gt;
&lt;br /&gt;
Установка:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt install -y coturn&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Включение сервиса:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo sed -i 's/#TURNSERVER_ENABLED=1/TURNSERVER_ENABLED=1/' /etc/default/coturn&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример конфигурации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
listening-port=3478&lt;br /&gt;
tls-listening-port=5349&lt;br /&gt;
&lt;br /&gt;
listening-ip=192.168.1.50&lt;br /&gt;
relay-ip=192.168.1.50&lt;br /&gt;
external-ip=195.138.232.82&lt;br /&gt;
&lt;br /&gt;
use-auth-secret&lt;br /&gt;
static-auth-secret=SECRET&lt;br /&gt;
realm=ramba-art.ru&lt;br /&gt;
&lt;br /&gt;
fingerprint&lt;br /&gt;
lt-cred-mech&lt;br /&gt;
no-multicast-peers&lt;br /&gt;
no-cli&lt;br /&gt;
&lt;br /&gt;
min-port=49152&lt;br /&gt;
max-port=49252 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Запуск:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo systemctl enable --now coturn&lt;br /&gt;
sudo systemctl status coturn&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Настройка TURN в Dendrite ==&lt;br /&gt;
&lt;br /&gt;
В dendrite.yaml указывается TURN-сервер:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
client_api:&lt;br /&gt;
  turn:&lt;br /&gt;
    turn_user_lifetime: &amp;quot;5m&amp;quot;&lt;br /&gt;
    turn_uris:&lt;br /&gt;
      - &amp;quot;turn:turn.ramba-art.ru:3478?transport=udp&amp;quot;&lt;br /&gt;
      - &amp;quot;turn:turn.ramba-art.ru:3478?transport=tcp&amp;quot;&lt;br /&gt;
      - &amp;quot;turns:turn.ramba-art.ru:5349?transport=tcp&amp;quot;&lt;br /&gt;
    turn_shared_secret: &amp;quot;SECRET&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Секрет в Dendrite должен совпадать со значением static-auth-secret в Coturn.&lt;br /&gt;
&lt;br /&gt;
Проверка:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
curl -s https://chat.ramba-art.ru/_matrix/client/v3/voip/turnServer&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если всё настроено правильно, сервер отдаёт временные TURN-креды.&lt;br /&gt;
&lt;br /&gt;
== Проброс портов ==&lt;br /&gt;
&lt;br /&gt;
На внешнем маршрутизаторе или firewall нужно пробросить на VM ramba-chat:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Порт&lt;br /&gt;
! Протокол&lt;br /&gt;
&lt;br /&gt;
| ! Назначение |&lt;br /&gt;
| ------------ |&lt;br /&gt;
| 3478         |&lt;br /&gt;
| TCP/UDP      |&lt;br /&gt;
| STUN/TURN    |&lt;br /&gt;
| -            |&lt;br /&gt;
| 5349         |&lt;br /&gt;
| TCP          |&lt;br /&gt;
| TURNS        |&lt;br /&gt;
| -            |&lt;br /&gt;
| 49152-49252  |&lt;br /&gt;
| UDP          |&lt;br /&gt;
| TURN relay   |&lt;br /&gt;
| }            |&lt;br /&gt;
&lt;br /&gt;
== Регистрация пользователей ==&lt;br /&gt;
&lt;br /&gt;
Для корпоративного сервера не рекомендуется открывать публичную регистрацию.&lt;br /&gt;
&lt;br /&gt;
Рекомендуемая схема:&lt;br /&gt;
&lt;br /&gt;
* регистрация закрыта;&lt;br /&gt;
* пользователей создаёт администратор;&lt;br /&gt;
* после первого входа пользователь меняет временный пароль.&lt;br /&gt;
&lt;br /&gt;
Создание пользователя:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /opt/dendrite&lt;br /&gt;
&lt;br /&gt;
./create-account &lt;br /&gt;
--config dendrite.yaml &lt;br /&gt;
--username username &lt;br /&gt;
--password 'temporary_password' &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример результата:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
@username:ramba-art.ru&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Плюсы закрытой регистрации:&lt;br /&gt;
&lt;br /&gt;
* нет спама;&lt;br /&gt;
* нет случайных пользователей;&lt;br /&gt;
* проще управлять безопасностью;&lt;br /&gt;
* подходит для корпоративного мессенджера.&lt;br /&gt;
&lt;br /&gt;
Минусы:&lt;br /&gt;
&lt;br /&gt;
* пользователей нужно создавать вручную или через скрипт;&lt;br /&gt;
* нужен регламент выдачи доступов;&lt;br /&gt;
* нужно продумать удаление или блокировку уволенных сотрудников.&lt;br /&gt;
&lt;br /&gt;
== Медиафайлы ==&lt;br /&gt;
&lt;br /&gt;
В Dendrite медиа хранятся в каталоге:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
/opt/dendrite/media&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В конфигурации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
media_api:&lt;br /&gt;
  base_path: media&lt;br /&gt;
  max_file_size_bytes: 10485760&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Лимит одного файла:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
10 MB&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если комната зашифрована, Element шифрует вложения на клиенте перед загрузкой. Сервер хранит зашифрованный blob и не имеет ключей расшифровки.&lt;br /&gt;
&lt;br /&gt;
Если комната не зашифрована, сервер хранит обычные медиафайлы.&lt;br /&gt;
&lt;br /&gt;
Рекомендации:&lt;br /&gt;
&lt;br /&gt;
* рабочие комнаты создавать с E2EE;&lt;br /&gt;
* каталог media включить в резервное копирование;&lt;br /&gt;
* при росте объёма вынести media на отдельное хранилище;&lt;br /&gt;
* PostgreSQL не выносить на NFS.&lt;br /&gt;
&lt;br /&gt;
== Вариант выноса медиа на NFS/OMV ==&lt;br /&gt;
&lt;br /&gt;
Для роста системы можно вынести только медиафайлы на OMV NFS.&lt;br /&gt;
&lt;br /&gt;
Рекомендуемая схема:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
VM ramba-chat&lt;br /&gt;
  |-- PostgreSQL локально&lt;br /&gt;
  |-- Dendrite локально&lt;br /&gt;
  |-- JetStream локально&lt;br /&gt;
  |-- /opt/dendrite/media -&amp;gt; NFS OMV&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Плюсы:&lt;br /&gt;
&lt;br /&gt;
* медиа не раздувают диск VM;&lt;br /&gt;
* проще расширять хранилище;&lt;br /&gt;
* удобно делать отдельные бэкапы;&lt;br /&gt;
* можно использовать шифрование дисков на OMV.&lt;br /&gt;
&lt;br /&gt;
Минусы:&lt;br /&gt;
&lt;br /&gt;
* появляется зависимость от сети и OMV;&lt;br /&gt;
* при недоступности NFS будут проблемы с загрузкой и скачиванием файлов;&lt;br /&gt;
* нужна аккуратная настройка прав доступа;&lt;br /&gt;
* база данных и JetStream должны оставаться локально.&lt;br /&gt;
&lt;br /&gt;
== Резервное копирование ==&lt;br /&gt;
&lt;br /&gt;
Обязательно резервировать:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
PostgreSQL database dendrite&lt;br /&gt;
/opt/dendrite&lt;br /&gt;
/opt/dendrite/media&lt;br /&gt;
/etc/turnserver.conf&lt;br /&gt;
/etc/systemd/system/dendrite.service&lt;br /&gt;
Element config.json&lt;br /&gt;
Nginx/BrainyCP vhost-конфиги&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример резервного копирования конфигов:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo tar czf /root/ramba-matrix-configs-$(date +%F).tar.gz \&lt;br /&gt;
/opt/dendrite \&lt;br /&gt;
/etc/turnserver.conf \&lt;br /&gt;
/etc/systemd/system/dendrite.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример дампа PostgreSQL:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo -u postgres pg_dump dendrite &amp;gt; /root/dendrite-$(date +%F).sql&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Проверка работоспособности ==&lt;br /&gt;
&lt;br /&gt;
Проверка .well-known:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
curl -s https://ramba-art.ru/.well-known/matrix/server&lt;br /&gt;
curl -s https://ramba-art.ru/.well-known/matrix/client&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Проверка Matrix API:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
curl -s https://chat.ramba-art.ru/_matrix/client/versions&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Проверка Dendrite:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo systemctl status dendrite --no-pager&lt;br /&gt;
sudo journalctl -u dendrite -n 80 --no-pager&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Проверка Coturn:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo systemctl status coturn --no-pager&lt;br /&gt;
sudo ss -tulpn | grep turnserver&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Проверка TURN-кредов:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
curl -s https://chat.ramba-art.ru/_matrix/client/v3/voip/turnServer&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Тестирование звонков ==&lt;br /&gt;
&lt;br /&gt;
Финальный тест:&lt;br /&gt;
&lt;br /&gt;
* создать двух пользователей;&lt;br /&gt;
* войти в Element с двух разных устройств;&lt;br /&gt;
* желательно использовать мобильную сеть, а не один Wi-Fi;&lt;br /&gt;
* проверить личный чат;&lt;br /&gt;
* проверить аудиозвонок;&lt;br /&gt;
* проверить видеозвонок.&lt;br /&gt;
&lt;br /&gt;
Успешный звонок через мобильного оператора подтверждает, что работают:&lt;br /&gt;
&lt;br /&gt;
* Dendrite;&lt;br /&gt;
* Element;&lt;br /&gt;
* WebRTC;&lt;br /&gt;
* STUN;&lt;br /&gt;
* TURN;&lt;br /&gt;
* NAT traversal;&lt;br /&gt;
* reverse proxy;&lt;br /&gt;
* SSL.&lt;br /&gt;
&lt;br /&gt;
== Плюсы выбранной архитектуры ==&lt;br /&gt;
&lt;br /&gt;
* полный контроль над данными;&lt;br /&gt;
* собственные Matrix ID на домене ramba-art.ru;&lt;br /&gt;
* независимость от сторонних SaaS-мессенджеров;&lt;br /&gt;
* поддержка Android, iOS и Web;&lt;br /&gt;
* поддержка аудио- и видеосвязи;&lt;br /&gt;
* поддержка E2EE;&lt;br /&gt;
* простая архитектура на одной VM;&lt;br /&gt;
* PostgreSQL локально для надёжности;&lt;br /&gt;
* медиа можно вынести на отдельное хранилище;&lt;br /&gt;
* reverse proxy и SSL централизованы через BrainyCP.&lt;br /&gt;
&lt;br /&gt;
== Минусы выбранной архитектуры ==&lt;br /&gt;
&lt;br /&gt;
* требуется администрирование сервера;&lt;br /&gt;
* нужно следить за Dendrite, PostgreSQL, Coturn и Element;&lt;br /&gt;
* требуется регулярный backup;&lt;br /&gt;
* требуется ручное создание пользователей или отдельный скрипт;&lt;br /&gt;
* Dendrite менее зрелый, чем Synapse;&lt;br /&gt;
* звонки зависят от правильной настройки TURN;&lt;br /&gt;
* при проблемах с доменной репутацией браузер может блокировать Element;&lt;br /&gt;
* при росте нагрузки может потребоваться отдельное масштабирование.&lt;br /&gt;
&lt;br /&gt;
== Рекомендации по эксплуатации ==&lt;br /&gt;
&lt;br /&gt;
* держать регистрацию закрытой;&lt;br /&gt;
* создавать пользователей централизованно;&lt;br /&gt;
* использовать E2EE для рабочих комнат;&lt;br /&gt;
* регулярно проверять резервные копии;&lt;br /&gt;
* не хранить PostgreSQL на NFS;&lt;br /&gt;
* следить за размером /opt/dendrite/media;&lt;br /&gt;
* обновлять Element Web отдельно от Dendrite;&lt;br /&gt;
* фиксировать изменения конфигов в отдельной Wiki-странице;&lt;br /&gt;
* после стабильного запуска создать snapshot VM в Proxmox.&lt;br /&gt;
&lt;br /&gt;
== Итог ==&lt;br /&gt;
&lt;br /&gt;
Выбранная архитектура подходит для собственного корпоративного мессенджера RAMBA.&lt;br /&gt;
&lt;br /&gt;
Она даёт контроль над пользователями, сообщениями, медиафайлами и доменом, при этом остаётся достаточно простой для сопровождения: одна VM, один Matrix homeserver, PostgreSQL, Coturn и Element Web.&lt;br /&gt;
&lt;br /&gt;
Для текущего этапа архитектура считается рабочей. Дальнейшие улучшения:&lt;br /&gt;
&lt;br /&gt;
* автоматизация создания пользователей;&lt;br /&gt;
* настройка регулярного backup;&lt;br /&gt;
* вынос media store на OMV/NFS;&lt;br /&gt;
* брендирование Element;&lt;br /&gt;
* мониторинг сервисов;&lt;br /&gt;
* исправление репутации домена в Google Safe Browsing.&lt;/div&gt;</summary>
		<author><name>192.168.1.1</name></author>
	</entry>
</feed>