Element Call: видеозвонки в Matrix на своём сервере

Схема архитектуры Element Call: центральный сервер соединён с экранами участников видеозвонка

Element Call: видеозвонки в Matrix на своём сервере

Видеоконференции в корпоративной среде — требование, а не опция. Но большинство решений привязаны к чужим серверам, а сквозное шифрование остаётся маркетинговым обещанием. Element Call решает обе проблемы: встроенные видеозвонки внутри протокола Matrix, полное шифрование по умолчанию, развёртывание на собственной инфраструктуре. В этой статье — архитектура, установка, сравнение с Jitsi Meet и ограничения, которые нужно учитывать.

Element Call — архитектура видеозвонков в Matrix с E2E-шифрованием
Element Call — система видеозвонков с открытым исходным кодом (Apache 2.0), встроенная в протокол Matrix. Работает через Synapse, поддерживает сквозное шифрование и масштабируется до сотен участников через SFU на базе LiveKit.

Содержание

Что такое Element Call

Element Call — система видеозвонков, встроенная в протокол Matrix. До её появления групповые звонки в Element работали через сторонний Jitsi Video Bridge: отдельный сервер, отдельная инфраструктура, отдельное шифрование. Element Call заменила Jitsi встроенным решением на базе спецификации MatrixRTC (MSC 3401).

Ключевое отличие — звонок происходит внутри Matrix-комнаты. Сигнализация идёт через Synapse, медиапотоки передаются напрямую между участниками или через SFU-сервер. Отдельный медиа-сервер не нужен: достаточно работающего Synapse с включёнными экспериментальными функциями.

Проект распространяется под лицензией Apache 2.0 — полностью открытый исходный код. Развивается командой Element (ранее New Vector), основными разработчиками протокола Matrix. Код доступен на GitHub.

Element Call интегрирован в клиенты Element Web, Element Desktop и мобильные приложения Element X. Звонок можно начать прямо из чата — без переключения на внешний сервис. Пользователи самостоятельно развёрнутых серверов получают защищённую видеосвязь без зависимости от облачных платформ.

Сравнение архитектур Full Mesh и SFU для видеозвонков Element Call

Возможности Element Call

Element Call поддерживает два формата: звонки 1:1 и групповые конференции. В обоих случаях доступен полный набор функций видеосвязи.

Шифрование

Сквозное шифрование (E2EE) применяется ко всем медиапотокам — видео и аудио. В отличие от решений, где шифрование включается опционально, Element Call шифрует звонки по умолчанию. Ключи шифрования управляются через Matrix — тот же механизм, что защищает текстовые сообщения.

Демонстрация экрана

Участники могут транслировать экран одновременно — ограничения на одного докладчика нет. При включении демонстрации экрана активируется режим Spotlight: экран выносится на передний план, а видео участников отображается в миниатюрах.

Гостевой доступ

Звонок можно создать по ссылке. Гость подключается через браузер без регистрации и установки клиента. Поддерживаются Chrome, Firefox и Safari.

Интерфейс

Динамическая сетка участников адаптируется к количеству подключённых. Плитки с видео можно перетаскивать и разворачивать двойным щелчком. Доступен выбор камеры и микрофона, управление громкостью, режим «картинка в картинке» (Picture-in-Picture).

Element Call vs Jitsi Meet — сравнение видеоконференций

Архитектура: Full Mesh и SFU

Element Call использует две модели передачи медиапотоков: Full Mesh и SFU. Выбор происходит автоматически в зависимости от числа участников и наличия SFU-сервера.

Full Mesh

В режиме Full Mesh каждый участник устанавливает прямое WebRTC-соединение с каждым другим участником. При 5 участниках каждый отправляет 4 потока и принимает 4 — итого 20 соединений. Это простая модель, но нагрузка растёт квадратично: стабильная работа до 7–8 участников.

Преимущество — нулевая серверная нагрузка. Медиа идёт напрямую между клиентами, сервер участвует только в сигнализации.

SFU (Selective Forwarding Unit)

SFU — центральный узел, который принимает поток от каждого участника и пересылает остальным. Каждый клиент отправляет один поток вместо N. Нагрузка на клиент растёт линейно, а не квадратично.

Element Call использует LiveKit в качестве SFU-сервера. LiveKit — открытая платформа для WebRTC, построенная на Pion (Go). При наличии LiveKit-сервера Element Call поддерживает до 100 и более участников.

Логика выбора: если SFU настроен в .well-known/matrix/client — используется SFU. Если нет — Full Mesh. Для команд до 5–7 человек Full Mesh достаточен. Для совещаний от 10 участников — нужен LiveKit.

Element Call vs Jitsi Meet

Element Call и Jitsi Meet решают одну задачу — видеоконференции на собственном сервере. Но архитектурно это разные системы.

КритерийElement CallJitsi Meet
ПротоколMatrix (MatrixRTC / MSC 3401)XMPP + WebRTC (JVB)
Сквозное шифрованиеДа, по умолчаниюДа, опционально
Отдельный серверНет (работает через Synapse)Да (JVB + Prosody + Jicofo)
Макс. участников100+ (SFU) / 7–8 (Full Mesh)100+ (JVB)
Гостевой доступДаДа
SIP-совместимостьНетДа (Jigasi)
Запись звонковНетДа (Jibri)
МессенджерElement (Matrix)Нет (только звонки)
ЛицензияApache 2.0Apache 2.0

Когда выбрать Element Call: компания уже использует Matrix для сообщений, нужно сквозное шифрование по умолчанию, не хочется поддерживать отдельный набор компонентов.

Когда выбрать Jitsi: нужна SIP-телефония, запись звонков, мессенджер не Matrix. Подробнее об установке и настройке Jitsi — в нашей статье о Jitsi Meet.

Если вы сравниваете корпоративные мессенджеры в целом — читайте сравнение Matrix, Mattermost и Rocket.Chat.

Установка Element Call на своём сервере

Element Call разворачивается как статическое веб-приложение. Для полноценной работы нужны три компонента: Synapse, LiveKit и MatrixRTC Authorization Service.

Требования

  • Synapse с включёнными MSC 3266, MSC 4140, MSC 4222
  • Docker и Docker Compose
  • Домен с SSL-сертификатом
  • Nginx или Caddy в качестве реверс-прокси

Настройка Synapse

В homeserver.yaml добавьте экспериментальные функции:

experimental_features:
  msc3266_enabled: true
  msc4140_enabled: true
  msc4222_enabled: true

max_event_delay_duration: 24h

rc_message:
  per_second: 0.5
  burst_count: 30

Параметр msc4140_enabled активирует отложенные события (delayed events), необходимые для корректной сигнализации звонков. Без него звонки могут зависать в состоянии «активен» после отключения участников.

LiveKit и MatrixRTC

Для масштабных звонков (от 10 участников) нужны два дополнительных сервиса: LiveKit SFU (порт 7880) и MatrixRTC Authorization Service (порт 8080). Оба разворачиваются через Docker Compose.

Настройка реверс-прокси

Пример конфигурации Nginx для маршрутизации запросов к LiveKit:

location ^~ /livekit/jwt/ {
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_pass http://localhost:8080/;
}

location ^~ /livekit/sfu/ {
    proxy_set_header Host $host;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_send_timeout 120;
    proxy_read_timeout 120;
    proxy_buffering off;
    proxy_pass http://localhost:7880/;
}

Объявление SFU

В .well-known/matrix/client добавьте адрес SFU-сервиса:

{
  "org.matrix.msc4143.rtc_foci": [
    {
      "type": "livekit",
      "livekit_service_url": "https://matrix.example.com/livekit/jwt"
    }
  ]
}

Сборка клиента

Клиентская часть собирается в статические файлы:

git clone https://github.com/element-hq/element-call.git
cd element-call
corepack enable
yarn
yarn build

Результат — каталог dist/ со статикой. Отдайте его через Nginx с правилом try_files $uri /index.html.

Ограничения и планы развития

Element Call активно развивается, но у текущей версии есть ограничения, которые нужно учитывать при планировании внедрения.

Текущие ограничения

  • Full Mesh — до 7–8 участников. Без SFU-сервера групповые звонки ограничены пропускной способностью клиентов. При 10 участниках качество падает.
  • SFU требует дополнительной инфраструктуры. LiveKit — отдельный сервис, который нужно развернуть, настроить и поддерживать. Это усложняет архитектуру по сравнению с базовым Synapse.
  • Нет SIP-совместимости. Подключить аналоговые телефоны или АТС к Element Call нельзя. Для этого нужен Jitsi с Jigasi.
  • Нет записи звонков. Встроенного механизма записи нет. Для записи потребуется стороннее решение.
  • Одно устройство на пользователя. Один аккаунт не может присоединиться к звонку с двух устройств одновременно.

Направления развития

Команда Element продолжает работу над спецификацией MatrixRTC. Основные направления: повышение стабильности SFU-режима, оптимизация потребления ресурсов на клиенте, расширение интеграции с Element X. Спецификация MSC 3401 находится в процессе принятия в ядро протокола Matrix, что обеспечит совместимость с любыми Matrix-клиентами.

Итог

Часто задаваемые вопросы

Ответы на частые вопросы об Element Call — от развёртывания до сравнения с Jitsi Meet.
Нет. Element Call работает через существующий Synapse. Для звонков до 7–8 участников дополнительных сервисов не требуется. Для масштабных конференций понадобится LiveKit SFU — отдельный Docker-контейнер.
Без SFU — до 7–8 участников в режиме Full Mesh. С LiveKit SFU — 100 и более участников. Количество зависит от пропускной способности сервера.
Нет. Element Call работает поверх протокола Matrix и требует Synapse или совместимый домашний сервер. Однако гости могут подключаться к звонку через браузер по ссылке без учётной записи Matrix.
Да. Element Call распространяется под лицензией Apache 2.0 — открытый исходный код, без ограничений на коммерческое использование. Оплачивается только серверная инфраструктура.
Включите экспериментальные MSC (3266, 4140, 4222) в homeserver.yaml, настройте rate limiting и добавьте запись SFU в .well-known/matrix/client. Клиенты Element Web и Element X автоматически обнаружат SFU.
Element Call — если компания уже использует Matrix и нужно сквозное шифрование по умолчанию. Jitsi — если нужна SIP-телефония, запись звонков или мессенджер не Matrix. Подробное сравнение — в таблице выше.
Да. Element Call разворачивается на собственном сервере и не зависит от внешних облачных сервисов. Весь трафик остаётся внутри вашей инфраструктуры. Блокировки не влияют на работу локального развёртывания.
Планируете внедрить защищённую видеосвязь на базе Matrix? Поможем развернуть Element с видеозвонками на вашем сервере.