====== Jitsi ====== Бесплатная система видеоконференцсвязи. https://jitsi.org/\\ https://github.com/jitsi/jitsi-meet\\ Тестовый сервер: https://meet.jit.si/ # Ubuntu/Debian: # First install the Jitsi repository key onto your system: wget -qO - https://download.jitsi.org/jitsi-key.gpg.key | sudo apt-key add - # Create a sources.list.d file with the repository: sudo sh -c "echo 'deb https://download.jitsi.org stable/' > /etc/apt/sources.list.d/jitsi-stable.list" # 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://jitsi.org/downloads/ubuntu-debian-installations-instructions/ Read the [[https://jitsi.org/qi|quick-install guide]] and its advanced section for further configuration (Firewall, Port Forwarding or for Running jitsi-videobridge behind NAT)! Ограничение на создание комнат: https://jitsi.github.io/handbook/docs/devops-guide/secure-domain/ ===== Автоконфиг ===== Размер watermark.svg - 140x70 px. 035f1f16d756e70908a274080aaa81afc43835dc93fd8fdf75e33ca48790f71e /usr/share/jitsi-meet/images/watermark.svg if ! sha256sum -c /root/watermark.sha256; then # copy files cp /root/jitsi-watermark-company.svg /usr/share/jitsi-meet/images/watermark.svg cp /root/jitsi-favicon-company.ico /usr/share/jitsi-meet/images/favicon.ico # interface settings (new file) sed -i " /defaultRemoteDisplayName:/c defaultRemoteDisplayName: 'Participant', /disableE2EE:/c disableE2EE: true, " /usr/share/jitsi-meet-web-config/config.js # interface settings (old file) sed -i " /APP_NAME:/c APP_NAME: 'VICS Horns and Hooves', /JITSI_WATERMARK_LINK:/c JITSI_WATERMARK_LINK: 'https://www.hornsandhooves.ru/', /LIVE_STREAMING_HELP_LINK:/c LIVE_STREAMING_HELP_LINK: 'https://support.google.com/youtube/answer/2474026', /DISPLAY_WELCOME_FOOTER:/c DISPLAY_WELCOME_FOOTER: false, /GENERATE_ROOMNAMES_ON_WELCOME_PAGE:/c GENERATE_ROOMNAMES_ON_WELCOME_PAGE: false, /DEFAULT_REMOTE_DISPLAY_NAME:/c DEFAULT_REMOTE_DISPLAY_NAME: 'Participant', " /usr/share/jitsi-meet/interface_config.js # English default titles sed -i ' s/"headerTitle":"Jitsi Meet"/"headerTitle":"VIC system of Horns and Hooves"/ s/"headerSubtitle":"Secure and high quality meetings"/"headerSubtitle":" "/ ' /usr/share/jitsi-meet/libs/app.bundle.min.js # language settings sed -E -i ' s/(.*: ")Сервер видеоконференцсвязи.*(".*)/\1ВКС АО «Рога и Копыта»\2/ /"appDescription":/c "appDescription": " ", /"headerSubtitle":/c "headerSubtitle": " ", s/из Jitsi Meet/из {{appName}}/g s/ссылку Jitsi/ссылку {{appName}}/g ' /usr/share/jitsi-meet/lang/main-ru.json sed -i ' s/Secure, fully featured, and completely free video conferencing/VIC system of Horns and Hooves/g /"headerTitle":/c "headerTitle": "VIC system of Horns and Hooves", /"appDescription":/c "appDescription": " ", /"headerSubtitle":/c "headerSubtitle": " ", s/from Jitsi Meet/c from {{appName}}/g s/Jitsi link/{{appName}} link/g ' /usr/share/jitsi-meet/lang/main.json fi echo >> /etc/crontab echo "jitsi autorestore settings after update" >> /etc/crontab echo "*/15 * * * * root /root/jitsi-autoconfig.sh" >> /etc/crontab # Включить возможность локальной записи - браузер сохраняет аудиофайл в свою папку загрузки nano /etc/jitsi/meet/domain.ru-config.js # раскомментировать раздел localRecording nano /usr/share/jitsi-meet/interface_config.js # включить кнопку localrecording в интерфейсе # формат лучше оставить flac, ogg получается кривой. ===== Список комнат ===== egrep -o "(Created|Disposed).*count[^,]*" /var/log/jitsi/jicofo.log ===== Пользователи ===== Создать prosodyctl register jitsi-meet.example.com systemctl restart prosody systemctl restart jicofo systemctl restart jitsi-videobridge2 https://jitsi.github.io/handbook/docs/devops-guide/secure-domain\\ https://prosody.im/doc/creating_accounts Список существующих ls /var/lib/prosody/XXXX/accounts “XXXX” is your domain. “.” are represented by “%2e” To remove users I would recommend not to just delete their account files. Better use //unregister// command: prosodyctl unregister USERNAME XXXX https://community.jitsi.org/t/list-of-active-users/47375 ===== 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 ''nano /etc/jitsi/jicofo/jicofo.conf'' jicofo { authentication: { ... enable-auto-login = false } } :!: Устаревший метод\\ ''nano /etc/jitsi/jicofo/sip-communicator.properties'' org.jitsi.jicofo.auth.DISABLE_AUTOLOGIN=true https://community.jitsi.org/t/default-timeout-for-authenticated-users/17664 ===== Lobby ===== :!: Ниже информация для устаревших систем. В новой установке лобби включено сразу. Для использования новых фич, в частности, Lobby, надо обновить компонент Prosody echo deb http://packages.prosody.im/debian $(lsb_release -sc) main | sudo tee -a /etc/apt/sources.list wget https://prosody.im/files/prosody-debian-packages.key -O- | sudo apt-key add - apt update && apt upgrade -y && apt autoremove nano /etc/prosody/conf.avail/meet.domain.com.cfg.lua # Replace: storage = "none" with storage = "memory" service prosody restart && service jicofo restart https://community.jitsi.org/t/how-to-how-do-i-update-prosody/72205 Потом отредактировать конфиг /etc/prosody/conf.d/meet.example.com.cfg.lua VirtualHost "meet.example.com" ... modules_enabled = { ... "conference_duration"; "muc_lobby_rooms"; } c2s_require_encryption = false lobby_muc = "lobby.meet.example.com" main_muc = "conference.meet.example.com" -- muc_lobby_whitelist = { "recorder.meet.example.com" } -- Here we can whitelist jibri to enter lobby enabled rooms ... Component "lobby.meet.example.com" "muc" storage = "memory" restrict_room_creation = true muc_room_locking = false muc_room_default_public_jids = true ... Раньше конфиг лобби добавлялся в VirtualHost guest.meet.example.com, но теперь конфигурация перенесена в основной домен. Из гостевого хоста конфигурацию лобби необходимо убрать, иначе опция лобби появится, но запросы от участников модератору приходить не будут!\\ https://community.jitsi.org/t/how-to-how-do-i-use-the-new-lobby-feature/73100\\ https://community.jitsi.org/t/fix-lobby-not-working-after-upgrade-to-latest-version-2-0-5390/90541 ===== Whiteboard ===== Интерактивная доска с общим доступом и возможностью совместной работы. Node в стандартных репозиториях старый, поэтому нужно добавить сторонний. # Obtain the Node.js source curl -sL https://deb.nodesource.com/setup_16.x | sudo -E bash - # Install the 16.x version of Node.js (This process also automatically installs NPM) sudo apt install -y nodejs # Если появляется ошибка типа # /var/cache/apt/archives/nodejs_16.15.0-deb-1nodesource1_amd64.deb trying to overwrite '/usr/share/systemtap/tapset/node.stp', # which is also in package libnode72:amd64 12.22.9~dfsg-1ubuntu3, выполнить sudo dpkg --remove --force-remove-reinstreq libnode-dev sudo dpkg --remove --force-remove-reinstreq libnode72:amd64 # Затем опять можно ставить node sudo apt install -y nodejs https://www.linode.com/docs/guides/install-nodejs-on-ubuntu-22-04/#installing-a-specific-version\\ https://github.com/nodesource/distributions/issues/1157#issuecomment-1131212089 Установка excalidraw-backend # Создать юзера для работы сервиса с домашним каталогом /opt/excalidraw-backend sudo useradd -r -d /opt/excalidraw-backend excali mkdir /opt/excalidraw-backend chown -R excali: /opt/excalidraw-backend # Зайти под этим юзером, клонировать репозиторий, скачать зависимости su - excal cd /opt git clone https://github.com/jitsi/excalidraw-backend.git cd ~ npm install С настройками по умолчанию работать не будет, т. к. порты 80 и 9090 уже заняты nginx/jvb. Поэтому: echo "PORT=3002" >.env.production В файле ''src/index.ts'' поменять порт 9090 на 9091 или ещё какой-нибудь. // listens on host:9090/metrics prometheus.metrics(io, { port: 9091, collectDefaultMetrics: true }); Протестировать запуск DEBUG=* npm start Ctrl+C Ctrl+D # Дальше нужно выйти из юзера excali и продолжать под рутом. Настроить Jitsi: в ''/etc/jitsi/meet/jitsi.example.com-config.js'' - Включить кнопку whiteboard в разделе toolbarButtons - Отредактировать секцию и включить функционал whiteboard: { enabled: true, collabServerBaseUrl: 'https://jitsi.example.com' }, Настроить nginx, вставив туда # excalidraw-backend websockets location = /socket.io/ { proxy_pass http://127.0.0.1:3002/socket.io/?$args; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $http_host; tcp_nodelay on; } Написать юнит для автозапуска [Unit] Description=Excalidraw-backend Requires=network.target After=network.target [Service] User=excali WorkingDirectory=/opt/excalidraw-backend Type=simple ExecStart=/usr/bin/npm start Restart=on-failure RestartSec=250s TimeoutStartSec=20s TimeoutStopSec=1min [Install] WantedBy=multi-user.target # Запустить демон и проверить 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://community.jitsi.org/t/installing-excalidraw-backend-for-whiteboard-feature-on-self-hosted-jitsi-mee/118883\\ https://community.jitsi.org/t/whiteboard-is-available-but-not-functioning/126490/22 ===== Docker ===== Инструкция: https://jitsi.github.io/handbook/docs/devops-guide/devops-guide-docker\\ Скачать последнюю версию: https://github.com/jitsi/docker-jitsi-meet/releases/latest mkdir jitsi wget https://github.com/jitsi/docker-jitsi-meet/archive/stable-5390-3.tar.gz tar xzf stable-5390-3.tar.gz --strip=1 -C jitsi/ cd jitsi cp env.example .env sh ./gen-passwords.sh mkdir -p ./.jitsi-meet-cfg/{web/letsencrypt,transcripts,prosody/config,prosody/prosody-plugins-custom,jicofo,jvb,jigasi,jibri} 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 'docker-compose.yml' is invalid because: 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://github.com/jitsi/jibri # edit config vi /etc/jitsi/jibri/config.json # restart jibri systemctl restart jibri # view log tail -f /var/log/jitsi/jibri/log.0.txt Для Jibri (компонента записи) нужно дать достаточное кол-во процессорных ядер, например, 4. Иначе, ffmpeg через короткое время вылетает. Обновление уже установленной системы # 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/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 ==== Создание samba-сервера для доступа к записям ==== adduser --home /home/recordings --no-create-home --shell /usr/sbin/nologin --ingroup jibri recordings smbpasswd -a recordings /etc/samba/smb.conf [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: prosodyctl register jibri auth.jitsi.mydomain.org JibriPassword prosodyctl register recorder recorder.jitsi.mydomain.org RecPassword Заводить их для каждого сервера не нужно. У сервера Jibri должен быть уникальный nickname в ''/etc/jitsi/jibri/config.json'', а пользователи могут быть одинаковыми. ==== Чтобы запись работала на запароленной конференции ==== Создать **на сервере Jitsi** файл ''vi /usr/share/jitsi-meet/prosody-plugins/mod_jibri_wo_passwd.lua'' c содержимым (менять ничего, кроме домена, не нужно) local MUC_NS = "http://jabber.org/protocol/muc"; local jid = require "util.jid"; module:hook("muc-occupant-pre-join", function (event) local room, stanza = event.room, event.stanza; local user, domain, res = jid.split(event.stanza.attr.from); log("info", "--------------> user %s domain %s res %s pass %s", tostring(user),tostring(domain),tostring(res),tostring(room:get_password())); if ( user=='recorder' and domain=='recorder.jitsi.domain.ru' ) then local join = stanza:get_child("x", MUC_NS); join:tag("password", { xmlns = MUC_NS }):text(room:get_password()); end; end); В файле ''vi /etc/prosody/conf.avail/jitsi.domain.ru.cfg.lua'' **на сервере Jitsi** добавить модуль (здесь: jibri_wo_passwd) Component "conference.jitsi.domain.ru" "muc" restrict_room_creation = true storage = "memory" modules_enabled = { "muc_meeting_id"; "muc_domain_mapper"; "polls"; --"token_verification"; "muc_rate_limit"; "jibri_wo_passwd"; } admins = { "focus@auth.jitsi.domain.ru" } muc_room_locking = false muc_room_default_public_jids = true https://community.jitsi.org/t/jibri-authenticating-if-a-room-has-a-password-added-by-moderator/18775/61 Склонировать (если это VM) настроенный сервер jibri, на нём # поменять hostname и IP hostnamectl set-hostname srv-jibri2 nano /etc/hosts nano /etc/netplan/00-installer-config.yaml netplan apply # отредактировать config.json и вставить туда соответствующие имена учёток nano /etc/jitsi/jibri/config.json https://community.jitsi.org/t/how-to-setup-multiple-jibri-servers-need-help-around-config/33604 ==== Синхронизация на Windows-сервер по SMB ==== #!/bin/sh username="vasya" domain="domain.ru" password="12345678" smbsrv="srv-fs" smbpath="//$smbsrv/ВКС" smbfolder="/media/smbshare" recfolder="/recordings" smbcredfile="/root/smbcred" syncfile="/root/sync.sh" wipefile="/root/wipe-recordings.sh" # required components apt install cifs-utils -y # mount folder mkdir $smbfolder # SMB credentials file echo "username=$username" > $smbcredfile echo "domain=$domain" >> $smbcredfile echo "password=$password" >> $smbcredfile chmod 600 $smbcredfile # mount command # mount -t cifs -o credentials=$smbcredfile "$smbpath" $smbfolder # mount on boot echo >> /etc/fstab echo "# SMB share at $smbsrv" >> /etc/fstab echo "$smbpath $smbfolder cifs credentials=$smbcredfile,file_mode=0755,dir_mode=0755 0 0" >> /etc/fstab # sync echo "#!/bin/sh" > $syncfile echo "if grep -qs '//$smbsrv' /proc/mounts; then" >> $syncfile echo " rsync --archive --include=*.mp4 --exclude=* $recfolder/*/ $smbfolder/" >> $syncfile echo "fi" >> $syncfile chmod +x $syncfile # launch every 5 min echo >> /etc/crontab echo "# Sync $recfolder folder" >> /etc/crontab echo "*/5 * * * * root $syncfile" >> /etc/crontab # del files older than 3 days echo "#!/bin/sh" > $wipefile echo "find $recfolder -name '*' -mtime +3 -exec rm -f {} \;" >> $wipefile echo "rmdir $recfolder/*" >> $wipefile chmod +x $wipefile # launch once per day at 7 AM echo >> /etc/crontab echo "# Wipe old recordings" >> /etc/crontab echo "0 7 * * * root $wipefile" >> /etc/crontab ==== Стриминг ==== Если не на Youtube, то Just use the full RTMP destination URL as a stream key. https://community.jitsi.org/t/how-do-i-change-youtube-live-stream-to-another-rtmp-server-url/24817/67 https://sourceforge.net/projects/monaserver/ - RTMP-сервер для Windows. Он просто запускается, а потом на него можно натравить VLC, который будет показывать картинку.\\ {{:service:pasted:20220408-115442.png}} ==== Качество видеозахвата и конференции в целом ==== Разрешение видео в конференции: ''nano /etc/jitsi/meet/-config.js''\\ For example: set ''resolution: 1080'' (and uncomment if necessary); uncomment the entire constraints section and set ''ideal: 1080'', ''max: 1080'' https://jitsi-club.gitlab.io/jitsi-self-hosting/en/01-deployment-howto/03-tuning/#recommended_limit_video_resolution Разрешение **захвата/трансляции** можно понизить, например, до 720p. На серверах Jibri: nano /etc/jitsi/jibri/xorg-video-dummy.conf # Section "Screen" Modes "1280x720" #Modes "1920x1080" # В старых версиях - параметр Virtual: #Virtual 1920 1080 Virtual 1280 720 nano /etc/jitsi/jibri/jibri.conf jibri { ffmpeg { resolution = "1280x720" } } systemctl stop jibri-xorg sleep 3 systemctl start jibri https://community.jitsi.org/t/jitsi-not-joined-yet-cannot-read-properties-of-undefined-reading-isjoined/110642/30\\ https://community.jitsi.org/t/jibri-resolution-now-defaults-to-1080p/95478 По конференции в целом - настройки на сервере Jitsi.\\ https://community.jitsi.org/t/video-quality-and-new-install/101297/11\\ https://community.jitsi.org/t/improving-video-quality/92700/13\\ https://community.jitsi.org/t/decreasing-video-resolution-does-not-decrease-kbits-traffic-on-jitsi-server/17263/12\\ https://community.jitsi.org/t/reducing-resource-usage-to-improve-performance-both-client-side-and-server-side/39891\\ ===== Решение проблем ===== ==== После начала записи ffmpeg съедает все ресурсы и вылетает ==== Добавить процессорных ядер на виртуалке.\\ https://github.com/jitsi/jibri/issues/269 ==== Видеофайл не открывается ==== Нужно на сервере Jibri установить java 8, а не 11. sudo apt-get install openjdk-8-jdk openjdk-8-jre sudo update-alternatives --config java # выбрать 8-ю версию https://community.jitsi.org/t/fixed-cannot-open-file-recording/21348/3 ==== Запись или стрим выключаются сами собой через какое-то время ==== Происходит, когда тупо заводят ролик и выключают все камеры и микрофоны. Решение - не делать так, либо переопределить в ''/etc/jitsi/jibri/jibri.conf'' 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, it will consider it empty and stop the recording. default-call-empty-timeout = 30 seconds } } https://community.jitsi.org/t/jibri-recording-empty-conference/84283/5 ==== Ошибка при обновлении сертификата Let's Encrypt ==== nginx: [emerg] "server_names_hash_bucket_size" directive is duplicate in /etc/nginx/sites-enabled/jitsi.domain.ru.conf:1 Cleaning up challenges Attempting to renew cert (jitsi.domain.ru) from /etc/letsencrypt/renewal/jitsi.domain.ru.conf produced an unexpected error: nginx restart failed: . Skipping. All renewal attempts failed. The following certs could not be renewed: /etc/letsencrypt/live/jitsi.domain.ru/fullchain.pem (failure) Решение: # Закомментировать параметр в конфиге сайта sed -i ' s/server_names_hash_bucket_size/# server_names_hash_bucket_size 128;/g ' /etc/nginx/sites-enabled/jitsi.domain.ru.conf # Прописать в общем конфиге nginx sed -i ' s/server_names_hash_bucket_size/server_names_hash_bucket_size 128;/g ' /etc/nginx/nginx.conf # Запустить обновление сертификата certbot-auto renew https://community.jitsi.org/t/lets-encrypt-wont-renew-tls-certificates-with-jitsi-nginx-config/61172 ==== Jitsi не обновляется ==== # apt update && apt upgrade -y && apt autoremove -y Hit:1 http://ru.archive.ubuntu.com/ubuntu focal InRelease Get:2 http://ru.archive.ubuntu.com/ubuntu focal-updates InRelease [114 kB] Get:3 http://ru.archive.ubuntu.com/ubuntu focal-backports InRelease [108 kB] Get:4 http://ru.archive.ubuntu.com/ubuntu focal-security InRelease [114 kB] Get:5 http://packages.prosody.im/debian focal InRelease [7275 B] Get:6 http://packages.prosody.im/debian focal/main amd64 Packages [1830 B] Hit:7 https://download.jitsi.org stable/ InRelease 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' to see them. 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 ... Решение - установить последнюю версию prosody 0.11 ([[https://community.jitsi.org/t/prosody-was-unable-to-find-lua-unbound/113212|0.12 несовместима]] на конец 2022 г): apt install prosody-0.11 Дальше можно обновляться как обычно. Если перед версией 0.11 сначала была по ошибке установлена версия 0.12, то запуск службы будет заблокирован: systemctl start prosody Failed to start prosody.service: Unit prosody.service is masked. # Решение systemctl unmask prosody systemctl start prosody