Jitsi Meet: различия между версиями
Нет описания правки |
Нет описания правки |
||
Строка 5: | Строка 5: | ||
Jicofo — XMPP-компонент, модератор видеоконференций. Клиенты договариваются о связи, заходя в общую XMPP-комнату с ним, и обмениваются там XMPP-сообщениями. Имеет HTTP API {{path|/about/health}} для опроса о состоянии сервиса. | Jicofo — XMPP-компонент, модератор видеоконференций. Клиенты договариваются о связи, заходя в общую XMPP-комнату с ним, и обмениваются там XMPP-сообщениями. Имеет HTTP API {{path|/about/health}} для опроса о состоянии сервиса. | ||
Jitsi Videobridge — ключевой компонент системы, abbr title="Selective Forwarding Unit">SFU</abbr>. Он передаёт видео и аудио между участниками, осуществляя роль посредника, терминирует RTP/RTCP, определяет доступные рамки битрейта в обе стороны на конкретного клиента. Имеет свой внутренний HTTP API для мониторинга ({{path|/colibri/debug}}). | Jitsi Videobridge — ключевой компонент системы, <abbr title="Selective Forwarding Unit">SFU</abbr>. Он передаёт видео и аудио между участниками, осуществляя роль посредника, терминирует RTP/RTCP, определяет доступные рамки битрейта в обе стороны на конкретного клиента. Имеет свой внутренний HTTP API для мониторинга ({{path|/colibri/debug}}). | ||
Это <abbr title="Selective Forwarding Unit">SFU</abbr>, не <abbr title="Multipoint Conferencing Unit">MCU</abbr> — он не занимается транскодингом и поэтому потребляет относительно мало CPU. | Это <abbr title="Selective Forwarding Unit">SFU</abbr>, не <abbr title="Multipoint Conferencing Unit">MCU</abbr> — он не занимается транскодингом и поэтому потребляет относительно мало CPU. | ||
Строка 11: | Строка 11: | ||
Jigasi — шлюз для участия в Jitsi-конференциях через SIP-телефонию. | Jigasi — шлюз для участия в Jitsi-конференциях через SIP-телефонию. | ||
Jibri — appliance для записи конференции. использует Selenium с Chromium внутри (и тянет за собой зависимости на Xorg, icewm, модуль ядра snd-aloop). Ведёт себя как ничего не передающий участник записываемой конференции, но Jicofo и клиенты его держат на особом положении. Также заходит по отдельному аккаунту в специальную XMPP-комнату для рекордеров. Их можно (и нужно!) воткнуть несколько, если планируется вести запись нескольких конференций | Jibri — appliance для записи конференции. использует Selenium с Chromium внутри (и тянет за собой зависимости на Xorg, icewm, модуль ядра snd-aloop). Ведёт себя как ничего не передающий участник записываемой конференции, но Jicofo и клиенты его держат на особом положении: не отображают в списке участников и т. п. Также, как и JVB, Jigasi, заходит по отдельному аккаунту в специальную XMPP-комнату для рекордеров. Их можно (и нужно!) воткнуть несколько, если планируется вести запись нескольких конференций одновременно. | ||
== Как развернуть? == | == Как развернуть? == | ||
Строка 30: | Строка 30: | ||
Теоретически компоненты могут размещаться на разных машинах; на практике мы не рекомендуем устанавливать {{pkg|prosody}} и {{pkg|jicofo}} на разные машины — это может привести к низкой производительности сервиса и большим колебаниям задержки связи. | Теоретически компоненты могут размещаться на разных машинах; на практике мы не рекомендуем устанавливать {{pkg|prosody}} и {{pkg|jicofo}} на разные машины — это может привести к низкой производительности сервиса и большим колебаниям задержки связи. | ||
При настройке будем предполагать, что в качестве базового доменного имени выбрано {{term|$DOMAIN}}. | При настройке будем предполагать, что в качестве базового доменного имени выбрано {{term|$DOMAIN}}. | ||
На всех используемых машинах убедитесь, что команда <source lang="shell">ping $(hostname)</source> успешно срабатывает: уходят запросы и приходят ответы. | |||
Настройка XMPP-сервера | ==== Настройка XMPP-сервера ==== | ||
В файл {{path|/etc/prosody/$DOMAIN.cfg.lua}} напишите: | В файл {{path|/etc/prosody/$DOMAIN.cfg.lua}} напишите: | ||
Строка 106: | Строка 107: | ||
Component "conferenceduration.$DOMAIN" "conference_duration_component" | Component "conferenceduration.$DOMAIN" "conference_duration_component" | ||
muc_component = "conference.$DOMAIN" | muc_component = "conference.$DOMAIN" | ||
</source> | </source> | ||
Строка 124: | Строка 124: | ||
</pre> | </pre> | ||
Настройка Jicofo | ==== Настройка Jicofo ==== | ||
Jicofo подключается к XMPP-серверу и как внешний XMPP-компонент, и как юзер-аккаунт с JID {{term|focus@auth.$DOMAIN}} | Jicofo подключается к XMPP-серверу и как внешний XMPP-компонент, и как юзер-аккаунт с JID {{term|focus@auth.$DOMAIN}} | ||
Строка 135: | Строка 135: | ||
# sets the XMPP domain (default: none) | # sets the XMPP domain (default: none) | ||
JICOFO_HOSTNAME= | JICOFO_HOSTNAME=$DOMAIN | ||
# sets the secret used to authenticate as an XMPP component | # sets the secret used to authenticate as an XMPP component | ||
Строка 147: | Строка 147: | ||
# sets the XMPP domain name to use for XMPP user logins | # sets the XMPP domain name to use for XMPP user logins | ||
JICOFO_AUTH_DOMAIN=auth. | JICOFO_AUTH_DOMAIN=auth.$DOMAIN | ||
# sets the username to use for XMPP user logins | # sets the username to use for XMPP user logins | ||
Строка 185: | Строка 185: | ||
curl -i localhost:8888/about/health | curl -i localhost:8888/about/health | ||
</pre> | </pre> | ||
Так как пока что ни одного Jitsi Videobridge к серверу не подключено, | Так как пока что ни одного Jitsi Videobridge к серверу не подключено, jicofo ответит кодом ответа 500 и сообщением {{term|No operational bridges available}}. | ||
Если в ответе сообщение об ошибке иного рода — проверьте настройки и связь между prosody и jicofo. | Если в ответе сообщение об ошибке иного рода — проверьте настройки и связь между prosody и jicofo. | ||
Настройка Jitsi Videobridge (JVB) | ==== Настройка Jitsi Videobridge (JVB) ==== | ||
В /etc/jitsi/videobridge/config укажите: | В /etc/jitsi/videobridge/config укажите: | ||
Строка 209: | Строка 209: | ||
В файле /etc/jitsi/videobridge/application.conf укажите: | В файле /etc/jitsi/videobridge/application.conf укажите: | ||
<pre> | |||
videobridge { | |||
stats { | |||
enabled = true | |||
transports = [ | |||
{ type = "muc" } | |||
] | |||
} | |||
apis { | |||
xmpp-client { | |||
configs { | |||
shard { | |||
hostname = "localhost" | |||
domain = "auth.$DOMAIN" | |||
username = "jvb" | |||
password = "[yyy-jvb]" | |||
muc_jids = "JvbBrewery@internal.auth.$DOMAIN" | |||
# The muc_nickname must be unique across all instances | |||
muc_nickname = "jvb-mid-123" | |||
} | |||
} | |||
} | |||
} | |||
} | |||
</pre> | |||
Вместо слова shard можно использовать любой идентификатор (оно идентифицирует подключение к xmpp-серверу и jicofo). | |||
Аккаунт {{term|jvb@auth.$DOMAIN}} тоже нужно завести на XMPP-сервере: | |||
<pre> | |||
prosodyctl register jvb auth.$DOMAIN "[yyy-jvb]" | |||
</pre> | |||
Если JVB-машина отделена от клиентов при помощи NAT, то потребуется донастройка: подробнее [https://jitsi.github.io/handbook/docs/devops-guide/devops-guide-quickstart#advanced-configuration здесь]. | |||
Запустите JVB: | |||
<pre> | |||
systemctl start jitsi-videobridge | |||
</pre> | |||
Если всё сделано правильно и между JVB и jicofo есть связь, jicofo на healthcheck-запрос будет отдавать HTTP-код 200. | |||
==== Настройка web-приложения Jitsi Meet ==== | |||
В `/usr/share/doc/jitsi-meet-*` есть примеры конфигурации для веб-клиента (*-config.js) и веб-сервера. Мы рекомендуем при настройке веб-сервера за основу взять пример оттуда. | |||
<div class="toccolours mw-collapsible mw-collapsed"> | |||
Приведём ниже подробный разбор этого примера: | |||
<div class="mw-collapsible-content"> | |||
<pre> | |||
server { | |||
listen 443 ssl http2; | |||
listen [::]:443 ssl http2; | |||
server_name $DOMAIN; | |||
root /usr/share/jitsi-meet; | |||
# ssi on with javascript for multidomain variables in config.js | |||
ssi on; | |||
ssi_types application/x-javascript application/javascript; | |||
</pre> | |||
Помимо конференций вида https://jitsi-meet.example.com/ConferenceName, Jitsi Meet также поддерживает URL-адреса конференций вида https://jitsi-meet.example.com/Subdomain/ConferenceName, где для разных значений Subdomain используются разные настройки и виртуалхосты на XMPP-сервере. | |||
SSI нужны как минимум для динамической подстановки этих значений в {{term|config.js}}. | |||
<pre> | |||
index index.html index.htm; | |||
error_page 404 /static/404.html; | |||
</pre> | |||
<pre> | |||
gzip on; | |||
gzip_types text/plain text/css application/javascript application/json; | |||
gzip_vary on; | |||
location = /config.js { | |||
alias /etc/jitsi/meet/jitsi.murbly.net-config.js; | |||
} | |||
location = /external_api.js { | |||
alias /usr/share/jitsi-meet/libs/external_api.min.js; | |||
} | |||
#ensure all static content can always be found first | |||
location ~ ^/(libs|css|static|images|fonts|lang|sounds|connection_optimization|.well-known)/(.*)$ | |||
{ | |||
add_header 'Access-Control-Allow-Origin' '*'; | |||
alias /usr/share/jitsi-meet/$1/$2; | |||
} | |||
# BOSH | |||
location = /http-bind { | |||
proxy_pass http://localhost:5280/http-bind; | |||
proxy_set_header X-Forwarded-For $remote_addr; | |||
proxy_set_header Host $http_host; | |||
} | |||
# xmpp websockets | |||
location = /xmpp-websocket { | |||
proxy_pass http://127.0.0.1:5280/xmpp-websocket?prefix=$prefix&$args; | |||
proxy_http_version 1.1; | |||
proxy_set_header Upgrade $http_upgrade; | |||
proxy_set_header Connection "upgrade"; | |||
proxy_set_header Host $http_host; | |||
tcp_nodelay on; | |||
} | |||
</pre> | |||
</div> | |||
</div> | |||
Чтобы проверить, всё ли в порядке, зайдите на {{term|https://$DOMAIN}} и присоединитесь к произвольной конференции, а затем 2-3 раза продублируйте вкладку веб-браузера. | |||
Трёх (в случае выключенного p2p — двух) анонимных участников достаточно, чтобы начать обмен медиапотоками; если увидите три изображения с камеры — система готова к использованию. | |||
=== Подключение SIP-шлюза jigasi === | === Подключение SIP-шлюза jigasi === | ||
Строка 221: | Строка 332: | ||
Краткий ответ: нет. | Краткий ответ: нет. | ||
В комплекте с Jitsi идут модули для расширения функциональности XMPP-сервера prosody, написанные на Lua; они считаются частью продукта Jitsi Meet. | В комплекте с Jitsi идут модули для расширения функциональности XMPP-сервера prosody, написанные на Lua; они считаются частью продукта Jitsi Meet. Без этих модулей или эквивалентных им система ВКС работать не будет. | ||
В теории, ничего не мешает написать и поддерживать эти модули для вашего XMPP-сервера; одно время проект Jitsi использовал {{term|openfire}}. | В теории, ничего не мешает написать и поддерживать эти модули для вашего XMPP-сервера; одно время проект Jitsi использовал XMPP-сервер {{term|openfire}}. |
Версия от 01:36, 20 июня 2020
Jitsi Meet — веб-приложение на базе технологии WebRTC. Для сигналинга использует XMPP через BOSH с использованием собственного XEP. В системах на базе Альт оно расположено в пакете jitsi-meet-web
Jicofo — XMPP-компонент, модератор видеоконференций. Клиенты договариваются о связи, заходя в общую XMPP-комнату с ним, и обмениваются там XMPP-сообщениями. Имеет HTTP API /about/health для опроса о состоянии сервиса.
Jitsi Videobridge — ключевой компонент системы, SFU. Он передаёт видео и аудио между участниками, осуществляя роль посредника, терминирует RTP/RTCP, определяет доступные рамки битрейта в обе стороны на конкретного клиента. Имеет свой внутренний HTTP API для мониторинга (/colibri/debug).
Это SFU, не MCU — он не занимается транскодингом и поэтому потребляет относительно мало CPU.
Jigasi — шлюз для участия в Jitsi-конференциях через SIP-телефонию.
Jibri — appliance для записи конференции. использует Selenium с Chromium внутри (и тянет за собой зависимости на Xorg, icewm, модуль ядра snd-aloop). Ведёт себя как ничего не передающий участник записываемой конференции, но Jicofo и клиенты его держат на особом положении: не отображают в списке участников и т. п. Также, как и JVB, Jigasi, заходит по отдельному аккаунту в специальную XMPP-комнату для рекордеров. Их можно (и нужно!) воткнуть несколько, если планируется вести запись нескольких конференций одновременно.
Как развернуть?
Minimal Viable Product
Вам потребуются пакеты prosody, jitsi-meet-prosody, jitsi-meet-web, jicofo, jitsi-videobridge. Для размещения нужны:
- jitsi-videobridge: хост с доступными портами 10000/udp, 4443/tcp и хорошей пропускной способностью (рекомендуется минимум 100Mbps симметрично)
- веб-сервер: хост с доступным портом 443/tcp
- Шаблон:Caution обратите внимание: веб-сервер должен поддерживать HTTPS, иначе браузеры откажутся поддерживать на нём WebRTC. Лучше всего сначала выписать SSL-сертификат, а потом продолжать настройку веб-сервера.
- xmpp-сервер: хост с доступным портом 5280/tcp для работы XMPP-over-HTTP (BOSH).
Установите пакеты:
apt-get install prosody jitsi-meet-prosody jitsi-meet-web jicofo jitsi-videobridge
Теоретически компоненты могут размещаться на разных машинах; на практике мы не рекомендуем устанавливать prosody и jicofo на разные машины — это может привести к низкой производительности сервиса и большим колебаниям задержки связи.
При настройке будем предполагать, что в качестве базового доменного имени выбрано $DOMAIN.
На всех используемых машинах убедитесь, что команда
ping $(hostname)
успешно срабатывает: уходят запросы и приходят ответы.
Настройка XMPP-сервера
В файл /etc/prosody/$DOMAIN.cfg.lua напишите:
plugin_paths = { "/usr/share/jitsi-meet/prosody-plugins/" }
-- domain mapper options, must at least have domain base set to use the mapper
muc_mapper_domain_base = "$DOMAIN";
cross_domain_bosh = false;
consider_bosh_secure = true;
VirtualHost "$DOMAIN"
authentication = "anonymous"
--app_id="example_app_id"
--app_secret="example_app_secret"
-- Assign this host a certificate for TLS, otherwise it would use the one
-- set in the global section (if any).
-- Note that old-style SSL on port 5223 only supports one certificate, and will always
-- use the global one.
ssl = {
key = "/etc/prosody/certs/$DOMAIN.key";
certificate = "/etc/prosody/certs/$DOMAIN.crt";
}
speakerstats_component = "speakerstats.$DOMAIN"
conference_duration_component = "conferenceduration.$DOMAIN"
-- we need bosh
modules_enabled = {
"bosh";
"pubsub";
"ping"; -- Enable mod_ping
"speakerstats";
"turncredentials";
"conference_duration";
}
c2s_require_encryption = false
Component "conference.$DOMAIN" "muc"
storage = "memory"
modules_enabled = {
"muc_meeting_id";
"muc_domain_mapper";
-- "token_verification";
}
admins = { "focus@auth.$DOMAIN" }
muc_room_locking = false
muc_room_default_public_jids = true
VirtualHost "auth.$DOMAIN"
ssl = {
key = "/etc/prosody/certs/auth.$DOMAIN.key";
certificate = "/etc/prosody/certs/auth.$DOMAIN.crt";
}
authentication = "internal_plain"
-- internal muc component, meant to enable pools of jibri and jigasi clients
Component "internal.auth.$DOMAIN" "muc"
storage = "memory"
modules_enabled = {
"ping";
}
admins = { "focus@auth.$DOMAIN", "jvb@auth.$DOMAIN" }
muc_room_locking = false
muc_room_default_public_jids = true
Component "focus.$DOMAIN"
component_secret = "xxx" -- достаточно длинный пароль, он же JICOFO_SECRET
Component "speakerstats.$DOMAIN" "speakerstats_component"
muc_component = "conference.$DOMAIN"
Component "conferenceduration.$DOMAIN" "conference_duration_component"
muc_component = "conference.$DOMAIN"
Сгенерируйте сертификаты для виртуалхостов $DOMAIN и auth.$DOMAIN:
prosodyctl cert generate $DOMAIN prosodyctl cert generate auth.$DOMAIN
Позже их нужно будет зарегистрировать в системе, на которой установлен Jicofo, как доверенные:
ln -s /etc/prosody/certs/$DOMAIN.crt /etc/pki/ca-trust/source/anchors/ ln -s /etc/prosody/certs/auth.$DOMAIN.crt /etc/pki/ca-trust/source/anchors/ update-ca-certs
Настройка Jicofo
Jicofo подключается к XMPP-серверу и как внешний XMPP-компонент, и как юзер-аккаунт с JID focus@auth.$DOMAIN
В /etc/jitsi/jicofo/config укажите:
# Jitsi Conference Focus settings
# sets the host name of the XMPP server
JICOFO_HOST=localhost
# sets the XMPP domain (default: none)
JICOFO_HOSTNAME=$DOMAIN
# sets the secret used to authenticate as an XMPP component
JICOFO_SECRET=xxx
# overrides the prefix for the XMPP component domain. Default: "focus"
#JICOFO_FOCUS_SUBDOMAIN=focus
# sets the port to use for the XMPP component connection
JICOFO_PORT=5347
# sets the XMPP domain name to use for XMPP user logins
JICOFO_AUTH_DOMAIN=auth.$DOMAIN
# sets the username to use for XMPP user logins
JICOFO_AUTH_USER=focus
# sets the password to use for XMPP user logins
JICOFO_AUTH_PASSWORD="[yyy]"
# extra options to pass to the jicofo daemon
JICOFO_OPTS="${JICOFO_FOCUS_SUBDOMAIN:+ --subdomain=$JICOFO_FOCUS_SUBDOMAIN}"
# adds java system props that are passed to jicofo (default are for home and logging config file)
JAVA_SYS_PROPS="-Dnet.java.sip.communicator.SC_HOME_DIR_LOCATION=/etc/jitsi -Dnet.java.sip.communicator.SC_HOME_DIR_NAME=jicofo -Dnet.java.sip.communicator.SC_LOG_DIR_LOCATION=/var/log/jitsi -Djava.util.logging.config.file=/etc/jitsi/jicofo/logging.properties"
"[yyy]" — достаточно длинный пароль для аккаунта focus@auth.$DOMAIN, который нужно завести на машине с prosody:
prosodyctl register focus auth.$DOMAIN "[yyy]"
В /etc/jitsi/jicofo укажите:
org.jitsi.jicofo.health.ENABLE_HEALTH_CHECKS=true org.jitsi.jicofo.BRIDGE_MUC=JvbBrewery@internal.auth.$DOMAIN
Запустите jicofo:
systemctl start jicofo
Убедитесь, что он подключается к XMPP-серверу:
curl -i localhost:8888/about/health
Так как пока что ни одного Jitsi Videobridge к серверу не подключено, jicofo ответит кодом ответа 500 и сообщением No operational bridges available. Если в ответе сообщение об ошибке иного рода — проверьте настройки и связь между prosody и jicofo.
Настройка Jitsi Videobridge (JVB)
В /etc/jitsi/videobridge/config укажите:
# Jitsi Videobridge settings
# extra options to pass to the JVB daemon
JVB_OPTS="--apis=,"
# adds java system props that are passed to jvb (default are for home and logging config file)
JAVA_SYS_PROPS="-Dnet.java.sip.communicator.SC_HOME_DIR_LOCATION=/etc/jitsi -Dnet.java.sip.communicator.SC_HOME_DIR_NAME=videobridge -Dnet.java.sip.communicator.SC_LOG_DIR_LOCATION=/var/log/jitsi -Djava.util.logging.config.file=/etc/jitsi/videobridge/logging.properties -Dconfig.file=/etc/jitsi/videobridge/application.conf"
Если в файле config есть другие настройки, рекомендуем их убрать — и способ передачи этих настроек, и сами некоторые эти настройки являются устаревшими.
В качестве файлов конфигурации используются /etc/jitsi/videobridge/{application.conf,sip-communicator.properties}.
В файле /etc/jitsi/videobridge/application.conf укажите:
videobridge { stats { enabled = true transports = [ { type = "muc" } ] } apis { xmpp-client { configs { shard { hostname = "localhost" domain = "auth.$DOMAIN" username = "jvb" password = "[yyy-jvb]" muc_jids = "JvbBrewery@internal.auth.$DOMAIN" # The muc_nickname must be unique across all instances muc_nickname = "jvb-mid-123" } } } } }
Вместо слова shard можно использовать любой идентификатор (оно идентифицирует подключение к xmpp-серверу и jicofo).
Аккаунт jvb@auth.$DOMAIN тоже нужно завести на XMPP-сервере:
prosodyctl register jvb auth.$DOMAIN "[yyy-jvb]"
Если JVB-машина отделена от клиентов при помощи NAT, то потребуется донастройка: подробнее здесь.
Запустите JVB:
systemctl start jitsi-videobridge
Если всё сделано правильно и между JVB и jicofo есть связь, jicofo на healthcheck-запрос будет отдавать HTTP-код 200.
Настройка web-приложения Jitsi Meet
В `/usr/share/doc/jitsi-meet-*` есть примеры конфигурации для веб-клиента (*-config.js) и веб-сервера. Мы рекомендуем при настройке веб-сервера за основу взять пример оттуда.
Приведём ниже подробный разбор этого примера:
server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name $DOMAIN; root /usr/share/jitsi-meet; # ssi on with javascript for multidomain variables in config.js ssi on; ssi_types application/x-javascript application/javascript;
Помимо конференций вида https://jitsi-meet.example.com/ConferenceName, Jitsi Meet также поддерживает URL-адреса конференций вида https://jitsi-meet.example.com/Subdomain/ConferenceName, где для разных значений Subdomain используются разные настройки и виртуалхосты на XMPP-сервере. SSI нужны как минимум для динамической подстановки этих значений в config.js.
index index.html index.htm; error_page 404 /static/404.html;
gzip on; gzip_types text/plain text/css application/javascript application/json; gzip_vary on; location = /config.js { alias /etc/jitsi/meet/jitsi.murbly.net-config.js; } location = /external_api.js { alias /usr/share/jitsi-meet/libs/external_api.min.js; } #ensure all static content can always be found first location ~ ^/(libs|css|static|images|fonts|lang|sounds|connection_optimization|.well-known)/(.*)$ { add_header 'Access-Control-Allow-Origin' '*'; alias /usr/share/jitsi-meet/$1/$2; } # BOSH location = /http-bind { proxy_pass http://localhost:5280/http-bind; proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header Host $http_host; } # xmpp websockets location = /xmpp-websocket { proxy_pass http://127.0.0.1:5280/xmpp-websocket?prefix=$prefix&$args; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $http_host; tcp_nodelay on; }
Чтобы проверить, всё ли в порядке, зайдите на https://$DOMAIN и присоединитесь к произвольной конференции, а затем 2-3 раза продублируйте вкладку веб-браузера.
Трёх (в случае выключенного p2p — двух) анонимных участников достаточно, чтобы начать обмен медиапотоками; если увидите три изображения с камеры — система готова к использованию.
Подключение SIP-шлюза jigasi
Подключение рекордера jibri
FAQ
Можно ли использовать не prosody, а другой XMPP-сервер?
Краткий ответ: нет.
В комплекте с Jitsi идут модули для расширения функциональности XMPP-сервера prosody, написанные на Lua; они считаются частью продукта Jitsi Meet. Без этих модулей или эквивалентных им система ВКС работать не будет. В теории, ничего не мешает написать и поддерживать эти модули для вашего XMPP-сервера; одно время проект Jitsi использовал XMPP-сервер openfire.