service:jitsi
Различия
Показаны различия между двумя версиями страницы.
service:jitsi [22.03.2024 13:37] – [Автоконфиг] viacheslav | service:jitsi [30.07.2024 19:21] (текущий) – внешнее изменение 127.0.0.1 | ||
---|---|---|---|
Строка 1: | Строка 1: | ||
+ | ====== Jitsi ====== | ||
+ | Бесплатная система видеоконференцсвязи. | ||
+ | https:// | ||
+ | https:// | ||
+ | Тестовый сервер: | ||
+ | |||
+ | <code bash> | ||
+ | # Ubuntu/ | ||
+ | # First install the Jitsi repository key onto your system: | ||
+ | wget -qO - https:// | ||
+ | # Create a sources.list.d file with the repository: | ||
+ | sudo sh -c "echo 'deb https:// | ||
+ | # Update your package list: | ||
+ | sudo apt-get -y update | ||
+ | # Install the full suite: | ||
+ | sudo apt-get -y install jitsi-meet | ||
+ | # or only the packages you need like for example: | ||
+ | sudo apt-get -y install jitsi-videobridge | ||
+ | sudo apt-get -y install jicofo | ||
+ | sudo apt-get -y install jigasi | ||
+ | </ | ||
+ | https:// | ||
+ | |||
+ | <WRAP round tip 60%> | ||
+ | Read the [[https:// | ||
+ | </ | ||
+ | |||
+ | Ограничение на создание комнат: | ||
+ | |||
+ | ===== Автоконфиг ===== | ||
+ | Размер watermark.svg - 140x70 px. | ||
+ | <file bash / | ||
+ | 035f1f16d756e70908a274080aaa81afc43835dc93fd8fdf75e33ca48790f71e | ||
+ | </ | ||
+ | |||
+ | <file bash / | ||
+ | if ! sha256sum -c / | ||
+ | |||
+ | # copy files | ||
+ | cp / | ||
+ | cp / | ||
+ | |||
+ | # interface settings (new file) | ||
+ | sed -i " | ||
+ | / | ||
+ | / | ||
+ | " / | ||
+ | |||
+ | # interface settings (old file) | ||
+ | sed -i " | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | " / | ||
+ | |||
+ | # English default titles | ||
+ | sed -i ' | ||
+ | s/" | ||
+ | s/" | ||
+ | ' / | ||
+ | |||
+ | # language settings | ||
+ | sed -E -i ' | ||
+ | s/(.*: " | ||
+ | /" | ||
+ | /" | ||
+ | s/из Jitsi Meet/из {{appName}}/ | ||
+ | s/ | ||
+ | ' / | ||
+ | |||
+ | sed -i ' | ||
+ | s/Secure, fully featured, and completely free video conferencing/ | ||
+ | /" | ||
+ | /" | ||
+ | /" | ||
+ | s/from Jitsi Meet/c from {{appName}}/ | ||
+ | s/Jitsi link/ | ||
+ | ' / | ||
+ | |||
+ | fi | ||
+ | </ | ||
+ | |||
+ | <code bash> | ||
+ | echo >> / | ||
+ | echo "jitsi autorestore settings after update" | ||
+ | echo "*/15 * * * * root / | ||
+ | </ | ||
+ | |||
+ | <code bash> | ||
+ | # Включить возможность локальной записи - браузер сохраняет аудиофайл в свою папку загрузки | ||
+ | nano / | ||
+ | nano / | ||
+ | # формат лучше оставить flac, ogg получается кривой. | ||
+ | </ | ||
+ | ===== Список комнат ===== | ||
+ | <code bash> | ||
+ | egrep -o " | ||
+ | </ | ||
+ | |||
+ | ===== Пользователи ===== | ||
+ | Создать | ||
+ | <code bash> | ||
+ | prosodyctl register < | ||
+ | systemctl restart prosody | ||
+ | systemctl restart jicofo | ||
+ | systemctl restart jitsi-videobridge2 | ||
+ | </ | ||
+ | https:// | ||
+ | https:// | ||
+ | |||
+ | Список существующих | ||
+ | <code bash> | ||
+ | ls / | ||
+ | </ | ||
+ | “XXXX” is your domain. “.” are represented by “%2e” | ||
+ | |||
+ | To remove users I would recommend not to just delete their account files. Better use // | ||
+ | <code bash> | ||
+ | prosodyctl unregister USERNAME XXXX | ||
+ | </ | ||
+ | https:// | ||
+ | ===== Default timeout for authenticated users ===== | ||
+ | > In jicofo there is an auto login option which you can disable and no caching will be taken into account, and will ask for user/pass every time | ||
+ | |||
+ | '' | ||
+ | <code javascript> | ||
+ | jicofo { | ||
+ | authentication: | ||
+ | ... | ||
+ | enable-auto-login = false | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | :!: Устаревший метод\\ | ||
+ | '' | ||
+ | < | ||
+ | org.jitsi.jicofo.auth.DISABLE_AUTOLOGIN=true | ||
+ | </ | ||
+ | https:// | ||
+ | |||
+ | ===== Lobby ===== | ||
+ | :!: Ниже информация для устаревших систем. В новой установке лобби включено сразу. | ||
+ | |||
+ | Для использования новых фич, в частности, | ||
+ | <code bash> | ||
+ | echo deb http:// | ||
+ | wget https:// | ||
+ | apt update && apt upgrade -y && apt autoremove | ||
+ | |||
+ | nano / | ||
+ | # Replace: storage = " | ||
+ | |||
+ | service prosody restart && service jicofo restart | ||
+ | </ | ||
+ | https:// | ||
+ | |||
+ | Потом отредактировать конфиг / | ||
+ | <code lua> | ||
+ | VirtualHost " | ||
+ | ... | ||
+ | modules_enabled = { | ||
+ | ... | ||
+ | " | ||
+ | " | ||
+ | } | ||
+ | c2s_require_encryption = false | ||
+ | lobby_muc = " | ||
+ | main_muc = " | ||
+ | -- muc_lobby_whitelist = { " | ||
+ | ... | ||
+ | Component " | ||
+ | storage = " | ||
+ | restrict_room_creation = true | ||
+ | muc_room_locking = false | ||
+ | muc_room_default_public_jids = true | ||
+ | ... | ||
+ | </ | ||
+ | Раньше конфиг лобби добавлялся в VirtualHost guest.meet.example.com, | ||
+ | https:// | ||
+ | https:// | ||
+ | |||
+ | ===== Whiteboard ===== | ||
+ | Интерактивная доска с общим доступом и возможностью совместной работы. | ||
+ | |||
+ | Node в стандартных репозиториях старый, | ||
+ | <code bash> | ||
+ | # Obtain the Node.js source | ||
+ | curl -sL https:// | ||
+ | # Install the 16.x version of Node.js (This process also automatically installs NPM) | ||
+ | sudo apt install -y nodejs | ||
+ | |||
+ | # Если появляется ошибка типа | ||
+ | # / | ||
+ | # which is also in package libnode72: | ||
+ | sudo dpkg --remove --force-remove-reinstreq libnode-dev | ||
+ | sudo dpkg --remove --force-remove-reinstreq libnode72: | ||
+ | # Затем опять можно ставить node | ||
+ | sudo apt install -y nodejs | ||
+ | </ | ||
+ | https:// | ||
+ | https:// | ||
+ | |||
+ | Установка excalidraw-backend | ||
+ | <code bash> | ||
+ | # Создать юзера для работы сервиса с домашним каталогом / | ||
+ | sudo useradd -r -d / | ||
+ | mkdir / | ||
+ | chown -R excali: / | ||
+ | # Зайти под этим юзером, | ||
+ | su - excal | ||
+ | cd /opt | ||
+ | git clone https:// | ||
+ | cd ~ | ||
+ | npm install | ||
+ | </ | ||
+ | |||
+ | С настройками по умолчанию работать не будет, т. к. порты 80 и 9090 уже заняты nginx/jvb. Поэтому: | ||
+ | <code bash> | ||
+ | echo " | ||
+ | </ | ||
+ | В файле '' | ||
+ | <code javascript> | ||
+ | // listens on host: | ||
+ | prometheus.metrics(io, | ||
+ | port: 9091, | ||
+ | collectDefaultMetrics: | ||
+ | }); | ||
+ | </ | ||
+ | |||
+ | Протестировать запуск | ||
+ | <code bash> | ||
+ | DEBUG=* npm start | ||
+ | Ctrl+C | ||
+ | Ctrl+D # Дальше нужно выйти из юзера excali и продолжать под рутом. | ||
+ | </ | ||
+ | |||
+ | Настроить Jitsi: в ''/ | ||
+ | - Включить кнопку whiteboard в разделе toolbarButtons | ||
+ | - Отредактировать секцию и включить функционал <code javascript> | ||
+ | | ||
+ | enabled: true, | ||
+ | collabServerBaseUrl: | ||
+ | }, | ||
+ | </ | ||
+ | |||
+ | Настроить nginx, вставив туда | ||
+ | <code bash> | ||
+ | # excalidraw-backend websockets | ||
+ | location = /socket.io/ { | ||
+ | proxy_pass http:// | ||
+ | proxy_http_version 1.1; | ||
+ | proxy_set_header Upgrade $http_upgrade; | ||
+ | proxy_set_header Connection " | ||
+ | proxy_set_header Host $http_host; | ||
+ | tcp_nodelay on; | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | Написать юнит для автозапуска | ||
+ | <file bash / | ||
+ | [Unit] | ||
+ | Description=Excalidraw-backend | ||
+ | Requires=network.target | ||
+ | After=network.target | ||
+ | |||
+ | [Service] | ||
+ | User=excali | ||
+ | WorkingDirectory=/ | ||
+ | Type=simple | ||
+ | ExecStart=/ | ||
+ | Restart=on-failure | ||
+ | RestartSec=250s | ||
+ | TimeoutStartSec=20s | ||
+ | TimeoutStopSec=1min | ||
+ | |||
+ | [Install] | ||
+ | WantedBy=multi-user.target | ||
+ | </ | ||
+ | |||
+ | <code bash> | ||
+ | # Запустить демон и проверить | ||
+ | systemctl daemon-reload | ||
+ | systemctl enable excalidraw.service | ||
+ | systemctl start excalidraw.service | ||
+ | systemctl status excalidraw.service | ||
+ | |||
+ | # Перезапустить jitsi | ||
+ | systemctl restart prosody | ||
+ | systemctl restart jicofo | ||
+ | systemctl restart jitsi-videobridge2 | ||
+ | </ | ||
+ | |||
+ | https:// | ||
+ | https:// | ||
+ | ===== Docker ===== | ||
+ | Инструкция: | ||
+ | Скачать последнюю версию: | ||
+ | <code bash> | ||
+ | mkdir jitsi | ||
+ | wget https:// | ||
+ | tar xzf stable-5390-3.tar.gz --strip=1 -C jitsi/ | ||
+ | cd jitsi | ||
+ | cp env.example .env | ||
+ | sh ./ | ||
+ | mkdir -p ./ | ||
+ | docker-compose up -d | ||
+ | |||
+ | WARNING: The RESTART_POLICY variable is not set. Defaulting to a blank string. | ||
+ | WARNING: The HTTP_PORT variable is not set. Defaulting to a blank string. | ||
+ | WARNING: The HTTPS_PORT variable is not set. Defaulting to a blank string. | ||
+ | WARNING: The CONFIG variable is not set. Defaulting to a blank string. | ||
+ | WARNING: The XMPP_DOMAIN variable is not set. Defaulting to a blank string. | ||
+ | WARNING: The XMPP_SERVER variable is not set. Defaulting to a blank string. | ||
+ | WARNING: The JVB_PORT variable is not set. Defaulting to a blank string. | ||
+ | WARNING: The JVB_TCP_PORT variable is not set. Defaulting to a blank string. | ||
+ | ERROR: The Compose file ' | ||
+ | services.jvb.ports contains an invalid type, it should be a number, or an object | ||
+ | services.jvb.ports contains an invalid type, it should be a number, or an object | ||
+ | services.web.ports contains an invalid type, it should be a number, or an object | ||
+ | services.web.ports contains an invalid type, it should be a number, or an object | ||
+ | </ | ||
+ | |||
+ | ===== Jibri ===== | ||
+ | Компонент для записи.\\ | ||
+ | https:// | ||
+ | |||
+ | <code bash> | ||
+ | # edit config | ||
+ | vi / | ||
+ | # restart jibri | ||
+ | systemctl restart jibri | ||
+ | # view log | ||
+ | tail -f / | ||
+ | </ | ||
+ | |||
+ | <WRAP round info 80%> | ||
+ | Для Jibri (компонента записи) нужно дать достаточное кол-во процессорных ядер, например, | ||
+ | </ | ||
+ | |||
+ | Обновление уже установленной системы | ||
+ | <code bash> | ||
+ | # Update the system | ||
+ | apt update && apt upgrade -y && apt dist-upgrade -y && apt autoremove -y | ||
+ | # Update Chrome driver | ||
+ | CHROME_DRIVER_VERSION=`curl -sS chromedriver.storage.googleapis.com/ | ||
+ | wget -N http:// | ||
+ | unzip ~/ | ||
+ | rm ~/ | ||
+ | mv -f ~/ | ||
+ | chown root:root / | ||
+ | chmod 0755 / | ||
+ | </ | ||
+ | ==== Создание samba-сервера для доступа к записям ==== | ||
+ | <code bash> | ||
+ | adduser --home / | ||
+ | smbpasswd -a recordings | ||
+ | </ | ||
+ | |||
+ | / | ||
+ | < | ||
+ | [global] | ||
+ | workgroup = WORKGROUP | ||
+ | server string = Videoconf recording server | ||
+ | ntlm auth = true | ||
+ | |||
+ | [recordings] | ||
+ | path = /recordings | ||
+ | comment = Recordings | ||
+ | browsable = yes | ||
+ | read only = no | ||
+ | force create mode = 0660 | ||
+ | force directory mode = 2770 | ||
+ | force user = jibri | ||
+ | valid users = recordings @jibri | ||
+ | </ | ||
+ | |||
+ | ==== Несколько экземпляров Jibri ==== | ||
+ | Т. к. один экземпляр может писать только одну конференцию, | ||
+ | |||
+ | Сначала нужно завести на сервере jitsi учётки jibri и recorder: | ||
+ | <code bash> | ||
+ | prosodyctl register jibri auth.jitsi.mydomain.org JibriPassword | ||
+ | prosodyctl register recorder recorder.jitsi.mydomain.org RecPassword | ||
+ | </ | ||
+ | Заводить их для каждого сервера не нужно. У сервера Jibri должен быть уникальный nickname в ''/ | ||
+ | |||
+ | ==== Чтобы запись работала на запароленной конференции ==== | ||
+ | Создать **на сервере Jitsi** файл '' | ||
+ | <code lua> | ||
+ | local MUC_NS = " | ||
+ | local jid = require " | ||
+ | module: | ||
+ | local room, stanza = event.room, event.stanza; | ||
+ | |||
+ | local user, domain, res = jid.split(event.stanza.attr.from); | ||
+ | log(" | ||
+ | |||
+ | if ( user==' | ||
+ | local join = stanza: | ||
+ | join: | ||
+ | end; | ||
+ | end); | ||
+ | </ | ||
+ | |||
+ | В файле '' | ||
+ | <code lua> | ||
+ | Component " | ||
+ | restrict_room_creation = true | ||
+ | storage = " | ||
+ | modules_enabled = { | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | --" | ||
+ | " | ||
+ | " | ||
+ | } | ||
+ | admins = { " | ||
+ | muc_room_locking = false | ||
+ | muc_room_default_public_jids = true | ||
+ | |||
+ | </ | ||
+ | |||
+ | |||
+ | https:// | ||
+ | |||
+ | Склонировать (если это VM) настроенный сервер jibri, на нём | ||
+ | <code bash> | ||
+ | # поменять hostname и IP | ||
+ | hostnamectl set-hostname srv-jibri2 | ||
+ | nano /etc/hosts | ||
+ | nano / | ||
+ | netplan apply | ||
+ | |||
+ | # отредактировать config.json и вставить туда соответствующие имена учёток | ||
+ | nano / | ||
+ | </ | ||
+ | https:// | ||
+ | |||
+ | ==== Синхронизация на Windows-сервер по SMB ==== | ||
+ | <code bash> | ||
+ | #!/bin/sh | ||
+ | |||
+ | username=" | ||
+ | domain=" | ||
+ | password=" | ||
+ | smbsrv=" | ||
+ | smbpath="// | ||
+ | smbfolder="/ | ||
+ | recfolder="/ | ||
+ | smbcredfile="/ | ||
+ | syncfile="/ | ||
+ | wipefile="/ | ||
+ | |||
+ | # required components | ||
+ | apt install cifs-utils -y | ||
+ | # mount folder | ||
+ | mkdir $smbfolder | ||
+ | |||
+ | # SMB credentials file | ||
+ | echo " | ||
+ | echo " | ||
+ | echo " | ||
+ | chmod 600 $smbcredfile | ||
+ | |||
+ | # mount command | ||
+ | # mount -t cifs -o credentials=$smbcredfile " | ||
+ | |||
+ | # mount on boot | ||
+ | echo >> /etc/fstab | ||
+ | echo "# SMB share at $smbsrv" | ||
+ | echo " | ||
+ | |||
+ | # sync | ||
+ | echo "# | ||
+ | echo "if grep -qs '// | ||
+ | echo " | ||
+ | echo " | ||
+ | chmod +x $syncfile | ||
+ | # launch every 5 min | ||
+ | echo >> / | ||
+ | echo "# Sync $recfolder folder" | ||
+ | echo "*/5 * * * * root $syncfile" | ||
+ | |||
+ | # del files older than 3 days | ||
+ | echo "# | ||
+ | echo "find $recfolder -name ' | ||
+ | echo "rmdir $recfolder/ | ||
+ | chmod +x $wipefile | ||
+ | # launch once per day at 7 AM | ||
+ | echo >> / | ||
+ | echo "# Wipe old recordings" | ||
+ | echo "0 7 * * * root $wipefile" | ||
+ | </ | ||
+ | |||
+ | ==== Стриминг ==== | ||
+ | Если не на Youtube, то | ||
+ | |||
+ | Just use the full RTMP destination URL as a stream key. | ||
+ | |||
+ | https:// | ||
+ | |||
+ | https:// | ||
+ | {{: | ||
+ | |||
+ | ==== Качество видеозахвата и конференции в целом ==== | ||
+ | Разрешение видео в конференции: | ||
+ | For example: set '' | ||
+ | |||
+ | https:// | ||
+ | |||
+ | Разрешение **захвата/ | ||
+ | <code bash> | ||
+ | nano / | ||
+ | # Section " | ||
+ | Modes " | ||
+ | #Modes " | ||
+ | # В старых версиях - параметр Virtual: | ||
+ | #Virtual 1920 1080 | ||
+ | Virtual 1280 720 | ||
+ | |||
+ | nano / | ||
+ | |||
+ | jibri { | ||
+ | ffmpeg { | ||
+ | resolution = " | ||
+ | } | ||
+ | } | ||
+ | |||
+ | systemctl stop jibri-xorg | ||
+ | sleep 3 | ||
+ | systemctl start jibri | ||
+ | </ | ||
+ | https:// | ||
+ | https:// | ||
+ | |||
+ | По конференции в целом - настройки на сервере Jitsi.\\ | ||
+ | https:// | ||
+ | https:// | ||
+ | https:// | ||
+ | https:// | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ===== Решение проблем ===== | ||
+ | ==== После начала записи ffmpeg съедает все ресурсы и вылетает ==== | ||
+ | Добавить процессорных ядер на виртуалке.\\ | ||
+ | https:// | ||
+ | |||
+ | ==== Видеофайл не открывается ==== | ||
+ | Нужно на сервере Jibri установить java 8, а не 11. | ||
+ | |||
+ | <code bash> | ||
+ | sudo apt-get install openjdk-8-jdk openjdk-8-jre | ||
+ | sudo update-alternatives --config java | ||
+ | # выбрать 8-ю версию | ||
+ | </ | ||
+ | https:// | ||
+ | |||
+ | ==== Запись или стрим выключаются сами собой через какое-то время ==== | ||
+ | Происходит, | ||
+ | <code bash> | ||
+ | jibri { | ||
+ | call-status-checks { | ||
+ | // If all clients have their audio and video muted and if Jibri does not | ||
+ | // detect any data stream (audio or video) comming in, it will stop | ||
+ | // recording after NO_MEDIA_TIMEOUT expires. | ||
+ | no-media-timeout = 30 seconds | ||
+ | |||
+ | // If all clients have their audio and video muted, Jibri consideres this | ||
+ | // as an empty call and stops the recording after ALL_MUTED_TIMEOUT expires. | ||
+ | all-muted-timeout = 10 minutes | ||
+ | |||
+ | // When detecting if a call is empty, Jibri takes into consideration for how | ||
+ | // long the call has been empty already. If it has been empty for more than | ||
+ | // DEFAULT_CALL_EMPTY_TIMEOUT, | ||
+ | default-call-empty-timeout = 30 seconds | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | https:// | ||
+ | |||
+ | ==== Ошибка при обновлении сертификата Let's Encrypt ==== | ||
+ | < | ||
+ | nginx: [emerg] " | ||
+ | Cleaning up challenges | ||
+ | Attempting to renew cert (jitsi.domain.ru) from / | ||
+ | |||
+ | . Skipping. | ||
+ | All renewal attempts failed. The following certs could not be renewed: | ||
+ | / | ||
+ | </ | ||
+ | Решение: | ||
+ | <code bash> | ||
+ | # Закомментировать параметр в конфиге сайта | ||
+ | sed -i ' | ||
+ | s/ | ||
+ | ' / | ||
+ | # Прописать в общем конфиге nginx | ||
+ | sed -i ' | ||
+ | s/ | ||
+ | ' / | ||
+ | # Запустить обновление сертификата | ||
+ | certbot-auto renew | ||
+ | </ | ||
+ | https:// | ||
+ | |||
+ | ==== Jitsi не обновляется ==== | ||
+ | < | ||
+ | # apt update && apt upgrade -y && apt autoremove -y | ||
+ | Hit:1 http:// | ||
+ | Get:2 http:// | ||
+ | Get:3 http:// | ||
+ | Get:4 http:// | ||
+ | Get:5 http:// | ||
+ | Get:6 http:// | ||
+ | Hit:7 https:// | ||
+ | Fetched 345 kB in 1s (337 kB/s) | ||
+ | Reading package lists... Done | ||
+ | Building dependency tree | ||
+ | Reading state information... Done | ||
+ | 7 packages can be upgraded. Run 'apt list --upgradable' | ||
+ | Reading package lists... Done | ||
+ | Building dependency tree | ||
+ | Reading state information... Done | ||
+ | Calculating upgrade... Done | ||
+ | The following packages have been kept back: | ||
+ | jicofo jitsi-meet jitsi-meet-prosody jitsi-meet-web jitsi-meet-web-config jitsi-videobridge2 prosody | ||
+ | 0 upgraded, 0 newly installed, 0 to remove and 7 not upgraded. | ||
+ | Reading package lists... Done | ||
+ | Building dependency tree | ||
+ | Reading state information... Done | ||
+ | 0 upgraded, 0 newly installed, 0 to remove and 7 not upgraded. | ||
+ | </ | ||
+ | Проблема в том, что Prosody имеет версию ниже требуемой (0.11.7). | ||
+ | < | ||
+ | # prosodyctl about | ||
+ | Prosody 0.11.4 | ||
+ | ... | ||
+ | </ | ||
+ | | ||
+ | <code bash> | ||
+ | apt install prosody-0.11 | ||
+ | </ | ||
+ | Дальше можно обновляться как обычно. | ||
+ | |||
+ | Если перед версией 0.11 сначала была по ошибке установлена версия 0.12, то запуск службы будет заблокирован: | ||
+ | <code bash> | ||
+ | systemctl start prosody | ||
+ | Failed to start prosody.service: | ||
+ | |||
+ | # Решение | ||
+ | systemctl unmask prosody | ||
+ | systemctl start prosody | ||
+ | </ |