Написать пост

Как настроить автоматическую запись конференций в Jitsi с помощью Jibri

Аватарка пользователя Роман Криницын, разработчик MACHAON

Рассказываю и даю пошаговую инструкцию, как поднять сервер с Jibri, чтобы транслировать видео и вести запись конференций.

Привет! Меня зовут Роман. Я back-end разработчик в digital-агентстве MACHAON. Мы занимаемся разработкой и развитием цифровых решений для b2b и EdTech.

В прошлой статье я рассказывал, как мы реализовали на нашем проекте «онлайн-школа Programica» видеотрансляции с помощью open-source решения Jitsi Meet.

Сегодня расскажу и дам пошаговую инструкцию, как поднять сервер с Jibri, чтобы транслировать и вести запись видеоконференций.

Что такое Jibri

Jibri предоставляет услуги для записи или потоковой передачи конференции Jitsi Meet. Он работает, запуская экземпляр Chrome, отображаемый в виртуальном буфере кадра, и захватывая и кодируя вывод с помощью ffmpeg. Он предназначен для запуска на отдельной машине (или виртуальной машине), при этом никакие другие приложения не используют дисплей или аудиоустройства. На одном экземпляре jibri поддерживается запись только одной видеоконференции за раз.

Простыми словами, Jibri — это способ записи конференции Jitsi. Ниже рассказывается, как можно установить и использовать Jibri на одном или нескольких выделенных серверах либо с использование docker-контейнеров.

Предварительная настройка Jitsi

Перед тем как переходить к настройке, убедитесь, что Jitsi установлен и работоспособен.

nПри настройке будет использована константа `your-domain` — это доменное имя Jitsi или его ip-адрес. Везде где она встречается требуется заменить.n

Настройки prosody

Настроим prosody для работы с Jibri.

В конфигурации prosody `/etc/prosody/conf.avail/.cfg.lua` проверьте наличие компонента или добавьте его

			Component "internal.auth." "muc"rn    modules_enabled = {rn      "ping";rn    }rn    -- Используйте "none" для prosody 0.10 и "memory" для prosody 0.11rn    storage = "memory"rn    muc_room_cache_size = 1000
		
nЕсли данный компонент уже прописан, обязательно проверьте наличие параметра `muc_room_cache_size` В противном случае это не заработает.n

А также создадим еще один виртуальный хост:

			VirtualHost "recorder."rn  modules_enabled = {rn    "ping";rn  }rn  authentication = "internal_plain"
		

Настройте две учетные записи, которые будет использовать Jibri:

jibri — для коммуникации с Jibri, отправки ему команд и получения его статуса;

recorder — для непосредственно подключения к конференциям и записи видео.

			prosodyctl register jibri auth.. {JIBRI_AUTH_PASSWORD}rnprosodyctl register recorder recorder. {JIBRI_RECORDER_PASSWORD}
		
nКонстанты `JIBRI_AUTH_PASSWORD` и `JIBRI_RECORDER_PASSWORD` будут использованы далее. Их нужно выбрать на свое усмотрение — это пароли для служебных пользователей `jibri` и `recorder` соответственно. Рекомендуется выбирать разные пароли для каждого из этих пользователей. Рекомендуемая длина — 12 символов, включая строчные и заглавные буквы латинского алфавита, цифры и специальные символы.n

Настройка prosody закончена, перезапускаем службу для изменения настроек.

sudo systemctl restart prosody

Настройки jicofo

Отредактируйте `/etc/jitsi/jicofo/jicofo.conf`, установите соответствующий MUC для поиска контроллеров Jibri. Это должен быть тот же MUC, что и в файле config.json jibri. Перезапустите Jicofo после установки этого свойства. Также предлагается установить время ожидания ожидания на 90 секунд, чтобы дать Jibri некоторое время для запуска, прежде чем попытка записи будет интерпретирована как сбой.

			jicofo {rn  ...rn  jibri {rn    brewery-jid: "JibriBrewery@internal.auth."rn    pending-timeout: 90 secondsrn  }rn  ...rn}
		
			sudo systemctl restart jicofo
		

Настройка конференции

Отредактируйте файл `/etc/jitsi/meet/-config.js`, добавьте/установите следующие свойства:

			fileRecordingsEnabled: true, // Если вам требуется записывать конференцию в файлrnliveStreamingEnabled: true, // Если вам требуется вести прямую трансляциюrnhiddenDomain: 'recorder.',
		

Также убедитесь, что в конфигурации вашего интерфейса (`/usr/share/jitsi-meet/interface_config.js` по умолчанию) массив `TOOLBAR_BUTTONS` содержит значение записи, если нужно показать кнопку записи файла, и значение прямой трансляции, если нужно показать кнопку прямого эфира. Как только запись будет включена в `-config.js`, кнопка записи станет доступна в пользовательском интерфейсе. Однако до тех пор, пока Jicofo не увидит действительный jibri, при нажатии будет отображаться сообщение «Запись в настоящее время недоступна». После успешного подключения jibri пользователю вместо этого будет предложено ввести ключ потока. Примечание. Обязательно обновите `config.json` Jibri соответствующим образом, чтобы он соответствовал любой конфигурации, выполненной выше.

Установка Jibri с использованием нескольких серверов

Этот способ взаимодействия с Jibri наиболее простой и имеет свои плюсы и минусы. Плюс в простоте настройки, более гибкой настройке каждого экземпляра jibri. Если требуется записывать только одну конференцию в один момент времени, то рекомендуется этот способ. Минусы в масштабируемости, так как под каждый экземпляр требуется заводить новый сервер. И если требуется записывать несколько конференций одновременно, то следует воспользоваться следующим способом.

Модуль ALSA

Сначала убедитесь, что модуль обратной связи ALSA доступен. Дополнительные модули (включая loopback ALSA) можно установить в Ubuntu, используя имя пакета linux-image-extra-virtual.

			# Установка модуля при загрузкеrnsudo echo "snd_aloop" >> /etc/modulesrn# Загрузка модуля в работающее ядроrnsudo modprobe snd_aloop rntrn# Убедитесь что модуль доступенrnsudo lsmod | grep snd_aloop rn# Выводrnsnd_aloop              24576  0rnsnd_pcm               106496  1 snd_alooprnsnd                    90112  3 snd_timer,snd_aloop,snd_pcm
		

Стабильная версия Google Chrome и драйвер Chrome

Следует использовать последнюю стабильную сборку Google Chrome. Его можно установить напрямую через apt, но ручные инструкции по его установке следующие:

			sudo curl https://dl-ssl.google.com/linux/linux_signing_key.pub | sudo sh -c 'gpg --dearmor > /usr/share/keyrings/google-chrome-keyring.gpg'rnsudo echo "deb [arch=amd64 signed-by=/usr/share/keyrings/google-chrome-keyring.gpg] http://dl.google.com/linux/chrome/deb/ stable main" | sudo tee /etc/apt/sources.list.d/google-chrome.listrnsudo apt-get -y updaternsudo apt-get -y install google-chrome-stable
		

Добавьте файл управляемых политик Chrome и задайте для CommandLineFlagSecurityWarningsEnabled значение false. Это скроет предупреждения в Chrome. Вы можете установить его так:

			sudo mkdir -p /etc/opt/chrome/policies/managedrnsudo echo '{ "CommandLineFlagSecurityWarningsEnabled": false }' >>/etc/opt/chrome/policies/managed/managed_policies.json
		

Chromedriver также требуется и может быть установлен следующим образом:

			CHROME_DRIVER_VERSION=`curl -sS chromedriver.storage.googleapis.com/LATEST_RELEASE`rnwget -N http://chromedriver.storage.googleapis.com/$CHROME_DRIVER_VERSION/chromedriver_linux64.zip -P ~/rnunzip ~/chromedriver_linux64.zip -d ~/rnrm ~/chromedriver_linux64.ziprnsudo mv -f ~/chromedriver /usr/local/bin/chromedriverrnsudo chown root:root /usr/local/bin/chromedriverrnsudo chmod 0755 /usr/local/bin/chromedriver
		

Дополнительные необходимые пакеты

Необходимые зависимости см. в управляющем файле debian. Их можно установить с помощью следующей команды:

			sudo apt-get install default-jre-headless ffmpeg curl alsa-utils icewm xdotool xserver-xorg-video-dummy ruby-hocon
		

Установка Jibri

Пакеты Jibri можно найти в стабильном репозитории на сайте downloads.jitsi.org. Сначала установите ключ репозитория Jitsi в свою систему:

			curl https://download.jitsi.org/jitsi-key.gpg.key | sudo sh -c 'gpg --dearmor > /usr/share/keyrings/jitsi-keyring.gpg'
		

Создайте файл `sources.list.d` с репозиторием:

			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
		

Установите последнюю версию jibri:

			sudo apt-get updaternsudo apt-get install jibri
		

User, group

Убедитесь, что пользователь jibri находится в правильных группах, чтобы получить полный доступ к аудио- и видеоустройствам. Пример: «adm», «audio», «video», «plugdev».

			sudo usermod -aG adm,audio,video,plugdev jibri
		

Config files

Отредактируйте файл `jibri.conf` (установленный по умолчанию в `/etc/jitsi/jibri/jibri.conf`) соответствующим образом. Вы можете посмотреть в reference.conf значения по умолчанию и пример того, как настроить `jibri.conf`. Переопределите только те значения, которые требуется изменить.

			jibri {rn     api {rn        xmpp {rn            environments = [rn                {rn                    name = ""rn                    xmpp-server-hosts = [""],rn                    xmpp-domain = ""rn                    control-login {rn                        domain = "auth."rn                        username = "jibri"rn                        password = "{JIBRI_AUTH_PASSWORD}"rn                        port = 5222rn                    }rn                    control-muc {rn                        domain = "internal.auth."rn                        room-name = "JibriBrewery"rn                        nickname = "{JIBRI_RECORDER_NICKNAME}"rn                    }rn                    call-login {rn                        domain = "recorder."rn                        username = "recorder"rn                        password = "{JIBRI_RECORDER_PASSWORD}"rn                    }rn                    strip-from-room-domain = "conference."rn                    trust-all-xmpp-certs = truern                    usage-timeout = 0rn                }rn            ]rn        }rn     }rn     # Секция recording не является обязательной и может быть удаленаrn     recording {rn        recordings-directory = "/path/to/recordings"rn        finalize-script = "/path/to/finalize_script.sh"rn     }rn}
		
n`JIBRI_RECORDER_NICKNAME` можно выбрать на свое усмотрение. Это имя будет использоваться при присоединении Jibri к конференции.n

Чтобы задать собственную папку для сохранения записей, ее требуется создать и дать права на доступ к папке.

			mkdir /path/to/recordingsrnchown jibri:jibri /path/to/recordingsrnchmod 775 /path/to/recordings
		

Чтобы добавить скрипт, который будет выполняться после того, как запись будет сформирована, также требуется создать данный скрипт и установить нужные права.

			nano /path/to/finalize_script.shrnchown jibri:jibri /path/to/finalize_script.shrnchmod 755 /path/to/finalize_script.sh
		

Логирование

По умолчанию Jibri регистрируется в `/var/log/jitsi/jibri`. Если вы не устанавливаете через пакет debian, вам нужно убедиться, что этот каталог существует (или изменить местоположение, в которое Jibri ведет журналы, отредактировав конфигурацию журнала).

Установка jibri с использованием docker-контейнеров

Чтобы решить проблему с масштабируемостью, мы воспользуемся docker и обернем каждый экземпляр ijbri в отдельный контейнер. Таким образом мы сможем динамически добавлять и убирать экземпляры, если того требует сервис, который использует запись видеоконференций.

Требования

У вас должен быть установлен и запущен работоспособный docker.

Модуль ALSA

Сначала убедитесь, что модуль обратной связи ALSA доступен. Дополнительные модули (включая loopback ALSA) можно установить в Ubuntu, используя имя пакета linux-image-extra-virtual.

Так же добавим устройства ALSA-loopback. Количество этих устройств должно быть не меньше количества экземпляров Jibri, которые планируется использовать. В данном случае их будет создано 5 штук.

			#Создадим 5 устройств для захватаrnsudo echo "options snd-aloop enable=1,1,1,1,1 index=0,1,2,3,4" > /etc/modprobe.d/alsa-loopback.confrntrn# Установка модуля при загрузкеrnsudo echo "snd_aloop" >> /etc/modulesrntrn# Загрузка модуля в работающее ядроrnsudo modprobe snd_aloop rntrn# Убедитесь что модуль доступенrnsudo lsmod | grep snd_aloop rn# Выводrnsnd_aloop              24576  0rnsnd_pcm               106496  1 snd_alooprnsnd                    90112  3 snd_timer,snd_aloop,snd_pcm
		

Настройка docker

Создадим файл конфигурации

			#Создадим каталог хранения конфигурационных файлов для контейнеровrnsudo mkdir /etc/jibri-dockerrnrn#Создадим файл конфигурации контейнераrnsudo nano /etc/jibri-docker/jibri.yml
		

со следующим содержимым:

			version: '3'rnrnservices:rn    jibri:rn      image: jitsi/jibrirn      volumes:rn          - ${CONFIG}/jibri:/configrn          - /dev/shm:/dev/shmrn      cap_add:rn          - SYS_ADMINrn          - NET_BIND_SERVICErn      devices:rn          - /dev/snd:/dev/sndrn      environment:rn          - XMPP_AUTH_DOMAINrn          - XMPP_INTERNAL_MUC_DOMAINrn          - XMPP_RECORDER_DOMAINrn          - XMPP_SERVERrn          - XMPP_DOMAINrn          - JIBRI_XMPP_USERrn          - JIBRI_XMPP_PASSWORDrn          - JIBRI_BREWERY_MUCrn          - JIBRI_RECORDER_USERrn          - JIBRI_RECORDER_PASSWORDrn          - JIBRI_RECORDING_DIRrn          - JIBRI_FINALIZE_RECORDING_SCRIPT_PATHrn          - JIBRI_STRIP_DOMAIN_JIDrn          - JIBRI_LOGS_DIRrn          - DISPLAY=:0rn          - TZrn```
		

Тут же создадим файл с переменными окружения.

			sudo nano /etc/jibri-docker/.env
		

со следующим содержимым:

			# JIBRI CONFIGrnrn# Internal XMPP domain for authenticated servicesrnXMPP_AUTH_DOMAIN=auth.rnrn# XMPP domain for the internal MUC used for jibri, jigasi and jvb poolsrnXMPP_INTERNAL_MUC_DOMAIN=internal.auth.rnrn# XMPP domain for the jibri recorderrnXMPP_RECORDER_DOMAIN=recorder.rnrn# Internal XMPP serverrnXMPP_SERVER=rnrn# Internal XMPP domainrnXMPP_DOMAIN=rnrn# XMPP user for Jibri client connectionsrnJIBRI_XMPP_USER=jibrirnrn# XMPP password for Jibri client connectionsrnJIBRI_XMPP_PASSWORD={JIBRI_AUTH_PASSWORD}rnrn# MUC name for the Jibri poolrnJIBRI_BREWERY_MUC=jibribreweryrnrn# XMPP recorder user for Jibri client connectionsrnJIBRI_RECORDER_USER=recorderrnrn# XMPP recorder password for Jibri client connectionsrnJIBRI_RECORDER_PASSWORD={JIBRI_RECORDER_PASSWORD}rnrn# Directory for recordings inside Jibri containerrnJIBRI_RECORDING_DIR=/config/recordingsrnrn# The finalizing script. Will run after recording is completernJIBRI_FINALIZE_RECORDING_SCRIPT_PATH=/config/finalize.shrnrn# When jibri gets a request to start a service for a room, the roomrn# jid will look like: roomName@optional.prefixes.subdomain.xmpp_domainrn# We'll build the url for the call by transforming that into:rn# https://xmpp_domain/subdomain/roomNamern# So if there are any prefixes in the jid (like jitsi meet, whichrn# has its participants join a muc at conference.xmpp_domain) thenrn# list that prefix here so it can be stripped out to generatern# the call url correctlyrnJIBRI_STRIP_DOMAIN_JID=conferencernrn# Directory for logs inside Jibri containerrnJIBRI_LOGS_DIR=/config/logsrnrnDISPLAY=:0=
		

Пробуем запустить контейнер.

			cd /etc/jibri-dockerrnsudo docker-compose -f jibri.yml up
		
nЕсли ufw активен, то может возникнуть ошибка. Для этого требуется открыть порт 5222 ufw allow 5222n

Если все хорошо, останавливаем контейнер и переходим к тому, что будет запущено 5 контейнеров, для одновременной записи 5 конференций. Если нужно больше 5, то нужно не забыть кроме увеличения количества контейнеров, увеличить количество ALSA-loopback устройств на сервере Jibri.

Запустим несколько контейнеров.

			docker-compose -f jibri.yml up --scale jibri=5 -d
		

После этой команды будет запущено 5 контейнеров, но при этом на Jitsi будет доступна запись только одной конференции одновременно. Это происходит из-за того, что для каждого экземпляра Jibri нужно указать своё ALSA-loopback устройство.

Чтобы это сделать выполним команды:

			docker exec jibridocker_jibri_1 sed -i 's/Loopback/0/g' /home/jibri/.asoundrcrndocker exec jibridocker_jibri_2 sed -i 's/Loopback/1/g' /home/jibri/.asoundrcrndocker exec jibridocker_jibri_3 sed -i 's/Loopback/2/g' /home/jibri/.asoundrcrndocker exec jibridocker_jibri_4 sed -i 's/Loopback/3/g' /home/jibri/.asoundrcrndocker exec jibridocker_jibri_5 sed -i 's/Loopback/4/g' /home/jibri/.asoundrc
		

и перезапустим контейнеры

			docker restart jibridocker_jibri_1 jibridocker_jibri_2 jibridocker_jibri_3 jibridocker_jibri_4 jibridocker_jibri_5
		

Чтобы облегчить работу с контейнерами, можно вынести команды настройки устройств ALSA-loopback и перезапуска в отдельный файл, так как они могут быть полезными.

			#Чтобы остановить контейнеры используйтеrndocker-compose stoprnrn#Чтобы возобновить работу контейнеров, не забывая указывать количество требуемых контейнеров и выделять под них ALSA-loopback устройстваrndocker-compose -f jibri.yml up --scale jibri=5 -d
		

Благодарю за внимание! Надеюсь, был полезен. Если есть вопросы, пишите в комментариях, обсудим.

Следите за новыми постами
Следите за новыми постами по любимым темам
3К открытий3К показов