пятница, 23 октября 2020 г.

Запись видеоконференций Jitsi Meet с помощью Jibri, запущенного в docker-контейнере

Процесс установки и настройки сервиса видеоконференций Jitsi Meet был описан в одной из предыдущих заметок. Указанная в той заметке конфигурация срвиса была лишена одной немаловажной возможности, а именно возможности вести видеозапись конференции. За наличие этой возможности отвечает сервис Jibri (JItsi BRoadcasting Infrastructure). Его настройка и будет описана далее.

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

Напомню, что Jitsi Meet установлен на Ubuntu 18.04 с адресом meet.oldfag.ru. На этот же сервер установим Docker Comunity Edition, где и будем запускать контейнеры с Jibri, чтобы ресурсы сервера не простаивали.
Однако если запускать контейнеры на другой машине, то в последовательности действий абсолютно ничего не изменится.
Описание настройки, для удобства, разделю на следующие этапы:
- настройка Prosody
- настройка Jicofo
- настройка интерфейса Jitsi Meet
- настройка ОС, на которой установлен Jitsi Meet
- установка docker, запуск и настройка сервиса Jibri

Так как подходящего способа получить количество активных комнат на сервере я так и не нашёл, плагин для Prosody mod_muc_size мне победить не удалось, а так же не нашлось способа контролировать проставивают ли сейчас экземпляры Jibri в контейнерах и останавливать таковые, то просто буду запускать 5 экземпляров службы, т.к. с вероятностью, близкой к 100%, на данном сервере не будет запущено более 5 видеоконференций одновременно.

Предполагается, что все команды выполняются от имени пользователя с повышенными полномочиями, например через
sudo -s
Инструкция по настройке служб Jitsi Meet для использования Jibri есть на GitHub Jitsi

Начнём с того, что настроим ядро всей системы - jabber-сервер Prosody.
Откроем файл конфигурации нашего сервера
nano /etc/prosody/conf.avail/meet.oldfag.ru.cfg.lua
и добавим ещё один виртуальный хост
VirtualHost "recorder.meet.oldfag.ru"
    modules_enabled = {
      "ping";
    }
    authentication = "internal_plain"
а так же внесём изменения в уже существующую секцию
-- internal muc component
Component "internal.auth.meet.oldfag.ru" "muc"
    storage = "none"
    modules_enabled = {
        "ping";
    }
    admins = { "focus@auth.meet.oldfag.ru", "jvb@auth.meet.oldfag.ru" }
    muc_room_locking = false
    muc_room_default_public_jids = true
    muc_room_cache_size = 1000  <<==== вот эту строку добавляем
Создадим на Prosody двух локальных пользователей, одного для коммуникации с Jibri, отправки ему команд и получения его статуса - jibri, второго для непосредственно подключения к конференциям и записи видео - recorder.
prosodyctl register jibri auth.meet.oldfag.ru jibri-auth-strong-pass
prosodyctl register recorder recorder.meet.oldfag.ru jibri-recorder-strong-pass
Настройка закончена, перезапускаем службу для применения настроек.
systemctl restart prosody
Службу можно перезапустить так же и с использованием prosodyctl
prosodyctl restart
Переходим к настройке модератора конференций - Jicofo (JItsi COnference FOcus).
Откроем файл /etc/jitsi/jicofo/sip-communicator.properties и добавим строки
org.jitsi.jicofo.jibri.BREWERY=JibriBrewery@internal.auth.meet.oldfag.ru
org.jitsi.jicofo.jibri.PENDING_TIMEOUT=90
Сохраним изменения и перезапустим службу
systemctl restart jicofo
В интерфейс Jitsi Meet нужно добавить кнопки для записи и трансляции видео, для этого открываем файл /etc/jitsi/meet/meet.oldfag.ru-config.js, переходим в секцию Recording и меняем строки
// fileRecordingsEnabled: false,
// liveStreamingEnabled: false,
на
fileRecordingsEnabled: true,
liveStreamingEnabled: true,
а так же добавляем строку
hiddenDomain: 'recorder.meet.oldfag.ru',
Кроме изменения настроек сервисов, так же нужно добавить ALSA-loopback устройства в ОС, на которой запущен сервис Jitsi Meet.
Количество этих устройств должно быть не меньше количества экземпляров Jibri, которые планируется использовать. В данном случае их будет создано 5 штук.
Инструкция по их настройке есть на GitHub Jitsi.
Обновим установленные пакеты и установим дополнительные драйверы
apt update && apt upgrade -y
apt install linux-image-extra-virtual -y
создадим 5 устройств для захвата
echo "options snd-aloop enable=1,1,1,1,1 index=0,1,2,3,4" > /etc/modprobe.d/alsa-loopback.conf
добавим загрузку модуля при старте системы
echo "snd-aloop" >> /etc/modules
и загрузим модуль ядра в текущем сеансе, без перезагрузки системы
modprobe snd_aloop
Проверим, что модуль загружен
lsmod | grep snd_aloop
Если всё хорошо, то ответ будет таким
snd_aloop              24576  0
snd_pcm                98304  1 snd_aloop
snd                    81920  3 snd_timer,snd_aloop,snd_pcm
А теперь последнее по очереди, но не по значению - насройка docker и запуск контейнеров Jibri.
Для начала установим docker согласно инструкции.
Добавим ключ безопасности репозитория
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -
и сам репозиторий
add-apt-repository \
    "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
    $(lsb_release -cs) \
    stable"
Обновим список доступных пакетов и установим необходимые
apt update && apt install docker-ce docker-ce-cli containerd.io docker-compose -y
После того, как всё установится можно проверить что всё работает, запустив тестовый контейнер
docker run hello-world
Образ будет загружен из Docker Hub и запущен, если всё хорошо, то в консоли отобразится сообщение
Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
    1. The Docker client contacted the Docker daemon.
    2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
    3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
    4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
    $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
    https://hub.docker.com/

For more examples and ideas, visit:
    https://docs.docker.com/get-started/
Не забываем добавить автозагрузку
systemctl enable docker
Создадим каталог хранения конфигурационных файлов для контейнеров
mkdir /etc/jibri-docker
а в нём файл конфигурации контейнера
touch /etc/jibri-docker/jibri.yml
со следующим содержанием
version: '3'

services:
    jibri:
      image: jitsi/jibri
      volumes:
          - ${CONFIG}/jibri:/config
          - /dev/shm:/dev/shm
      cap_add:
          - SYS_ADMIN
          - NET_BIND_SERVICE
      devices:
          - /dev/snd:/dev/snd
      environment:
          - XMPP_AUTH_DOMAIN
          - XMPP_INTERNAL_MUC_DOMAIN
          - XMPP_RECORDER_DOMAIN
          - XMPP_SERVER
          - XMPP_DOMAIN
          - JIBRI_XMPP_USER
          - JIBRI_XMPP_PASSWORD
          - JIBRI_BREWERY_MUC
          - JIBRI_RECORDER_USER
          - JIBRI_RECORDER_PASSWORD
          - JIBRI_RECORDING_DIR
          - JIBRI_FINALIZE_RECORDING_SCRIPT_PATH
          - JIBRI_STRIP_DOMAIN_JID
          - JIBRI_LOGS_DIR
          - DISPLAY=:0
          - TZ
В yml-файле не должно быть табуляций, все отступы создаются только пробелами.
Тут же создадим файл с переменными окружения
touch /etc/jibri-docker/.env
который будет содержать значения имён и паролей пользователей prosody, созданных ранее, адреса подключения и другие параметры.
# JIBRI CONFIG

# Internal XMPP domain for authenticated services
XMPP_AUTH_DOMAIN=auth.meet.oldfag.ru

# XMPP domain for the internal MUC used for jibri, jigasi and jvb pools
XMPP_INTERNAL_MUC_DOMAIN=internal.auth.meet.oldfag.ru

# XMPP domain for the jibri recorder
XMPP_RECORDER_DOMAIN=recorder.meet.oldfag.ru

# Internal XMPP server
XMPP_SERVER=meet.oldfag.ru

# Internal XMPP domain
XMPP_DOMAIN=meet.oldfag.ru

# XMPP user for Jibri client connections
JIBRI_XMPP_USER=jibri

# XMPP password for Jibri client connections
JIBRI_XMPP_PASSWORD=jibri-auth-strong-pass

# MUC name for the Jibri pool
JIBRI_BREWERY_MUC=jibribrewery

# XMPP recorder user for Jibri client connections
JIBRI_RECORDER_USER=recorder

# XMPP recorder password for Jibri client connections
JIBRI_RECORDER_PASSWORD=jibri-recorder-strong-pass

# Directory for recordings inside Jibri container
JIBRI_RECORDING_DIR=/config/recordings

# The finalizing script. Will run after recording is complete
JIBRI_FINALIZE_RECORDING_SCRIPT_PATH=/config/finalize.sh

# When jibri gets a request to start a service for a room, the room
# jid will look like: roomName@optional.prefixes.subdomain.xmpp_domain
# We'll build the url for the call by transforming that into:
# https://xmpp_domain/subdomain/roomName
# So if there are any prefixes in the jid (like jitsi meet, which
# has its participants join a muc at conference.xmpp_domain) then
# list that prefix here so it can be stripped out to generate
# the call url correctly
JIBRI_STRIP_DOMAIN_JID=conference

# Directory for logs inside Jibri container
JIBRI_LOGS_DIR=/config/logs

DISPLAY=:0=
Пробуем запустить контейнер
cd /etc/jibri-docker
docker-compose -f jibri.yml up
Если ufw активен, то тут можно будет увидеть ошибку
org.jivesoftware.smack.SmackException$ConnectionException: The following addresses failed: 'meet.oldfag.ru:5222' failed because: meet.oldfag.ru/192.168.1.147 exception: java.net.SocketTimeoutException: connect timed out
Останавливаем контейнер (Ctlr+C). Добавляем правило для 5222 порта, это порт, используемый Jicofo
ufw allow 5222
Запускаем контейнер снова. Если всё хорошо, то в консоли можно будет увидеть
jibri_1  | 2020-10-22 09:48:44.648 INFO: [27] org.jitsi.xmpp.mucclient.MucClient.log() Joined MUC: jibribrewery@internal.auth.meet.oldfag.ru
Опять останавливаем контейнер и переходим к тому, что будет запущено 5 контейнеров, для одновременной записи 5 конференций. Если нужно больше 5, то нужно не забыть кроме увеличения количества контейнеров увеличить количество ALSA-loopback устройств на сервере Jitsi.

Запустить несколько контейнеров сразу можно с помощью ключа --scale
docker-compose -f jibri.yml up --scale jibri=5 -d
jibri после ключа --scale в этой команде - имя службы, указанное в yml-файле, ключ -d нужен для того, чтобы контейнер запустился без вывода всего и вся в консоль.
После этой команды будет запущено 5 контейнеров, но при этом на Jitsi будет доступна запись только одной конференции одновременно. Это происходит из-за того, что для каждого экземпляра Jibri нужно указать своё ALSA-loopback устройство.
Чтобы это сделать выполним команды
docker exec jibridocker_jibri_1 sed -i 's/Loopback/0/g' /home/jibri/.asoundrc
docker exec jibridocker_jibri_2 sed -i 's/Loopback/1/g' /home/jibri/.asoundrc
docker exec jibridocker_jibri_3 sed -i 's/Loopback/2/g' /home/jibri/.asoundrc
docker exec jibridocker_jibri_4 sed -i 's/Loopback/3/g' /home/jibri/.asoundrc
docker 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 и перезапуска контейнеров лучше записать в отдельный исполняемый файл, т.к. они могут понадобится при неосторожном удалении контейнеров или обновлении образа Jibri из Docker Hub.

Чтобы контейнеры поднимались при старте системы нужно выполнить команду
docker update --restart always <CONTAINER ID 1> <CONTAINER ID 2> ... <CONTAINER ID 5>
Идентификатор контейнера можно узнать выполнив команду
docker ps -a
Чтобы остановить контейнеры, если это необходимо, нужно использовать команду
docker-compose -f jibri.yml stop
а не
docker-compose -f jibri.yml down
т.к. последняя не только остановит контейнеры, но и удалит их, а следовательно и конфигурацию устройств в них.

Всё готово. Можно создать конференцию, открыть меню конференции, нажав на три точки в правом нижнем углу, выбрать пункт «Начать запись» и услышать заветное: "Recording is on."

Записи видеоконференций хранятся в /jibri/recordings/. Для постобработки записи (перемещение, публикация и т.д.) можно создать скрипт /jibri/finalize.sh, его имя может быть любым, но оно должно быть указано в /etc/jibri-docker/.env в параметре JIBRI_FINALIZE_RECORDING_SCRIPT_PATH. Его пример можно найти на GitHub Jitsi

53 комментария:

  1. Привет.
    При запуске compose ошибку выдает:
    WARNING: The CONFIG variable is not set. Defaulting to a blank string.
    Pulling jibri (jitsi/jibri:)...
    Что может быть?

    ОтветитьУдалить
    Ответы
    1. Если в вашем дистрибутиве docker-compose не переваривает необъявленные переменные, то есть два пути решения:
      1) избавиться от использования переменной CONFIG в yml-файле, и объявить маппинг как
      volumes:
      - /jibri:/config

      2) объявить переменную в файле .env
      CONFIG=/somedir

      Но при этом каталог с записями переместится в /somedir/jibri/recordings

      Удалить
  2. Здравствуйте. Три раза проходила полный путь настройки (вдруг опечатка или что-то забыла) и все три раза запинаюсь на этапе запуска контейнера:

    ERROR: yaml.parser.ParserError: while parsing a block mapping
    in "./jibri.yml", line 1, column 1
    expected , but found ''
    in "./jibri.yml", line 3, column 5

    Как думаете, в чем может быть проблема?

    ОтветитьУдалить
    Ответы
    1. ERROR: yaml.parser.ParserError: while parsing a block mapping
      in "./jibri.yml", line 1, column 1
      expected < block end > , but found ' < block mapping start > '
      in "./jibri.yml", line 3, column 5

      Удалить
    2. Сообщение об ошибке говорит о том, что нарушен синтаксис в файле jibri.yml. Где-то поставлен лишний пробел или знак табуляции, которые yaml вообще не переваривает. Можете привести полностью содержимое файла?

      Удалить
    3. version: '3'

      services:
      jibri:
      image: jitsi/jibri
      volumes:
      - /jibri:/config
      - /dev/shm:/dev/shm
      cap_add:
      - SYS_ADMIN
      - NET_BIND_SERVICE
      devices:
      - /dev/snd:/dev/snd
      environment:
      - XMPP_AUTH_DOMAIN
      - XMPP_INTERNAL_MUC_DOMAIN
      - XMPP_RECORDER_DOMAIN
      - XMPP_SERVER
      - XMPP_DOMAIN
      - JIBRI_XMPP_USER
      - JIBRI_XMPP_PASSWORD
      - JIBRI_BREWERY_MUC
      - JIBRI_RECORDER_USER
      - JIBRI_RECORDER_PASSWORD
      - JIBRI_RECORDING_DIR
      - JIBRI_FINALIZE_RECORDING_SCRIPT_PATH
      - JIBRI_STRIP_DOMAIN_JID
      - JIBRI_LOGS_DIR
      - DISPLAY=:0
      - TZ

      Удалить
    4. Тут съелись пробелы, но они в исходном файле есть. Собственно, делала полную копи-пасту по Вашей инструкции через nano. Вот эта строчка "- /jibri:/config" - это уже сразу эксперимент, про который Вы писали в своем комментарии выше, изначально я пробовала через исходный "- ${CONFIG}/jibri:/config". Выходит та же ошибка. Ставлю только пробелы, никаких табуляций. Пустую строку удаляла, потом вновь восстанавливала, ошибка появляется.

      Удалить
    5. version: '3'

      services:
      jibri:
      image: jitsi/jibri
      volumes:
      - /jibri:/config
      - /dev/shm:/dev/shm
      cap_add:
      - SYS_ADMIN
      - NET_BIND_SERVICE
      devices:
      - /dev/snd:/dev/snd
      environment:
      - XMPP_AUTH_DOMAIN
      - XMPP_INTERNAL_MUC_DOMAIN
      - XMPP_RECORDER_DOMAIN
      - XMPP_SERVER
      - XMPP_DOMAIN
      - JIBRI_XMPP_USER
      - JIBRI_XMPP_PASSWORD
      - JIBRI_BREWERY_MUC
      - JIBRI_RECORDER_USER
      - JIBRI_RECORDER_PASSWORD
      - JIBRI_RECORDING_DIR
      - JIBRI_FINALIZE_RECORDING_SCRIPT_PATH
      - JIBRI_STRIP_DOMAIN_JID
      - JIBRI_LOGS_DIR
      - DISPLAY=:0
      - TZ

      Удалить
    6. Все равно пробелы съедает, даже если в ручную тут в форме попытаться их воспроизвести.

      Удалить
    7. Обновил содержимое статьи, касающееся файла jibri.yml. Декоратор кода наставил туда лишних пробелов. Если его снова скопировать и вставить, то всё должно получиться.

      Удалить
    8. Спасибо! Получилось!

      Удалить
  3. Доброе утро. Полностью повторила инструкцию, все контрольные точки отражались как в статье (т.е. то, что я должна была увидеть - видела). Опечатки проверила - нет. Контейнеры все подняты. Однако при нажатии на кнопку записи - "Запись невозможна". Jicofo проверила, опечаток нет. Установку Jibri я брала из мануала - https://cyborg.cc/?p=624 . Единственное, что я заметила, это то, что когда Вы настраивали Jitsi Meet, то использовали Active Directory для аутентификации, а я использовала аутентификацию через логин/пароль, введённый в систему (internal_plain). Это может как-то повлиять? Просто уже не знаю, в какую сторону копать и куда смотреть.

    ОтветитьУдалить
    Ответы
    1. В статье описан запуск Jibri в контейнере, отдельная установка и настройка jibri не требуется при этом. Возможно возникла путаница из-за использования двух статей для разных реализаций сервиса одновременно.

      Если речь про контейнеры, то нужно запустить его без ключа -d и проверить, нет ли проблем с файрволлом.

      Логи Jicofo можно посмотреть в /var/log/jitsi/jicofo.log, возможно там что-то полезное найдётся.

      Удалить
    2. Первично делала без установки, четко как в инструкции. Потом подумала, что проблема в том, что не ставила, ибо в логах было то, что нет Jibri. Сейчас попробовала через установку. Но результат один и тот же. Зашла в логи, действительно, Jitsifo не видит Jibri

      Jicofo 2021-01-13 09:23:58.368 SEVERE: [212] org.jitsi.jicofo.recording.jibri.JibriSession.log() Unable to find an available Jibri, can't start
      Jicofo 2021-01-13 09:23:58.368 INFO: [212] org.jitsi.jicofo.recording.jibri.JibriRecorder.log() Failed to start a Jibri session, no Jibris available


      Фаервол простукала, 5222 порт открыт и по ipv4, и по ipv6. Контейнеры выдают такие предупреждения:
      2021-01-12 08:14:13.363 WARNING: [26] org.jitsi.xmpp.mucclient.MucClient.log() [MucClient id=meet.****.ru hostname=meet.****.ru] error connecting
      jibri_1 | org.jivesoftware.smack.SmackException$ConnectionException: The following addresses failed: 'meet.****.ru:5222' failed because: meet.****.ru/127.0.1.1 exception: java.net.ConnectException: Connection refused (Connection refused)

      Удалить
    3. Похоже проблема в файрволле, а получается ли у Jibri подключиться к Jitsi, если файрволл вообще отключить на время?

      Удалить
    4. Полностью отключила фаервол (disable), запустила конференцию, новую комнату и попробовала запись. Нет, выдает ровно то же самое. В логах от сегодняшнего числа аналогичные записи со вчерашним.
      Подняла фаервол и проверила его текущие правила, все, как положено для работы jitsi meet и jibri...

      Состояние: активен
      В Действие Из
      - -------- --
      OpenSSH ALLOW Anywhere
      80/tcp ALLOW Anywhere
      443/tcp ALLOW Anywhere
      4443/tcp ALLOW Anywhere
      10000:20000/udp ALLOW Anywhere
      5222 ALLOW Anywhere
      OpenSSH (v6) ALLOW Anywhere (v6)
      80/tcp (v6) ALLOW Anywhere (v6)
      443/tcp (v6) ALLOW Anywhere (v6)
      4443/tcp (v6) ALLOW Anywhere (v6)
      10000:20000/udp (v6) ALLOW Anywhere (v6)
      5222 (v6) ALLOW Anywhere (v6)

      Удалить
    5. jitsi и контейнер jibri запущены на одном сервере?
      Если ли возможность обратиться telnet'ом к серверу jitsi на порт 5222, по доменному имени (meet.****.ru) и по ip (127.0.1.1)?

      Удалить
    6. Если telnet'ом удастся подключиться, то нужно проверить имя пользователя и пароль учётных записей jibri и recorder на prosody, а так же их соответствие в файле /etc/jibri-docker/.env

      Удалить
    7. >>jitsi и контейнер jibri запущены на одном сервере?
      Да, я все делаю с одной машины.

      Обратилась. С одной стороны, связь не рвет, но и нет ответа как от SSH:
      root@meet:/home/administrator# telnet meet.*****.ru 5222
      Trying 127.0.1.1...
      Connected to meet.*****.ru.
      Escape character is '^]'.
      ^CConnection closed by foreign host.
      root@meet:/home/administrator# telnet 127.0.1.1 5222
      Trying 127.0.1.1...
      Connected to 127.0.1.1.
      Escape character is '^]'.
      ^CConnection closed by foreign host.

      Попробовала через телнет обратиться к стандартной проверке:
      Вот тут похожая ошибка, что и в контейнерах:
      root@meet:/home/administrator# telnet localhost 123
      Trying 127.0.0.1...
      telnet: Unable to connect to remote host: Connection refused

      root@meet:/home/administrator# telnet localhost 22
      Trying 127.0.0.1...
      Connected to localhost.
      Escape character is '^]'.
      SSH-2.0-OpenSSH_7.6p1 Ubuntu-4ubuntu0.3
      ^C
      Connection closed by foreign host.

      Не уверена, что подключение по доменному имени и по ip можно считать удачным, оно вроде и подключилось, но ответ никакой не дало... Это можно считать удачным подключением и все же копать в пользователях?

      На procody пользователей добавляла командой из Вашей инструкции, открыла файл /etc/jibri-docker/.env , посмотрела, что один в один данные с моей командой на добавление пользователей. На всякий случай добавила пользователей с данными, полностью скопированными из файла /etc/jibri-docker/.env . Службу перезапустила. Все осталось на своих местах, запись не запускается.

      Удалить
    8. С подключением к порту 5222 всё нормально, об этом говорит сообщение: "Connected to ..."

      Удалить
    9. Возможно где-то ошибка в конфигурационных файлах prosody, jibri (файл .env) или jicofo. Нужно проверить, не осталось ли где-то в них упоминание имени meet.oldfag.ru, что бывает при копировании конфигов, вместо необходимого вам.

      Удалить
    10. Аналогичные две проблемы:
      1. С CONNECTION как у вас, сделал следующее: в файле /etc/hosts изменил ip 127.0.0.1 meet.XXXXX.ru на реальный IP в сети. И в одном месте и правда осталось "упоминание имени meet.oldfag.ru"
      2.JICOFO.LOG:
      Jicofo 2021-01-15 22:44:54.807 SEVERE: [35] org.jitsi.jicofo.recording.jibri.JibriSession.log() Unable to find an available Jibri, can't start
      Jicofo 2021-01-15 22:44:54.809 INFO: [35] org.jitsi.jicofo.recording.jibri.JibriRecorder.log() Failed to start a Jibri session, no Jibris available

      Не пойму куда копать....

      Удалить
    11. Тороплюсь писать сообщение, забыл пояснить что первый пункт -решился как раз.
      Остался второй.

      Удалить
    12. olex1984, если jicofo не видит jibri, то нужно начинать с того, что пишет jibri при запуске контейнера.

      Удалить
    13. Большой вывод получится :-) Но я ориентировался на последние строки:
      jibri_1 | 2021-01-16 17:11:43.491 INFO: [1] org.jitsi.jibri.Main.main() Using port 2222 for HTTP API
      jibri_1 | 2021-01-16 17:11:43.497 WARNING: [26] org.jitsi.xmpp.mucclient.MucClient.log() Disabling certificate verification!
      jibri_1 | 2021-01-16 17:11:43.528 FINE: [26] org.jitsi.xmpp.mucclient.MucClient.log() About to connect and login.
      jibri_1 | 2021-01-16 17:11:43.693 INFO: [26] org.jitsi.xmpp.mucclient.MucClient.log() Connected.
      jibri_1 | 2021-01-16 17:11:43.693 INFO: [26] org.jitsi.xmpp.mucclient.MucClient.log() Logging in.
      jibri_1 | 2021-01-16 17:11:43.780 FINE: [26] org.jitsi.xmpp.mucclient.MucClient.log() Authenticated, b=false
      jibri_1 | 2021-01-16 17:11:43.781 FINE: [26] org.jitsi.xmpp.mucclient.MucClient.log() About to join MUCs: [jvbbrewery@internal.auth.meet.MY_DOMAIN.ru]
      jibri_1 | 2021-01-16 17:11:43.820 INFO: [26] org.jitsi.xmpp.mucclient.MucClient.log() Joined MUC: jvbbrewery@internal.auth.meet.MY_DOMAIN.ru
      jibri_1 | 2021-01-16 17:11:43.828 FINE: [38] org.jitsi.xmpp.extensions.DefaultPacketExtensionProvider.parse() Could not add a provider for element busy-status from namespace http://jitsi.org/protocol/jibri
      jibri_1 | 2021-01-16 17:11:43.828 FINE: [38] org.jitsi.xmpp.extensions.DefaultPacketExtensionProvider.parse() Could not add a provider for element health-status from namespace http://jitsi.org/protocol/health

      Удалить
    14. Опечатки проверила я и несколько человек. Нашли одну: вместо hiddenDomain: 'recorder.meet.****.ru' я написала - hiddenDomain: 'recoder.meet.*****.ru'. Поправила и ничего не изменилось. Все также jicofo не видит jibri. Больше опечаток не нашли. Единственное, что у меня 18 убунта, так что, может в этом дело...

      Удалить
  4. Сделал!!!
    На этот мануал я вышел от безысходности с оф.маном. решил попробовать с ДОКЕРОМ. Но увы. Так же история. Все в пустую.
    Вчера на одном англоязычном форуме увидел пост, как один чел мучался и мучался как я с JIBRI, у него ничего не получалось и он вычитал, что JIBRI работает на ядре 4.4, а это UBUNTU 16.04. Его еще поправили, типа UBUNTU 16.04 из-за того, что там идет поддеhжка ALSA LOOP и JAVA 8 в репах по стандарту.
    Ну я снес все. Установил UBUNTU 16.04 server и по ману от сюда https://www.youtube.com/watch?v=S43-A1N_COE , все стал делать с нуля (на JIBRI машине, JITSI MEET у меня на отдельно ВМ). Понятно что из мана теперь исключил JAVA, т.к. она стандартно в репах 8-ой версии ставится. И все с первого раза завелось - ЧУДО не иначе :-) Неделю убил на JIBRI. А дело то ... В ядре и Яве. Может и еще в чем то... Надо забэкапить не забыть ВМ от греха подальше :-)
    P.S.: на убунтах 20 и 18 тоже пробовал по тому-же ману и этому с докером джаву 8-ую ставить, все равно службы не заводились ни jibri-xorg, ни jibri-icewm. А тут с полпинка :-)
    P.P.S: руки так и чешутся на 16ую докер запилить по этому ману - проверить так сказать :-)

    ОтветитьУдалить
    Ответы
    1. отвечу Вам тут :) " /etc/hosts изменил ip 127.0.0.1 meet.XXXXX.ru " В данной строчке у меня "ip 127.0.1.1 meet.XXXXX.ru ", т.е. 1 вместо 0. У меня в хосте первая строчка 127.0.0.1 localhost, вторая - ip 127.0.1.1 meet.XXXXX.ru . У Вас по структуре хост такой же? Или у Вас первой строчки нет? (петли)

      По другому вопросу: у меня нет возможности jibri на другую машину взгромоздить( Я надеялась ее запустить на одной машине с Jitsi Meet. Но Jitsi у меня была настроена на 18 убунте... В целом, я немного не понимаю, что нужно донастраивать и дописывать, чтобы Jibri вывести на отдельную машину. Видимо, тут только одно возможно - сносить машину всю и с нуля настраивать Jitsi на 16.04 убунте. Надеюсь все же с 18 разобраться, ну вдруг. Но зато хоть теперь понятно, в чем дело и почему не запускается хоть в лепешку разбейся.

      Удалить
    2. root@jitsi-record:~# cat /etc/hosts это машина с JIBRI на 18 убунте.
      127.0.0.1 localhost
      127.0.1.1 jitsi-record.xxxxxxx.int jitsi-record

      192.168.32.57 meet.xxxxxxxx.ru meet

      Дело в том, что кроме того, что они увидились, у меня пошли проблемы с запуском XORG и прочего под 18-ой. JAVA именно 8-ая нужна. Там же кроме сервиса jibri, в зависимостях его: jibri-xorg, jibri-icewm. И Дебажить очень трудно. Поэтому для меня проще стало попробовать отдельную машину для JIBRI. Вот хороший ман: https://nerdonthestreet.com/wiki?find=Set+Up+Jibri+for+Jitsi+Recording%3Aslash%3AStreaming .

      Вы можете прислать мне ваш EMAIL, я могу свои конфиги выслать. Но лучше для теста все таки взять отдельную машину и на ней попробовать. Т.к. я пробовал LXC запустить в 18-ой с 16-ой. И вроде даже как они видят друг друга, но запись не идет, т.к. моджуль ядра не 4.4, а выше. И его уже не переделать. И поэтому snd_aloop не получается добавить.
      Вобщем граблей выше крыши.

      Установив же 16-ую, по тому ману (выше написал) с первого раза запись заработала.

      Удалить
    3. Пардон (жаль нельзя править коментарии), приходится добавлять.
      Опечатался выше:
      ХОСТ JIBRI на 16 убунте.

      Удалить
    4. Ссылку, которую Вы только что прислали, очень похожа на стандартный мануал. Я с этого начинала войну с JIBRI и изначально пробовала по этому пути настраивать. Доходила до момента открытия и изменения файла "nano /etc/jitsi/jibri/config.json" и тут схлапывалась. У меня при полностью выполненных условиях инструкции, не было такого файла. Создавать с нуля? Так вроде написано - что отредактируйте... Я и переустанавливала, и с бубном прыгала, и пинала. А он гад так и не появлялся. Вроде даже пыталась создать, но воз и ныне там был. Отчаявшись, продолжила гуглить и потом наткнулась на данного автора. Тут, как Вы видите, совершенно другая инструкция. =) И что-то мне подсказывает, что сделай я это все на 16.4 убунте, у меня может все заработать. А может и не заработать. Собственно, поэтому начала задавать вопросы =))

      Создать виртуалку на сервере, затолкать на нее 16.4 убунту - я могу, уточнила этот вопрос. Но сразу куча вопросов: если на нее не надо взгромождать jitsi meet, то тогда где править конфигурационные файлы Jitsi meet? На машине с jitsi? И как этой виртуальной машине дать пинка в сторону машины с jitsi?

      Еще вопрос возникает. Если у меня Jitsi стоит на 18.04 убунте, а jibri на 16.4, конфликта не будет? Или Вы как раз про это и писали здесь =>> "Т.к. я пробовал LXC запустить в 18-ой с 16-ой. И вроде даже как они видят друг друга, но запись не идет, т.к. моджуль ядра не 4.4, а выше. И его уже не переделать."

      Вполне возможно, что вопрос глупый, но я еще плаваю в этой теме, а настраивать уже срочнонадасейчас. =))

      Почту, я так понимаю, можно только в комментарии оставить, да?

      Удалить
    5. Нет лишнего городить не нужно будет ничего. У меня:
      1-ВМ JITSI MEET тоже на убунте 18.04. Там стоит стандартный набор кроме JIBRI.
      2-ВМ JIBRI и только. Т.е. все настройки для JIBRI у меня остались на 1-ой ВМ (серверная сторона настройки), а на второй я настраивал только: chrome, chromedriver, JAVA extra кажется, ну и конфиг из стандартного мана для JIBRI (config.json) Ну и пользователя добавить в систему нужно будет(так же из мана), т.к. там суть очень хитрая.Как я понял из под пользователя создается ГРАФ.окружение, запускается хром и он подключается к комнате, а потом этот видео поток кодирует FFMPEG-ом в файл. + чтобы подключение было через сеть, то и /etc/hosts я добавлял хост jitsi-meet. Причем через внутреннюю сеть. И все заработало.
      Вот видео по тому ману(гораздо лучше смотреть и делать ;-) ): https://www.youtube.com/watch?v=S43-A1N_COE&t=1938s И правильно ты подметила, я по оф.ману тоже больше вопросов имел, чем пользы, либо я ничерта в линухе уже не понимаю. И в итоге jibri.conf вобще оставил без настроек, а создал в ручную config.json. Это все станет более менее видно, если в службы зайти jibri.service в systemd, то там параметры всех конфигов указаны.

      Я включил адрес своей почты "напоказ". напиши туда тест. Я снова уберу видимость ящика в настройках профиля. И буду отвечать уже в gmail-е.

      Удалить
  5. Здравствуйте! Отличная инструкция. Правда у меня работает запись 1-й комнаты, а вторая и последующие комнаты уже не записываются =( (есть попытки записи, но потом стоп) Можете подсказать куда смотреть? Спасибо
    docker exec jibri-docker_jibri_1 sed -i 's/Loopback/0/g' /home/jibri/.asoundrc
    docker exec jibri-docker_jibri_2 sed -i 's/Loopback/1/g' /home/jibri/.asoundrc
    ...
    Looback я не забыл.
    Ошибки такие
    jibri_2 | 2021-02-01 17:43:40.680 FINE: [17] org.jitsi.jibri.util.ProcessStatePublisher.ffmpeg.invoke() Process ffmpeg hasn't written in 2 seconds, publishing periodic update
    jibri_2 | 2021-02-01 17:43:40.681 INFO: [56] org.jitsi.jibri.capture.ffmpeg.FfmpegCapturer.onFfmpegProcessUpdate() Ffmpeg quit abruptly. Last output line: plug:bsnoop: Input/output error
    jibri_2 | 2021-02-01 17:43:40.683 INFO: [56] org.jitsi.jibri.capture.ffmpeg.FfmpegCapturer.onFfmpegS
    tateMachineStateChange() Ffmpeg capturer transitioning from state Starting up to Error: QuitUnexpectedly SESSION plug:bsnoop: Input/output error
    jibri_2 | 2021-02-01 17:43:40.683 INFO: [56] org.jitsi.jibri.service.impl.FileRecordingJibriService.onServiceStateChange() File recording service transitioning from state Starting up to Error: QuitUnexpectedly SESSION plug:bsnoop: Input/output error
    jibri_2 | 2021-02-01 17:43:40.684 INFO: [56] org.jitsi.jibri.api.xmpp.XmppApi.invoke() Current service had an error Error: QuitUnexpectedly SESSION plug:bsnoop: Input/output error, sending error iq
    jibri_2 | 2021-02-01 17:43:40.685 FINE: [56] org.jitsi.jibri.statsd.JibriStatsDClient.incrementCounter() Incrementing statsd counter: stop:recording
    ....
    2021-02-01 17:47:33.724 INFO: [78] org.jitsi.jibri.status.JibriStatusManager.log() Busy status has changed: BUSY -> IDLE
    jibri_2 | 2021-02-01 17:47:33.724 FINE: [78] org.jitsi.jibri.webhooks.v1.WebhookClient.invokeSuspend() Updating 0 subscribers of status
    jibri_2 | 2021-02-01 17:47:33.724 INFO: [78] org.jitsi.jibri.api.xmpp.XmppApi.updatePresence() Jibri reports its status is now JibriStatus(busyStatus=IDLE, health=OverallHealth(healthStatus=HEALTHY, details={})), publishing presence to connections
    jibri_2 | 2021-02-01 17:47:33.725 FINE: [78] org.jitsi.xmpp.mucclient.MucClientManager.log() Setting a presence extension: org.jitsi.xmpp.extensions.jibri.JibriStatusPacketExt@39d63a3d
    jibri_2 | 2021-02-01 17:47:33.725 FINE: [78] org.jitsi.xmpp.mucclient.MucClientManager.log() Replacing presence extension: org.jitsi.xmpp.extensions.jibri.JibriStatusPacketExt@5b470e0a

    ОтветитьУдалить
    Ответы
    1. Loopback-устройства были указаны для контейнеров, а были ли они созданы на сервере с Jitsi?

      Удалить
  6. Oldfag а Вы не подскажите как настроить "поделиться ссылкой" ??
    fileRecordingsServiceSharingEnabled: true я включил но когда запись идет и после ее отключения, ничего не появляется на экране или в чате. где она должна отображаться хотя бы? а то я сделал внешнюю ссылку и хочу чтобы люди могли сами брать записи без моей помощи

    ОтветитьУдалить
    Ответы
    1. Получилось настроить одновременную запись нескольких комнат?
      Что касается fileRecordingsServiceSharingEnabled, то как я понял, это работает только тогда когда настроена интеграция записи с dropbox, например.
      Если её нет, но отдать записи пользователям для самостоятельного скачивания хочется, то можно их публиковать куда-нибудь с помощью завершающего скрипта, указанного в параметре JIBRI_FINALIZE_RECORDING_SCRIPT_PATH (последний абзац статьи). Самый простой способ выкладывать их на общий ресурс.

      Удалить
    2. Скрипт публикации придётся написать самостоятельно.

      Удалить
    3. да я все настроил. у меня все 5 docker-ов записывают в 1 папку и на nginx я открыл их чтобы через веб скачивать можно было (я заметил что на 5 записывающих комнат нужно больше 4 ядер, а то jicofo не выдержал, запись даже при таком случае нормально останавливается без битого файла). и телефония тоже работает входящие и исходящие. в инете куча инструкций, но ни одна из них не приведет к полностью работающей системе. так же я сейчас делаю Etherpad, shared document editing addon для одновременного редактирования файлов.

      Удалить
    4. А телефония какая? Сейчас думаю как freepbx подружить с jitsi, но не нашёл толковой инструкции как это сделать. Где можно почитать?

      Удалить
    5. у меня "голый" asterisk. я могу помочь сделать исходящие звонки из конференций и входящие так же (там добавляется SIPAddHeader для присоединение к комнате, я работал с elastix ранее и там есть extensions_custom.conf в который можно самому кодить). я настраивал jigasi без докера, прямо на сервере службой.

      Удалить
    6. Погляди форум, человек очень подробно и качественно описал данные процессы:
      https://community.jitsi.org/t/conference-mapper-api/39258/5 - Настройка API
      https://community.jitsi.org/t/tutorial-jitsi-jigasi-freepbx-integration-along-with-asterisk-ivr-to-use-jitsi-conference-mapper-api/48554/14 - Настройка интеграции.

      Удалить
    7. В догонку. По настройке API
      https://community.jitsi.org/t/tutorial-self-hosted-conference-mapper-api/53901

      Удалить
  7. Добрый день.

    Настроил всё по инструкции, но запись не идет.
    Я Docker только начал изучать, до Docker-compose еще даже не доходил.

    В какие логи смотреть? На фронте стандартная ошибка - как будто сервис записи и не настроен вообще.

    ОтветитьУдалить
    Ответы
    1. Для начала нужно запустить один контейнер и убедиться, что он подключился к jitsi. Если контейнер запущен без ключа -d, то весь вывод jibri будет сыпаться прямо в консоль.

      Удалить
    2. Если контейнер jibri успешно подключается к jitsi, то следующее, что стоит проверить - настройка alsa-loopback устройств. Если они не созданы на хосте или не настроены в контейнере, то запись будет невозможна.

      Удалить
  8. Подскажите сколько места запись занимает ? И сколько ресурсов нужно для запуска докера ? Например если делать одновременно 20-25 jibry

    ОтветитьУдалить
    Ответы
    1. По поводу занимаемого места, то на 1 минуту записи приходится где-то 2 Мб места. Что касается ресурсов, то примерно 300 Мб ОЗУ съедает один записывающий контейнер и где-то по 10-15% на каждом из 4 ядер виртуалки.

      Удалить
  9. здравствуйте, спасибо за супер полезную статью!
    почему то платформа Blogger удаляет мои комментарии к этой статье (или они на review)? есть другой способ для связи?

    ОтветитьУдалить
    Ответы
    1. на Ubuntu18.4 пускаю docker для видеозаписи.
      Jibri стартует File recording service стартует, пишет логи, browser файл, но запись видео проваливается

      непонятное из логов Jibri

      jibri_1 | INFO: [61] org.jitsi.jibri.selenium.pageobjects.HomePage.log() Visiting url
      jibri_1 | EVERE: [61] org.jitsi.jibri.selenium.JibriSelenium.log() An error occurred while joining the call
      jibri_1 | org.openqa.selenium.InvalidArgumentException: invalid argument

      и в файле Browser есть 1 error - could navigate to page
      в json файле, meeting url - undefined

      OLDFAG, может быть причиной что jibri или browser компоненте не передалось URL конференции?
      те где в конфигах для jibri установить VIsitingURL который сейчас "undefined"?

      Удалить
    2. Прошу прощения за долгий ответ, но лучше позже, чем никогда.
      1. Действительно, по непонятной причине, 4 ваших комментария попали под подозрение в спаме.
      2. Достаточно сложно дать ответ по 4 строчками лога. Если вопрос ещё актуален, то можете прислать лог (вывод консоли) полностью на blog собака oldfag.ru?

      Удалить
  10. Здравствуйте, спасибо за полезную статью!
    Как добавить rclone для переноса файлов записи в азур в jibri.yml или это неправильное место для этого.
    Хочу добавить
    apt update
    apt install curl -y
    curl https://rclone.org/install.sh | bash

    ОтветитьУдалить
    Ответы
    1. хм, для чего rclone - curl сам прекрасно через webdav отправляет файлы. Пример скрипта для отправки в nextcloud:
      #!/bin/bash
      RECORDINGS_DIR=$1
      curl -T $RECORDINGS_DIR/*.mp4 --user 'jibri:NextcloudPass' 'http://nextcloud.domain.ru/remote.php/webdav/recordings/'
      exit 0

      Удалить
  11. А как поменять качество записываемого видео?

    ОтветитьУдалить