Установка Jitsi Meet на Ubuntu 20.04 LTS

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

Удаление UFW:

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

Установка Jitsi Meet:

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

Устанавливаем Jibri:

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

Теперь перезапускаем Jitsi:

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