Jitsi

Jitsi ist eine Sammlung verschiedener Open Source Projekte, welche eine einzigartige Video Konferenz Plattform bildet, die selbst gehostet werden kann. Jbiri ist das Tool zur Aufzeichnung der Meetings.

Self-Hosting:

  • über Pakete für Debian oder Ubuntu

  • via Docker für RHEL und andere

Minimales Server-Sizing:

  • 2 CPU-Cores

  • 2 GB RAM

  • 100 GB Disk

Tipp

Das Ghost-Icon zu einem Teilnehmer zeigt an, dass dieser eine langsame Internet-Verbindung hat.

Installation und Konfiguration

via Docker

Unter RHEL setzt man am besten auf die Docker-Container.

Vorbereitung der Docker Installation mit dem root User und im Home Verzeichnis von root (/root)

Siehe auch: https://jitsi.github.io/handbook/docs/devops-guide/devops-guide-docker

cd /opt/
wget https://github.com/jitsi/docker-jitsi-meet/archive/stable-4857.tar.gz
tar -xzvf stable-4857.tar.gz
rm stable-4857.tar.gz
cd docker-jitsi-meet-stable-4857/
cp env.example .env
./gen-passwords.sh
mkdir -p /etc/jitsi-meet-cfg/{web/letsencrypt,transcripts,prosody/config,prosody/prosody-plugins-custom,jicofo,jvb,jigasi,}

Anschliessend müssen in einer Datei weitere Einstellungen gesetzt werden:

/opt/docker-jitsi-meet-stable-4857/.env
CONFIG=/etc/jitsi-meet-cfg
TZ=Europe/Zurich
PUBLIC_URL=https://meet.example.com

Zusätzlich können optionale Einstellungen wie Authentifizierung gesetzt werden (https://jitsi.github.io/handbook/docs/devops-guide/devops-guide-docker#authentication):

/opt/docker-jitsi-meet-stable-4857/.env
AUTH_TYPE=jwt
ENABLE_AUTH=1
JWT_APP_ID=ID
JWT_APP_SECRET=PASSWORD

Wenn die Konfiguration abgeschlossen ist, können die Container via docker-compose gestartet werden

cd /opt/docker-jitsi-meet-stable-4857/
docker-compose up -d

Damit werden die entsprechenden Images heruntergeladen und die Container erstellt. Ebenso werden entsprechende Konfig-Dateien im Verzeichnis /etc/jitsi-meet-cfg/ angelegt welche angepasst werden können. Wenn man dort Änderungen gemacht hat, muss man die Docker Container natürlich anschliessend neustarten:

cd /opt/docker-jitsi-meet-stable-4857/
docker-compose down --remove-orphans
docker-compose up -d

auf Debian/Ubuntu

Siehe auch

Folgende Ports müssen vonn aussen erreichbar sein:

  • 80/tcp

  • 443/tcp

  • 4443/tcp

  • 3478/udp

  • 5222/tcp

  • 5349/tcp

  • 5347/tcp

  • 10000:20000/udp

System Updates:

apt update
apt upgrade

Hostname und Timezone setzen:

hostnamectl set-hostname meet.example.com
timedatectl set-timezone Europe/Zurich

Since Ubuntu 20.04 TLS Focal Fossa is a fairly new distribution, libssl1.0-dev does not exist in its Debian repository. So we need to install libssl1.0-dev package for 18.04 TLS Bionic Beaver.

Add the following line for global Debian repo:

/etc/apt/sources.list

deb http://security.ubuntu.com/ubuntu bionic-security main
apt update && apt-cache policy libssl1.0-dev
apt-get update
apt-get install gcc -y
apt-get install unzip -y
apt-get install lua5.2 -y
apt-get install liblua5.2 -y
apt-get install luarocks -y
luarocks install basexx
apt-get install libssl1.0-dev -y
luarocks install luacrypto
mkdir src
cd src
luarocks download lua-cjson
luarocks unpack lua-cjson-2.1.0.6-1.src.rock
cd lua-cjson-2.1.0.6-1/lua-cjson
sed -i 's/lua_objlen/lua_rawlen/g' lua_cjson.c
sed -i 's|$(PREFIX)/include|/usr/include/lua5.2|g' Makefile
luarocks make
luarocks install luajwtjitsi
cd
wget https://prosody.im/files/prosody-debian-packages.key -O- | sudo apt-key add -
echo deb http://packages.prosody.im/debian $(lsb_release -sc) main | sudo tee -a /etc/apt/sources.list
apt-get update
apt-get upgrade -y
apt-get install prosody -y
chown root:prosody /etc/prosody/certs/localhost.key
chmod 644 /etc/prosody/certs/localhost.key
shutdown -r now

cp /etc/prosody/certs/localhost.key /etc/ssl
apt-get install -y gnupg2 nginx-full default-jre apt-transport-https
apt-add-repository universe

curl https://download.jitsi.org/jitsi-key.gpg.key | sudo sh -c 'gpg --dearmor > /usr/share/keyrings/jitsi-keyring.gpg'
echo 'deb [signed-by=/usr/share/keyrings/jitsi-keyring.gpg] https://download.jitsi.org stable/' | sudo tee /etc/apt/sources.list.d/jitsi-stable.list > /dev/null

apt-get update
apt-get install jitsi-meet -y
apt-get install jitsi-meet-tokens -y

/etc/prosody/prosody.cfg.lua

Folgende Zeilen nach admins Objekt hinzufügen:

admins = {}

component_ports = { 5347 }
component_interface = "0.0.0.0"

c2s_require_encryption auf false setzen:

c2s_require_encryption=false

Sicherstellen, dass Includes korrekt gesetzt sind:

Include "conf.d/*.cfg.lua"

Issuers und Audiences setzen:

/etc/prosody/conf.d/meet.example.com.cfg.lua
asap_accepted_issuers = { "jitsi", "zellim" }
asap_accepted_audiences = { "jitsi", "zellim" }

oder
/etc/prosody/conf.d/meet.example.com.cfg.lua
asap_accepted_issuers = { "*" }
asap_accepted_audiences = { "*" }

VirtualHost konfigureren:

VirtualHost "meet.example.com"
    authentication = "token";
    app_id = "example_app_id";             -- application identifier
    app_secret = "example_app_secret";     -- application secret known only to your token

Modul mod_presence_identity hinzufügen:

VirtualHost "meet.example.com"
    modules_enabled = { "presence_identity" }

Modul Room Token Vefification aktivieren:

Component "conference.meet.example.com" "muc"
    modules_enabled = { "token_verification" }

/etc/jitsi/jicofo/sip-communicator.properties

org.jitsi.jicofo.auth.URL=XMPP:meet.example.com
org.jitsi.jicofo.auth.DISABLE_AUTOLOGIN=true

org.jitsi.jicofo.BRIDGE_MUC=JvbBrewery@internal.auth.meet2.patientube.com
org.jitsi.jicofo.auth.URL=XMPP:meet2.patientube.com
org.jitsi.jicofo.auth.DISABLE_AUTOLOGIN=true

/etc/jitsi/jicofo/config

JICOFO_HOST=meet.example.com

/etc/jitsi/videobridge/config

# sets the hostname of the XMPP server (default: domain if set, localhost otherwise)
JVB_HOST=meet.example.com

# extra options to pass to the JVB daemon
JVB_OPTS="--apis=rest,xmpp,"

Nach JAVA_SYS_PROPS

AUTHBIND=yes

Host File anpassen /etc/hosts

127.0.0.1 meet.example.com

Konfiguration hinter Reverse Proxy / NAT

Im File folgendes auskommentieren bzw hinzufügen „/etc/jitsi/videobridge/sip-communicator.properties“:

#org.ice4j.ice.harvest.STUN_MAPPING_HARVESTER_ADDRESSES=meet-jit-si-turnrelay.jitsi.net:443
org.ice4j.ice.harvest.NAT_HARVESTER_LOCAL_ADDRESS=10.100.1.41
org.ice4j.ice.harvest.NAT_HARVESTER_PUBLIC_ADDRESS=2.56.40.15

LetsEncrypt-Zertifikat

/usr/share/jitsi-meet/scripts/install-letsencrypt-cert.sh

JWT-Token

Zum Testen am einfachsten mit Hilfe von https://jwt.io/ (JWT_APP_ID ersetzen).

# HEADER
{
  "alg": "HS256",
  "typ": "JWT"
}

# PAYLOAD
{
  "room": "*",
  "aud": "JWT_APP_ID",
  "iss": "JWT_APP_ID",
  "sub": "*",
  "context": {
    "user": {
      "name": "some-username"
    }
  }
}

Bei VERIFY SIGNATURE die JWT_APP_SECRET einfügen, secret base64 encoded deaktivieren.

Mehr Informationen findet man in der Dokumentation.

Jibri

Jibri bietet Dienste für die Aufzeichnung oder das Streaming einer Jitsi Meet-Konferenz. Dazu wird eine Chrome-Instanz gestartet, die in einem virtuellen Framebuffer gerendert wird, und die Ausgabe wird mit ffmpeg aufgezeichnet und codiert.

Siehe auch: https://jitsi.github.io/handbook/docs/devops-guide/devops-guide-docker#jitsi-broadcasting-infrastructure–configuration

Um Jibri via Docker zu aktivieren, müssen zunächst Vorbereitungen am Host getroffen werden:

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-load.d/snd_aloop.conf
modprobe snd-aloop
lsmod | grep snd_aloop

Das Recording aktivieren:

/opt/docker-jitsi-meet-stable-4857/.env
ENABLE_RECORDING=1

Wenn custom DEFAULT_LOGO_URL und JITSI_WATERMARK_LINK verwendet werden sollen, werden zusätzlich /etc/hosts-Einträge im Container benötigt. Dazu die docker-compose Datei anpassen und die Container neustarten.

/opt/docker-jitsi-meet-stable-4857/jibri.yml
...
networks:
    meet.jitsi:
extra_hosts:
  - "example.com:10.100.1.36"
  - "www.example.com:10.100.1.36"

Zum Schluss muss Jitsi zusätzlich mit Jibri gestartet werden:

docker-compose down --remove-orphans
docker-compose -f docker-compose.yml -f jibri.yml up -d

Die Recordings finden sich im Verzeichnis /etc/jitsi-meet-cfg/jibri/recordings/.

Customizations

Look and Feel

/usr/share/jitsi-meet/interface_config.js

DEFAULT_LOGO_URL: 'https://example.com/forum/assets/site-logo.svg'
JITSI_WATERMARK_LINK: 'https://example.com'
DEFAULT_WELCOME_PAGE_LOGO_URL: 'https://example.com/assets/site-logo.svg',

/etc/jitsi/meet/meet.example.com-config.js

disableInviteFunctions: true,
doNotStoreRoom: true,
enableClosePage: true,

invite aus toolbarButtons entfernen.

/usr/share/jitsi-meet/static/close2.html ersetzen.

Customized HTML-Dateien

Um customized HTML-Dateien zu verwenden, den Volume-Block des docker-compose Files wie folgt anpassen:

volumes:
- ${CONFIG}/web:/config:Z
- ${CONFIG}/web/letsencrypt:/etc/letsencrypt:Z
- ${CONFIG}/transcripts:/usr/share/jitsi-meet/transcripts:Z
- /etc/jitsi-meet-cfg/web/static/close2.html:/usr/share/jitsi-meet/static/close2.html
- /etc/jitsi-meet-cfg/web/static/logo-white.svg:/usr/share/jitsi-meet/static/logo-white.svg

Über die beiden letzten Zeilen, lassen sich neue Dateien hinzufügen, oder vorhandene Dateien überschreiben.

Monitoring

apt install python3-psutil

https://github.com/nbuchwitz/check_jitsi#activate-private-rest-api-on-jitsi-videobridge

Activate private rest API on jitsi videobridge

/etc/jitsi/videobridge/config

JVB_OPTS="--apis=rest,xmpp"

/etc/jitsi/videobridge/sip-communicator.properties

org.jitsi.videobridge.ENABLE_STATISTICS=true

Built on 2022-06-03