Jitsi Meet: различия между версиями

Материал из ALT Linux Wiki
Нет описания правки
Нет описания правки
 
(не показана 21 промежуточная версия 5 участников)
Строка 1: Строка 1:
{{Broken}}
{|class="wikitable" style="float:center; margin-left:2em"
!colspan="2"|Компоненты Jitsi
|-
!Jitsi Meet
|Веб-приложение на базе технологии WebRTC. Для сигналинга использует XMPP через BOSH с использованием собственного [https://xmpp.org/extensions/xep-0340.html XEP].


Jitsi Meet — веб-приложение на базе технологии WebRTC. Для сигналинга использует XMPP через BOSH с использованием собственного [https://xmpp.org/extensions/xep-0340.html XEP].
В системах на базе Альт оно расположено в пакете {{pkg|jitsi-meet-web}}. Для ведущих мобильных платформ ([https://itunes.apple.com/us/app/jitsi-meet/id1165103905 iOS], [https://play.google.com/store/apps/details?id=org.jitsi.meet Google Play], [https://f-droid.org/en/packages/org.jitsi.meet/ F-Droid]) доступны приложения на React Native.
В системах на базе Альт оно расположено в пакете {{pkg|jitsi-meet-web}}
|-
!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}}).


Jicofo XMPP-компонент, модератор видеоконференций. Клиенты договариваются о связи, заходя в общую XMPP-комнату с ним, и обмениваются там XMPP-сообщениями. Имеет HTTP API {{path|/about/health}} для опроса о состоянии сервиса.
Это <abbr title="Selective Forwarding Unit">SFU</abbr>, не <abbr title="Multipoint Conferencing Unit">MCU</abbr> он не занимается транскодингом и поэтому потребляет относительно мало CPU.


Jitsi Videobridge ключевой компонент системы, <abbr title="Selective Forwarding Unit">SFU</abbr>. Он передаёт видео и аудио между участниками, осуществляя роль посредника, терминирует RTP/RTCP, определяет доступные рамки битрейта в обе стороны на конкретного клиента. Имеет свой внутренний HTTP API для мониторинга ({{path|/colibri/debug}}).
К системе ВКС Jitsi можно подключить несколько видеобриджей тогда каждой новой конференции будет поставлен в соответствие один из них.
 
|-
Это <abbr title="Selective Forwarding Unit">SFU</abbr>, не <abbr title="Multipoint Conferencing Unit">MCU</abbr> — он не занимается транскодингом и поэтому потребляет относительно мало CPU.
!Jigasi
|Шлюз для участия в Jitsi-конференциях через SIP-телефонию.
|-
!Jibri
|Appliance для записи конференции. Использует Selenium с Chromium внутри (и тянет за собой зависимости на Xorg, icewm, модуль ядра snd-aloop). Ведёт себя как ничего не передающий участник записываемой конференции, но Jicofo и клиенты его держат на особом положении: не отображают в списке участников и т. п. Также, как и JVB, Jigasi, заходит по отдельному аккаунту в специальную XMPP-комнату для рекордеров. Их можно (и нужно!) воткнуть несколько, если планируется вести запись нескольких конференций одновременно.
|}


Jigasi — шлюз для участия в Jitsi-конференциях через SIP-телефонию.


Jibri — appliance для записи конференции. использует Selenium с Chromium внутри (и тянет за собой зависимости на Xorg, icewm, модуль ядра snd-aloop). Ведёт себя как ничего не передающий участник записываемой конференции, но Jicofo и клиенты его держат на особом положении: не отображают в списке участников и т. п. Также, как и JVB, Jigasi, заходит по отдельному аккаунту в специальную XMPP-комнату для рекордеров. Их можно (и нужно!) воткнуть несколько, если планируется вести запись нескольких конференций одновременно.
{{Attention|В репозиториях Альт есть пакет {{pkg|jitsi}}, он не имеет никакого отношения к Jitsi Meet.}}


== Как развернуть? ==
== Как развернуть? ==
Строка 17: Строка 32:
=== Minimal Viable Product ===
=== Minimal Viable Product ===


Вам потребуются пакеты {{pkg|prosody}}, {{pkg|jitsi-meet-prosody}}, {{pkg|jitsi-meet-web}}, {{pkg|jicofo}}, {{pkg|jitsi-videobridge}}.
Вам потребуются пакеты {{pkg|prosody}}, {{pkg|jitsi-meet-prosody}}, {{pkg|jitsi-meet-web}}, {{pkg|jitsi-meet-web-config}}, {{pkg|jicofo}}, {{pkg|jitsi-videobridge}}.
Для размещения нужны:
Для размещения нужны:
* jitsi-videobridge: хост с доступными портами 10000/udp, 4443/tcp и хорошей пропускной способностью (рекомендуется минимум 100Mbps симметрично)
* jitsi-videobridge: хост с доступными портами 10000/udp, 4443/tcp и хорошей пропускной способностью (рекомендуется минимум 100Mbps симметрично)
* веб-сервер: хост с доступным портом 443/tcp
* веб-сервер: хост с доступным портом 443/tcp
** {{Caution}} обратите внимание: веб-сервер должен поддерживать HTTPS, иначе браузеры откажутся поддерживать на нём WebRTC. Лучше всего сначала выписать SSL-сертификат, а потом продолжать настройку веб-сервера.
{{Attention|Обратите внимание: веб-сервер должен поддерживать HTTPS, иначе браузеры откажутся поддерживать на нём WebRTC. Лучше всего сначала выписать SSL-сертификат, а потом продолжать настройку веб-сервера.}}
* xmpp-сервер: хост с доступным портом 5280/tcp для работы XMPP-over-HTTP (BOSH).
* xmpp-сервер: хост с доступным портом 5280/tcp для работы XMPP-over-HTTP (BOSH).


Установите пакеты:
Установите пакеты:


{{cmd|apt-get install prosody jitsi-meet-prosody jitsi-meet-web jicofo jitsi-videobridge}}
# apt-get install prosody jitsi-meet-prosody jitsi-meet-web jitsi-meet-web-config jicofo jitsi-videobridge


Теоретически компоненты могут размещаться на разных машинах; на практике мы не рекомендуем устанавливать {{pkg|prosody}} и {{pkg|jicofo}} на разные машины — это может привести к низкой производительности сервиса и большим колебаниям задержки связи.
Теоретически компоненты могут размещаться на разных машинах; на практике мы не рекомендуем устанавливать {{pkg|prosody}} и {{pkg|jicofo}} на разные машины — это может привести к низкой производительности сервиса и большим колебаниям задержки связи.


При настройке будем предполагать, что в качестве базового доменного имени выбрано {{term|$DOMAIN}}.  
При настройке будем предполагать, что в качестве базового доменного имени выбрано {{term|$DOMAIN}}.  
На всех используемых машинах убедитесь, что команда <source lang="shell">ping $(hostname)</source> успешно срабатывает: уходят запросы и приходят ответы.
На всех используемых машинах убедитесь, что команда <source lang="shell">ping "$(hostname)"</source> успешно срабатывает: уходят запросы и приходят ответы.


==== Настройка XMPP-сервера ====
==== Настройка XMPP-сервера ====
 
Создайте дополнительную директорию для конфигурации XMPP-сервера:
В файл {{path|/etc/prosody/$DOMAIN.cfg.lua}} напишите:
<source lang="bash">
# mkdir /etc/prosody/conf.d/
</source>
В файл {{path|/etc/prosody/conf.d/$DOMAIN.cfg.lua}} напишите:


<source lang="lua">
<source lang="lua">
Строка 109: Строка 127:


</source>
</source>
В файл {{path|/etc/prosody/prosody.cfg.lua}} добавьте:
<pre>
Include "conf.d/*.cfg.lua"
</pre>
Другими словами, нужно предусмотреть:
* VirtualHost для самих пользователей (здесь: собственно {{term|$DOMAIN}})
* MUC для пользователей-участников конференции (здесь: {{term|conference.$DOMAIN}})
* VirtualHost для служебных аккаунтов focus@, jvb@, jibri@, ... (здесь: {{term|auth.$DOMAIN}})
* MUC для взаимодействия микросервисов, сидящих под этими аккаунтами (здесь: {{term|internal.auth.$DOMAIN}})
* слот для XMPP-компонента focus (здесь: {{term|focus.$DOMAIN}})
...а также подключить к ним соответствующие модули, и для двух из них ({{term|speakerstats}}, {{term|conference_duration}}) предусмотреть внутренние XMPP-компоненты.


Сгенерируйте сертификаты для виртуалхостов {{term|$DOMAIN}} и {{term|auth.$DOMAIN}}:
Сгенерируйте сертификаты для виртуалхостов {{term|$DOMAIN}} и {{term|auth.$DOMAIN}}:
Строка 116: Строка 147:
prosodyctl cert generate auth.$DOMAIN
prosodyctl cert generate auth.$DOMAIN
</pre>
</pre>
В выводе данных команд будет указано, куда записаны сгенерированные файлы (например, в {{path|/var/lib/prosody}}). Их нужно скопировать в {{path|/etc/prosody/certs}}.


Позже их нужно будет зарегистрировать в системе, на которой установлен Jicofo, как доверенные:
Позже их нужно будет зарегистрировать в системе, на которой установлен Jicofo, как доверенные:
Строка 121: Строка 154:
ln -s /etc/prosody/certs/$DOMAIN.crt /etc/pki/ca-trust/source/anchors/
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/
ln -s /etc/prosody/certs/auth.$DOMAIN.crt /etc/pki/ca-trust/source/anchors/
update-ca-certs
update-ca-trust
</pre>
</pre>
Запустите prosody:
<pre>systemctl start prosody</pre>


==== Настройка Jicofo ====
==== Настройка Jicofo ====
Строка 128: Строка 164:
Jicofo подключается к XMPP-серверу и как внешний XMPP-компонент, и как юзер-аккаунт с JID {{term|focus@auth.$DOMAIN}}
Jicofo подключается к XMPP-серверу и как внешний XMPP-компонент, и как юзер-аккаунт с JID {{term|focus@auth.$DOMAIN}}


В /etc/jitsi/jicofo/config укажите:
В {{path|/etc/jitsi/jicofo/config}} укажите:
<source lang=shell>
<source lang=shell>
# Jitsi Conference Focus settings
# Jitsi Conference Focus settings
Строка 167: Строка 203:
</pre>
</pre>


В {{path|/etc/jitsi/jicofo}} укажите:
В {{path|/etc/jitsi/jicofo/sip-communicator.properties}} укажите:
<pre>
<pre>
org.jitsi.jicofo.health.ENABLE_HEALTH_CHECKS=true
org.jitsi.jicofo.health.ENABLE_HEALTH_CHECKS=true
Строка 174: Строка 210:


</pre>
</pre>


Запустите jicofo:
Запустите jicofo:
Строка 237: Строка 272:


Вместо слова shard можно использовать любой идентификатор (оно идентифицирует подключение к xmpp-серверу и jicofo).
Вместо слова shard можно использовать любой идентификатор (оно идентифицирует подключение к xmpp-серверу и jicofo).
Нужно исправить значения в файле /etc/jitsi/videobridge/sip-communicator.properties
чтобы они соответствовали аналогичным параметрам из /etc/jitsi/videobridge/application.conf


Аккаунт {{term|jvb@auth.$DOMAIN}} тоже нужно завести на XMPP-сервере:
Аккаунт {{term|jvb@auth.$DOMAIN}} тоже нужно завести на XMPP-сервере:
Строка 251: Строка 289:


Если всё сделано правильно и между JVB и jicofo есть связь, jicofo на healthcheck-запрос будет отдавать HTTP-код 200.
Если всё сделано правильно и между JVB и jicofo есть связь, jicofo на healthcheck-запрос будет отдавать HTTP-код 200.
Если по тем или иным причинам поддержка health check больше не нужна, из {{path|/etc/jitsi/jicofo/sip-communicator.properties}} свойство org.jitsi.jicofo.health.ENABLE_HEALTH_CHECKS можно убрать.


==== Настройка web-приложения Jitsi Meet ====
==== Настройка web-приложения Jitsi Meet ====


В `/usr/share/doc/jitsi-meet-*` есть примеры конфигурации для веб-клиента (*-config.js) и веб-сервера. Мы рекомендуем при настройке веб-сервера за основу взять пример оттуда.
В пакете {{pkg|jitsi-meet-web-config}} есть примеры конфигурации для веб-клиента (*-config.js) и веб-сервера(*.example.apache, *.example). Мы рекомендуем при настройке веб-сервера за основу взять пример оттуда.
<div class="toccolours mw-collapsible mw-collapsed">
<div class="toccolours mw-collapsible mw-collapsed">
Приведём ниже подробный разбор этого примера:
Приведём ниже подробный разбор этого примера:
Строка 270: Строка 310:
     ssi_types application/x-javascript application/javascript;
     ssi_types application/x-javascript application/javascript;
</pre>
</pre>
В системе Jitsi Meet нет динамической вебсерверной части, поэтому мы прибегаем к <abbr title="Server-Side Includes">SSI</abbr>.
Риска в использовании SSI нет, потому что пользователь не может заставить веб-сервер отдавать произвольные данные.
Помимо конференций вида https://jitsi-meet.example.com/ConferenceName, Jitsi Meet также поддерживает URL-адреса конференций вида https://jitsi-meet.example.com/Subdomain/ConferenceName, где для разных значений Subdomain используются разные настройки и виртуалхосты на XMPP-сервере.
Помимо конференций вида https://jitsi-meet.example.com/ConferenceName, Jitsi Meet также поддерживает URL-адреса конференций вида https://jitsi-meet.example.com/Subdomain/ConferenceName, где для разных значений Subdomain используются разные настройки и виртуалхосты на XMPP-сервере.
SSI нужны как минимум для динамической подстановки этих значений в {{term|config.js}}.
[https://ru.wikipedia.org/wiki/SSI_(%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5) SSI] нужны как минимум для динамической подстановки этих значений в {{term|config.js}}.
<pre>
<pre>
     index index.html index.htm;
     index index.html index.htm;
Строка 282: Строка 325:


     location = /config.js {
     location = /config.js {
         alias /etc/jitsi/meet/jitsi.murbly.net-config.js;
         alias /etc/jitsi/meet/$DOMAIN-config.js;
     }
     }
</pre>
Содержит элементы конфигурации веб-приложения. Его нужно поправить по необходимости, скопировав на место:
{{cmd|
cp /usr/share/jitsi-meet-web-config/config.js /etc/jitsi/meet/$DOMAIN-config.js
}}


<pre>
     location = /external_api.js {
     location = /external_api.js {
         alias /usr/share/jitsi-meet/libs/external_api.min.js;
         alias /usr/share/jitsi-meet/libs/external_api.min.js;
Строка 295: Строка 344:
         alias /usr/share/jitsi-meet/$1/$2;
         alias /usr/share/jitsi-meet/$1/$2;
     }
     }
 
</pre>
Ниже идёт настройка проксирования BOSH.
Связь веб-клиента и XMPP-сервера можно организовывать и по вебсокетам, но на июнь 2020 поддержка вебсокетов в Jitsi Meet доступна только в тестовом режиме.
Проброс HTTP до XMPP-сервера здесь полезен хотя бы потому, что можно ограничиться настройкой TLS только на веб-сервере.
Если XMPP-сервер находится не на той же машине, что и веб-сервер, localhost в директиве proxy_pass нужно соответствующим образом заменить.
<pre>
     # BOSH
     # BOSH
     location = /http-bind {
     location = /http-bind {
Строка 305: Строка 359:
     # xmpp websockets
     # xmpp websockets
     location = /xmpp-websocket {
     location = /xmpp-websocket {
         proxy_pass http://127.0.0.1:5280/xmpp-websocket?prefix=$prefix&$args;
         proxy_pass http://localhost:5280/xmpp-websocket?prefix=$prefix&$args;
         proxy_http_version 1.1;
         proxy_http_version 1.1;
         proxy_set_header Upgrade $http_upgrade;
         proxy_set_header Upgrade $http_upgrade;
Строка 312: Строка 366:
         tcp_nodelay on;
         tcp_nodelay on;
     }
     }
</pre>


 
Файлы конфигурации в /etc/nginx/sites-available.d и /etc/nginx/sites-enabled.d нужно назвать $DOMAIN.conf
</pre>


</div>
</div>
</div>
</div>


Не забудьте выписать TLS-сертификат для веб-сервера.
Поправьте {{path|/etc/jitsi/meet/$DOMAIN-config.js}} в соответствии с настройками серверной части:
<source lang="javascript">
var config = {
    // Connection
    //
    hosts: {
        // XMPP domain.
        domain: '$DOMAIN', // Главный VirtualHost на XMPP-сервере
        // When using authentication, domain for guest users.
        // anonymousdomain: 'guest.$DOMAIN', // Если на главном включена аутентификация: VirtualHost для анонимного доступа
        // Domain for authenticated users. Defaults to <domain>.
        // authdomain: '$DOMAIN',
        // Call control component (Jigasi).
        // call_control: 'callcontrol.$DOMAIN',
        // Focus component domain. Defaults to focus.<domain>.
        // focus: 'focus.$DOMAIN',
        // XMPP MUC domain. FIXME: use XEP-0030 to discover it.
        muc: 'conference.<!--# echo var="subdomain" default="" -->$DOMAIN'
    },
    // BOSH URL. FIXME: use XEP-0156 to discover it.
    bosh: '//$DOMAIN/http-bind',
    // Websocket URL
    // websocket: 'wss://$DOMAIN/xmpp-websocket',
    // The name of client node advertised in XEP-0115 'c' stanza
    clientNode: 'http://jitsi.org/jitsimeet',
    // The real JID of focus participant - can be overridden here
    // focusUserJid: 'focus@auth.$DOMAIN',
[...]
}
</source>
Веб-интерфейс Jitsi Meet выкачивает этот скрипт и меняет поведение в зависимости от значений, там указанных.
Некоторые полезные настройки:
* <tt>fileRecordingsEnabled</tt>: булев тип; если <tt>true</tt> — включает в интерфейсе кнопку "начать запись".
* <tt>liveStreamingEnabled</tt>: булев тип; включает в интерфейсе кнопку "начать трансляцию в YouTube".
* <tt>noticeMessage</tt>: строка; позволяет отображать указанное MOTD в каждой конференции, например, в случае планируемых работ по обслуживанию.
* <tt>p2p.enabled</tt>: булев тип; если включен — при разговорах тет-а-тет JVB не задействуется (но может потребоваться задействование STUN/TURN).
* <tt>disableThirdPartyRequests</tt>: булев тип; если включено — Jitsi не будет делать запросов к сторонним серверам.
** Например, обычно Jitsi берёт аватарки с gravatar.com по e-mail участника, если тот в веб-интерфейсе его указал.


Чтобы проверить, всё ли в порядке, зайдите на {{term|https://$DOMAIN}} и присоединитесь к произвольной конференции, а затем 2-3 раза продублируйте вкладку веб-браузера.
Чтобы проверить, всё ли в порядке, зайдите на {{term|https://$DOMAIN}} и присоединитесь к произвольной конференции, а затем 1-2 раза продублируйте вкладку веб-браузера.
Трёх (в случае выключенного p2p — двух) анонимных участников достаточно, чтобы начать обмен медиапотоками; если увидите три изображения с камеры — система готова к использованию.
Трёх (в случае выключенного p2p — двух) анонимных участников достаточно, чтобы начать обмен медиапотоками; если увидите три изображения с камеры — система готова к использованию.


=== Подключение SIP-шлюза jigasi ===
=== Подключение SIP-шлюза jigasi ===
<!-- У меня нет опыта подключения этой штуки; на нашей площадке sip-телефонов нет. См. документацию апстрима -->
=== Подключение рекордера jibri ===
=== Подключение рекордера jibri ===


Строка 334: Строка 445:
В комплекте с Jitsi идут модули для расширения функциональности XMPP-сервера prosody, написанные на Lua; они считаются частью продукта Jitsi Meet. Без этих модулей или эквивалентных им система ВКС работать не будет.
В комплекте с Jitsi идут модули для расширения функциональности XMPP-сервера prosody, написанные на Lua; они считаются частью продукта Jitsi Meet. Без этих модулей или эквивалентных им система ВКС работать не будет.
В теории, ничего не мешает написать и поддерживать эти модули для вашего XMPP-сервера; одно время проект Jitsi использовал XMPP-сервер {{term|openfire}}.
В теории, ничего не мешает написать и поддерживать эти модули для вашего XMPP-сервера; одно время проект Jitsi использовал XMPP-сервер {{term|openfire}}.
=== Кто может подключиться к созданной конференции? ===
В приведённой инструкции описана конфигурация, подобная https://meet.jit.si, где, зная URL конференции, в неё может зайти любой желающий.
Конференция создаётся, когда в неё заходит первый участник, и существует до выхода последнего. Предотвратить случайных посетителей можно, выбрав достаточно длинный URL на главной странице веб-портала; генератор по умолчанию с этим справляется.
Если система Jitsi Meet развёрнута на ваших собственных ресурсах, вы можете предотвратить неавторизованное создание новых конференций, чтобы сторонние люди не могли перенагрузить систему. Более подробное описание процедуры [https://jitsi.github.io/handbook/docs/devops-guide/secure-domain даёт] апстрим.
== Ссылки ==
https://jitsi.github.io/handbook
[[Категория:Enterprise Software]]

Текущая версия от 15:47, 19 сентября 2024

BrokenPage.png
Эта статья сломана.
Статья годная, но там что-то изменилось/поменялось и она уже не рабочая. Её нужно доработать.


Компоненты Jitsi
Jitsi Meet Веб-приложение на базе технологии WebRTC. Для сигналинга использует XMPP через BOSH с использованием собственного XEP.

В системах на базе Альт оно расположено в пакете jitsi-meet-web. Для ведущих мобильных платформ (iOS, Google Play, F-Droid) доступны приложения на React Native.

Jicofo XMPP-компонент, модератор видеоконференций. Клиенты договариваются о связи, заходя в общую XMPP-комнату с ним, и обмениваются там XMPP-сообщениями. Имеет HTTP API /about/health для опроса о состоянии сервиса.
Jitsi Videobridge Ключевой компонент системы, SFU. Он передаёт видео и аудио между участниками, осуществляя роль посредника, терминирует RTP/RTCP, определяет доступные рамки битрейта в обе стороны на конкретного клиента. Имеет свой внутренний HTTP API для мониторинга (/colibri/debug).

Это SFU, не MCU — он не занимается транскодингом и поэтому потребляет относительно мало CPU.

К системе ВКС Jitsi можно подключить несколько видеобриджей — тогда каждой новой конференции будет поставлен в соответствие один из них.

Jigasi Шлюз для участия в Jitsi-конференциях через SIP-телефонию.
Jibri Appliance для записи конференции. Использует Selenium с Chromium внутри (и тянет за собой зависимости на Xorg, icewm, модуль ядра snd-aloop). Ведёт себя как ничего не передающий участник записываемой конференции, но Jicofo и клиенты его держат на особом положении: не отображают в списке участников и т. п. Также, как и JVB, Jigasi, заходит по отдельному аккаунту в специальную XMPP-комнату для рекордеров. Их можно (и нужно!) воткнуть несколько, если планируется вести запись нескольких конференций одновременно.


Внимание! В репозиториях Альт есть пакет jitsi, он не имеет никакого отношения к Jitsi Meet.


Как развернуть?

Minimal Viable Product

Вам потребуются пакеты prosody, jitsi-meet-prosody, jitsi-meet-web, jitsi-meet-web-config, jicofo, jitsi-videobridge. Для размещения нужны:

  • jitsi-videobridge: хост с доступными портами 10000/udp, 4443/tcp и хорошей пропускной способностью (рекомендуется минимум 100Mbps симметрично)
  • веб-сервер: хост с доступным портом 443/tcp
Внимание! Обратите внимание: веб-сервер должен поддерживать HTTPS, иначе браузеры откажутся поддерживать на нём WebRTC. Лучше всего сначала выписать SSL-сертификат, а потом продолжать настройку веб-сервера.
  • xmpp-сервер: хост с доступным портом 5280/tcp для работы XMPP-over-HTTP (BOSH).

Установите пакеты:

# apt-get install prosody jitsi-meet-prosody jitsi-meet-web jitsi-meet-web-config jicofo jitsi-videobridge

Теоретически компоненты могут размещаться на разных машинах; на практике мы не рекомендуем устанавливать prosody и jicofo на разные машины — это может привести к низкой производительности сервиса и большим колебаниям задержки связи.

При настройке будем предполагать, что в качестве базового доменного имени выбрано $DOMAIN.

На всех используемых машинах убедитесь, что команда

ping "$(hostname)"

успешно срабатывает: уходят запросы и приходят ответы.

Настройка XMPP-сервера

Создайте дополнительную директорию для конфигурации XMPP-сервера:

# mkdir /etc/prosody/conf.d/

В файл /etc/prosody/conf.d/$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"

В файл /etc/prosody/prosody.cfg.lua добавьте:

Include "conf.d/*.cfg.lua"

Другими словами, нужно предусмотреть:

  • VirtualHost для самих пользователей (здесь: собственно $DOMAIN)
  • MUC для пользователей-участников конференции (здесь: conference.$DOMAIN)
  • VirtualHost для служебных аккаунтов focus@, jvb@, jibri@, ... (здесь: auth.$DOMAIN)
  • MUC для взаимодействия микросервисов, сидящих под этими аккаунтами (здесь: internal.auth.$DOMAIN)
  • слот для XMPP-компонента focus (здесь: focus.$DOMAIN)

...а также подключить к ним соответствующие модули, и для двух из них (speakerstats, conference_duration) предусмотреть внутренние XMPP-компоненты.

Сгенерируйте сертификаты для виртуалхостов $DOMAIN и auth.$DOMAIN:

prosodyctl cert generate $DOMAIN
prosodyctl cert generate auth.$DOMAIN

В выводе данных команд будет указано, куда записаны сгенерированные файлы (например, в /var/lib/prosody). Их нужно скопировать в /etc/prosody/certs.

Позже их нужно будет зарегистрировать в системе, на которой установлен 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-trust

Запустите prosody:

systemctl start prosody

Настройка 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/sip-communicator.properties укажите:

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).

Нужно исправить значения в файле /etc/jitsi/videobridge/sip-communicator.properties чтобы они соответствовали аналогичным параметрам из /etc/jitsi/videobridge/application.conf

Аккаунт jvb@auth.$DOMAIN тоже нужно завести на XMPP-сервере:

prosodyctl register jvb auth.$DOMAIN "[yyy-jvb]"

Если JVB-машина отделена от клиентов при помощи NAT, то потребуется донастройка: подробнее здесь.

Запустите JVB:

systemctl start jitsi-videobridge

Если всё сделано правильно и между JVB и jicofo есть связь, jicofo на healthcheck-запрос будет отдавать HTTP-код 200.

Если по тем или иным причинам поддержка health check больше не нужна, из /etc/jitsi/jicofo/sip-communicator.properties свойство org.jitsi.jicofo.health.ENABLE_HEALTH_CHECKS можно убрать.

Настройка web-приложения Jitsi Meet

В пакете jitsi-meet-web-config есть примеры конфигурации для веб-клиента (*-config.js) и веб-сервера(*.example.apache, *.example). Мы рекомендуем при настройке веб-сервера за основу взять пример оттуда.

Приведём ниже подробный разбор этого примера:

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;

В системе Jitsi Meet нет динамической вебсерверной части, поэтому мы прибегаем к SSI. Риска в использовании SSI нет, потому что пользователь не может заставить веб-сервер отдавать произвольные данные.

Помимо конференций вида 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/$DOMAIN-config.js;
    }

Содержит элементы конфигурации веб-приложения. Его нужно поправить по необходимости, скопировав на место: cp /usr/share/jitsi-meet-web-config/config.js /etc/jitsi/meet/$DOMAIN-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. Связь веб-клиента и XMPP-сервера можно организовывать и по вебсокетам, но на июнь 2020 поддержка вебсокетов в Jitsi Meet доступна только в тестовом режиме. Проброс HTTP до XMPP-сервера здесь полезен хотя бы потому, что можно ограничиться настройкой TLS только на веб-сервере. Если XMPP-сервер находится не на той же машине, что и веб-сервер, localhost в директиве proxy_pass нужно соответствующим образом заменить.

    # 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://localhost: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;
    }

Файлы конфигурации в /etc/nginx/sites-available.d и /etc/nginx/sites-enabled.d нужно назвать $DOMAIN.conf

Не забудьте выписать TLS-сертификат для веб-сервера.

Поправьте /etc/jitsi/meet/$DOMAIN-config.js в соответствии с настройками серверной части:

var config = {
    // Connection
    //

    hosts: {
        // XMPP domain.
        domain: '$DOMAIN', // Главный VirtualHost на XMPP-сервере

        // When using authentication, domain for guest users.
        // anonymousdomain: 'guest.$DOMAIN', // Если на главном включена аутентификация: VirtualHost для анонимного доступа

        // Domain for authenticated users. Defaults to <domain>.
        // authdomain: '$DOMAIN',

        // Call control component (Jigasi).
        // call_control: 'callcontrol.$DOMAIN',

        // Focus component domain. Defaults to focus.<domain>.
        // focus: 'focus.$DOMAIN',

        // XMPP MUC domain. FIXME: use XEP-0030 to discover it.
        muc: 'conference.<!--# echo var="subdomain" default="" -->$DOMAIN'
    },

    // BOSH URL. FIXME: use XEP-0156 to discover it.
    bosh: '//$DOMAIN/http-bind',

    // Websocket URL
    // websocket: 'wss://$DOMAIN/xmpp-websocket',

    // The name of client node advertised in XEP-0115 'c' stanza
    clientNode: 'http://jitsi.org/jitsimeet',

    // The real JID of focus participant - can be overridden here
    // focusUserJid: 'focus@auth.$DOMAIN',

[...]
}

Веб-интерфейс Jitsi Meet выкачивает этот скрипт и меняет поведение в зависимости от значений, там указанных.

Некоторые полезные настройки:

  • fileRecordingsEnabled: булев тип; если true — включает в интерфейсе кнопку "начать запись".
  • liveStreamingEnabled: булев тип; включает в интерфейсе кнопку "начать трансляцию в YouTube".
  • noticeMessage: строка; позволяет отображать указанное MOTD в каждой конференции, например, в случае планируемых работ по обслуживанию.
  • p2p.enabled: булев тип; если включен — при разговорах тет-а-тет JVB не задействуется (но может потребоваться задействование STUN/TURN).
  • disableThirdPartyRequests: булев тип; если включено — Jitsi не будет делать запросов к сторонним серверам.
    • Например, обычно Jitsi берёт аватарки с gravatar.com по e-mail участника, если тот в веб-интерфейсе его указал.

Чтобы проверить, всё ли в порядке, зайдите на https://$DOMAIN и присоединитесь к произвольной конференции, а затем 1-2 раза продублируйте вкладку веб-браузера. Трёх (в случае выключенного p2p — двух) анонимных участников достаточно, чтобы начать обмен медиапотоками; если увидите три изображения с камеры — система готова к использованию.

Подключение SIP-шлюза jigasi

Подключение рекордера jibri

FAQ

Можно ли использовать не prosody, а другой XMPP-сервер?

Краткий ответ: нет.

В комплекте с Jitsi идут модули для расширения функциональности XMPP-сервера prosody, написанные на Lua; они считаются частью продукта Jitsi Meet. Без этих модулей или эквивалентных им система ВКС работать не будет. В теории, ничего не мешает написать и поддерживать эти модули для вашего XMPP-сервера; одно время проект Jitsi использовал XMPP-сервер openfire.

Кто может подключиться к созданной конференции?

В приведённой инструкции описана конфигурация, подобная https://meet.jit.si, где, зная URL конференции, в неё может зайти любой желающий. Конференция создаётся, когда в неё заходит первый участник, и существует до выхода последнего. Предотвратить случайных посетителей можно, выбрав достаточно длинный URL на главной странице веб-портала; генератор по умолчанию с этим справляется.

Если система Jitsi Meet развёрнута на ваших собственных ресурсах, вы можете предотвратить неавторизованное создание новых конференций, чтобы сторонние люди не могли перенагрузить систему. Более подробное описание процедуры даёт апстрим.

Ссылки

https://jitsi.github.io/handbook