Jitsi Meet — это бесплатное программное обеспечение с открытым исходным кодом, которое позволяет создавать и развертывать решения для видеоконференцсвязи. Jitsi Meet работает на базе открытой технологии WebRTC. Это позволяет использовать для проведения конференций браузер, а также клиентские приложения для Linux, macOS, Windows, iOS и Android.
Основные модули Jitsi Meet
Jicofo — XMPP-компонент, процесс, который управляет подключением клиентских приложений к видеоконференции. Также во время её проведения он реализует функционал отправки приглашений, распределения нагрузки при использовании нескольких XMPP-серверов. Jitsi Videobridge — ключевой компонент системы. При передаче видео и аудио между участниками он выполняет роль посредника, то есть осуществляет функцию терминирования RTP/RTCP, устанавливает границы битрейта в обе стороны на каждого клиента. Он работает по архитектуре Simulcast и не занимается транскодингом, потому потребляет относительно мало ресурсов CPU сервера, но при этом возрастает нагрузка на клиентскую часть по сравнению с другими архитектурами. К системе ВКС Jitsi можно подключить несколько видеобриджей — тогда каждой новой конференции будет поставлен в соответствие один из них. Jigasi — внешнее расширение для участия в Jitsi-конференциях через SIP-телефонию (требуется отдельная настройка). Jibri — набор сервисов для записи и трансляции конференции. Запускает Chrome в виртуальном видеобуфере, захватывая и кодируя выходные данные с помощью ffmpeg. Сервис предназначен для запуска на отдельном компьютере (или виртуальной машине), без других приложений, использующих дисплей или аудио устройства. Каждый запущенный экземпляр Jibri поддерживает только один процесс записи за раз. Prosody — это кроссплатформенный XMPP-сервер, написанный на языке программирования Lua.
Установка
Платформа Jitsi Meet поддерживает развёртывание на ОС Debian/Ubuntu и openSUSE. Для примера рассмотрим, как установить Jitsi Meet на Ubuntu 20.04. В качестве примера будет показана установка на облачный сервер хостинг-провайдера REG.RU. Сервисы Jitsi и Jibri находятся на разных серверах, каждому присвоен внешний IP. Сервисы Jitsi и Jibri также можно разместить на одном сервере, но тогда на него будет большая нагрузка и, следовательно, серверу надо дать больше ресурсов. Для выполнения перечисленных далее команд надо иметь права привилегированного пользователя в ОС.
Настройка Jitsi
Подготовка системы
Обновление системы до последней версии:
sudo apt update sudo apt upgrade
Установим необходимые утилиты:
apt install -y wget mc unzip
Локализация
Посмотрим информацию о текущем языковом окружении:
locale
Теперь посмотрим список всех установленных языков и кодировок:
locale -a
Установлю русскую локаль по умолчанию:
update-locale LANG=ru_RU.UTF-8
После этого надо будет перезайти в систему и проверить информацию о языковом окружении:
locale
Установка переводов для системных программ:
apt install -y language-pack-ru
Настройка брандмауэра
В качестве межсетевого экрана будет использоваться iptables. Удаление брандмауэра UFW Проверка статуса сервиса UFW:
systemctl status ufw
Остановка сервиса UFW:
systemctl stop ufw
Отключение UFW:
ufw disable
apt-get remove --auto-remove ufw -y apt-get purge --auto-remove ufw -y rm -Rf /etc/ufw/
Установка утилиты iptables-persistent (нужна для сохранения и восстановления параметров брандмауэра после включения ОС):
apt install -y iptables-persistent
Чтобы пользователи могли подключаться к серверу Jitsi Meet, нужно настроить брандмауэр. Для этого потребуется открыть требуемые порты с помощью iptables. Создадим файл настроек iptables в редакторе Midnight Commander:
mcedit iptables.sh
и внесем в него следующее содержимое:
#!/bin/sh # - Очищаем таблицы iptables -F iptables -t nat -F iptables -t mangle -F iptables -X # - Политики по умолчанию iptables -P INPUT DROP iptables -P OUTPUT DROP iptables -P FORWARD DROP # - Разрешить трафик по петлевому интерфейсу iptables -A INPUT -i lo -j ACCEPT iptables -A OUTPUT -o lo -j ACCEPT # - Разрешим передавать пакеты, относящиеся к уже установленным соединениям iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # - Разрешить входящий PING iptables -A INPUT -p icmp -j ACCEPT # - Разрешить все исходящие iptables -I OUTPUT 1 -j ACCEPT # - Доступ по SSH iptables -A INPUT -p tcp --dport 22 -j ACCEPT # - Разрешить доступ к WEB iptables -A INPUT -p tcp --dport 80 -j ACCEPT iptables -A INPUT -p tcp --dport 443 -j ACCEPT # Разрешить доступ к Jitsi Meet iptables -A INPUT -p udp --dport 10000 -j ACCEPT iptables -A INPUT -p udp --dport 3478 -j ACCEPT iptables -A INPUT -p tcp --dport 5349 -j ACCEPT # Разрешить доступ для Jibri iptables -A INPUT -p tcp --dport 5222 -j ACCEPT # - Сохранить настройки service netfilter-persistent save
Сохраняем и назначаем права на выполнение:
chmod +x iptables.sh
Выполняем скрипт:
sh iptables.sh
Посмотреть список правил iptables можно командой:
iptables --line-numbers -L -v -n
Настройка доменного имени
Чтобы сервер Jitsi Meet функционировал правильно, нужно установить соответствие доменного имени, которое мы будем использовать для своего экземпляра Jitsi Meet, с именем хоста системы. Для смены хост-имени выполняем следующие команды (где meet это имя сервера, а meet.mailns.ru название поддомена):
hostnamectl set-hostname meet
Добавим в файл /etc/hosts доменное имя:
mcedit /etc/hosts
111.111.111.111 meet.mailns.ru
где 111.111.111.111 — это общедоступный IP-адрес сервера.
Перезагружаем систему:
reboot
Установка Jitsi
С помощью curl импортируем официальный GPG-ключ репозитория Jitsi:
curl https://download.jitsi.org/jitsi-key.gpg.key | sudo sh -c 'gpg --dearmor > /usr/share/keyrings/jitsi-keyring.gpg'
Добавляем ссылку на репозиторий со стабильной версией:
echo 'deb [signed-by=/usr/share/keyrings/jitsi-keyring.gpg] https://download.jitsi.org stable/' | sudo tee /etc/apt/sources.list.d/jitsi-stable.list > /dev/null
Обновляем список доступных пакетов из репозитория:
apt update
apt install -y jitsi-meet
Во время установки будет предложено ввести имя хоста, используйте конкретное доменное имя, например: meet.mailns.ru. В качестве альтернативы вы можете ввести IP-адрес машины (если он статический). Это имя хоста будет использоваться для настройки виртуального хоста внутри Jitsi Meet, а также для подключения пользователей к конференциям. Будет так же предложено сгенерировать самоподписанный SSL-сертификат, или отказаться от него если у вас уже есть коммерческий сертификат и вы будете использовать его. Установим SSL-сертификат Let’s Encrypt Выполним установку утилиты для получения сертификата Certbot:
apt install -y certbot
Выполним скрипт для запроса и установки SSL-сертификата Let’s Encrypt:
sudo /usr/share/jitsi-meet/scripts/install-letsencrypt-cert.sh
После завершения установки запустите веб-браузер и введите имя хоста или IP-адрес в адресную строку. Вы должны увидеть веб-страницу, предлагающую вам начать новую конференцию.
Настройка Jibri
Настройка брандмауэра
Переходим на сервер Jibri, пропустим начальные настройки и сразу перейдем к настройки правил межсетевого экрана нужно открыть порт 5222 по протоколу TCP. Создадим файл настроек iptables в редакторе Midnight Commander:
mcedit iptables.sh
Содержимое:
#!/bin/sh # - Очищаем таблицы iptables -F iptables -t nat -F iptables -t mangle -F iptables -X # - Политики по умолчанию iptables -P INPUT DROP iptables -P OUTPUT DROP iptables -P FORWARD DROP # - Разрешить трафик по петлевому интерфейсу iptables -A INPUT -i lo -j ACCEPT iptables -A OUTPUT -o lo -j ACCEPT # - Разрешим передавать пакеты, относящиеся к уже установленным соединениям iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # - Разрешить входящий PING iptables -A INPUT -p icmp -j ACCEPT # - Разрешить все исходящие iptables -I OUTPUT 1 -j ACCEPT # - Доступ по SSH iptables -A INPUT -p tcp --dport 22 -j ACCEPT # Разрешить доступ для Jibri iptables -A INPUT -p tcp --dport 5222 -j ACCEPT # - Сохранить настройки service netfilter-persistent save
Сохраняем и назначаем права на выполнение:
chmod +x iptables.sh
Выполняем скрипт:
sh iptables.sh
Посмотреть список правил iptables можно командой:
iptables --line-numbers -L -v -n
Необходимо убедиться, что модуль обратной связи доступен и работает:
echo "snd-aloop" >> /etc/modules modprobe snd-aloop lsmod | grep snd_aloop
У меня при проверке возникла ошибка:
modprobe: FATAL: Module snd-aloop not found in directory /lib/modules/5.4.0-100-generic
Пробую установить linux-image-generic:
apt install linux-image-generic
Перезагружаем систему и проверяем доступность модуля обратной связи:
reboot
Если всё хорошо, то ответ будет таким:
Настройка доменного имени Для смены хост-имени выполняем следующие команды (где recorder это имя сервера, а recorder.meet.mailns.ru название поддомена):
hostnamectl set-hostname recorder
Добавим в файл /etc/hosts доменное имя:
mcedit /etc/hosts
222.222.222.222 recorder.meet.mailns.ru
где 222.222.222.222 — это общедоступный IP-адрес сервера.
Перезагружаем систему:
reboot
Установим стабильную версию Google Chrome:
curl -sS -o - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" > /etc/apt/sources.list.d/google-chrome.list apt-get -y update apt-get -y install google-chrome-stable
Создадим директорию и пропишем политики:
mkdir -p /etc/opt/chrome/policies/managed echo '{ "CommandLineFlagSecurityWarningsEnabled": false }' >> /etc/opt/chrome/policies/managed/managed_policies.json
Скачаем и установим chromedriver:
CHROME_DRIVER_VERSION=`curl -sS chromedriver.storage.googleapis.com/LATEST_RELEASE` wget -N http://chromedriver.storage.googleapis.com/$CHROME_DRIVER_VERSION/chromedriver_linux64.zip -P ~/ unzip ~/chromedriver_linux64.zip -d ~/ rm ~/chromedriver_linux64.zip mv -f ~/chromedriver /usr/local/bin/chromedriver chown root:root /usr/local/bin/chromedriver chmod 0755 /usr/local/bin/chromedriver
apt-get install -y default-jre-headless ffmpeg curl alsa-utils icewm xdotool xserver-xorg-video-dummy ruby-hocon
curl https://download.jitsi.org/jitsi-key.gpg.key | sudo sh -c 'gpg --dearmor > /usr/share/keyrings/jitsi-keyring.gpg' sh -c "echo 'deb https://download.jitsi.org stable/' > /etc/apt/sources.list.d/jitsi-stable.list" sudo apt-get update sudo apt-get install -y jibri
Необходимо добавить Jibri в группы пользователей:
usermod -aG adm,audio,video,plugdev jibri
Устанавливаем Java 8, которая необходима для работы Jibri:
wget -O - https://adoptopenjdk.jfrog.io/adoptopenjdk/api/gpg/key/public | sudo apt-key add - add-apt-repository https://adoptopenjdk.jfrog.io/adoptopenjdk/deb/ apt-get update apt-get install -y adoptopenjdk-8-hotspot
Нужно настроить Java 8 по умолчанию для Jibri. Для этого открываем файл и заменяем слово «java» на полный путь «/usr/lib/jvm/adoptopenjdk-8-hotspot-amd64/bin/java»:
mcedit /opt/jitsi/jibri/launch.sh
Создадим на сервере каталог для хранения записей, ее надо будет указать в конфигурации.
mkdir /usr/local/recordings
Назначим Jibri права на каталог и сделаем владельцем:
chown jibri:jibri /usr/local/recordings
Далее необходимо настроить Jitsi-сервер для того, чтобы он знал о существовании Jibri и назначить все необходимые настройки и разрешения. Переходим на сервер Jitsi. Начнем с конфигурации Prosody внесём изменения в уже существующую секцию:
mcedit /etc/prosody/conf.avail/meet.mailns.ru.cfg.lua
Добавим значение «muc_room_cache_size = 1000» в секцию «— internal muc component»:
-- internal muc component Component "internal.auth.meet.mailns.local" "muc" storage = "memory" modules_enabled = { "ping"; } admins = { "focus@auth.meet.mailns.local", "jvb@auth.meet.mailns.local" } muc_room_locking = false muc_room_default_public_jids = true muc_room_cache_size = 1000
И добавим ещё один виртуальный хост в конце файла:
VirtualHost "recorder.meet.mailns.ru" modules_enabled = { "ping"; } authentication = "internal_plain"
Теперь надо создадь учетные записи для пользователей «jibri» и «recorder» (пароли далее указываються в конфигурации Jibri):
prosodyctl register jibri auth.meet.mailns.ru 1234567890 prosodyctl register recorder recorder.meet.mailns.ru 1234567890
Следующим действием добавим в конфигурацию Jicofo, следующие строки:
jibri: { brewery-jid: "JibriBrewery@internal.auth.meet.mailns.ru" pending-timeout: 90 seconds }
Откроем файл:
mcedit /etc/jitsi/jicofo/jicofo.conf
Теперь вернемся на сервер Jibri и добавим в файл jibri.conf следующую конфигурацию (не забываем подставлять свои значения, тут же надо указать и пароли для «jibri» и «recorder»):
Откроем файл:
mcedit /etc/jitsi/jibri/jibri.conf
jibri { id = "" single-use-mode = false recording { recordings-directory = "/usr/local/recordings" finalize-script = "/path/to/finalize_recording.sh" } streaming { rtmp-allow-list = [ ".*" ] } chrome { flags = [ "--ignore-certificate-errors", "--use-fake-ui-for-media-stream", "--start-maximized", "--kiosk", "--enabled", "--disable-infobars", "--autoplay-policy=no-user-gesture-required" ] } ffmpeg { resolution = "1920x1080" audio-source = "alsa" audio-device = "plug:bsnoop" } api { http { external-api-port = 2222 internal-api-port = 3333 } xmpp { environments = [{ name = "my-environment" xmpp-server-hosts = ["meet.mailns.ru"] xmpp-domain = "meet.mailns.ru" control-muc { domain = "internal.auth.meet.mailns.ru" room-name = "JibriBrewery" nickname = "jibri-nickname" } control-login { domain = "auth.meet.mailns.ru" username = "jibri" password = "1234567890" } call-login { domain = "recorder.meet.mailns.ru" username = "recorder" password = "1234567890" } strip-from-room-domain = "conference." usage-timeout = 0 trust-all-xmpp-certs = true }] } } stats { enable-stats-d = true } call-status-checks { no-media-timeout = 30 seconds all-muted-timeout = 10 minutes default-call-empty-timeout = 30 seconds } }
Запускаем Jibri и проверяем статус службы:
systemctl enable --now jibri systemctl status jibri
systemctl restart jitsi-videobridge2 prosody jicofo
Аутентификация пользователя
По умолчанию Jitsi Meet настроен так, что любой пользователь может подключиться к вашему серверу и создать конференцию. Но возможно настроить сервер так, чтобы конференцию мог начать только зарегистрированный пользователь. В этом случае при создании новой комнаты, Jitsi Meet будет запрашивать имя пользователя и пароль. Но для этого понадобится отредактировать файлы конфигурации. Изменим конфигурацию Prosody, откроем файл:
mcedit /etc/prosody/conf.avail/meet.mailns.ru.cfg.lua
найдем строку authentication = «anonymous» в блоке VirtualHost «meet.mailns.ru» и заменим её на строку authentication = «internal_hashed». Добавим ещё один виртуальный хост в конце файла:
VirtualHost "guest.meet.mailns.ru" authentication = "anonymous" c2s_require_encryption = false
Далее откроем файл /etc/jitsi/meet/meet.mailns.ru-config.js, раскомментируем строку // anonymousdomain: ‘guest.example.com’, и заменим адрес guest.example.com своим настоящим именем хоста: guest.meet.mailns.ru.
mcedit /etc/jitsi/meet/meet.mailns.ru-config.js
Переходим к настройке Jicofo, откроем файл конфигурации:
mcedit /etc/jitsi/jicofo/jicofo.conf
И добавим строки:
authentication: { enabled: true type: XMPP login-url: meet.mailns.ru }
Создадим учетные записи для пользователей, например:
prosodyctl register admin meet.mailns.ru 1234567890
Перезапустим службы Jitsi, чтобы изменения вступили в силу:
systemctl restart jitsi-videobridge2 prosody jicofo
Теперь при создании комнаты в Jitsi Meet необходимо будет ввести имя пользователя и пароль.
Ошибка записи
После включения записи конференции, запись прерывалась примерно через минуту с уведомлением об ошибки, в логах были следующие записи:
2022-02-21 14:05:58.729 FINE: [17] WebhookClient$updateStatus$1.invokeSuspend#107: Updating 0 subscribers of status 2022-02-21 14:06:58.746 FINE: [17] WebhookClient$updateStatus$1.invokeSuspend#107: Updating 0 subscribers of status 2022-02-21 14:07:58.731 FINE: [17] WebhookClient$updateStatus$1.invokeSuspend#107: Updating 0 subscribers of status
Проблему удалось решить уменьшением разрешения записи с 1920×1080 до 1280×720 пикселей. Для изменения разрешения открываем файл /etc/jitsi/jibri/xorg-video-dummy.conf закоментируем значение Virtual 1920 1080 и раскоментируем Virtual 1280×720.
mcedit /etc/jitsi/jibri/xorg-video-dummy.conf
Далее открываем конфигурационный файл Jibri и в секции ffmpeg меняем значение resolution = «1920×1080» на resolution = «1280×720».
mcedit /etc/jitsi/jibri/jibri.conf
Кастомизация
Путь к корневой диретории сайта:
/usr/share/jitsi-meet
Файл настроек интерфейса (в нем можно изменить логотип, убрать футер и т. д.):
/usr/share/jitsi-meet/interface_config.js
Ссылки
Jitsi Meet
Self-Hosting Guide — Debian/Ubuntu server
TUTORIAL — How to Install the NEW JIBRI
Jibri
Свой сервер видеоконференций Jitsi