adminForge

free | no tracking | no logging | no advertising

Das ist unser Motto. Mit adminForge bieten wir kostenlose Dienste an. Unser Ziel ist es, eine freie und datensparsame Alternative zu bekannten Diensten bereitzustellen. Seit 2014 betreiben wir adminForge gemeinsam mit Spaß an der Technik und an Open-Source.

Eine zweite JVB zu Jitsi Meet hinzufügen (Docker)

In der vorherhigen Anleitung habe ich gezeigt wie teamjoin.de angepasst wurde.

Tutorial: Jitsi Meet Docker Instanz anpassen
Tutorial: Eigene Jitsi Meet Instanz installieren (Docker / Ubuntu / Nginx)
Was ist Jitsi Meet?: Videokonferenzen mit Jitsi Meet
Meeting starten: https://teamjoin.de

Nun möchte ich euch zeigen wie eine zweite Jitsi-Videobridge (JVB) eurer bestehenden Jitsi Meet Instanz hinzugefügt werden kann. Dies ermöglicht euch mehr gleichzeitige Teilnehmer auf eurer Jitsi Meet Instanz zu haben.

Vorteile:

  • automatische Lastverteilung der Videostreams auf die einzelnen Videobridges (Round Robin)
  • in die Breite skalierbare Jitsi Meet Instanz
  • ein Zutrittspunkt für die Teilnehmer wie bsp. teamjoin.de
  • Erweiterung durch weitere JVB’s möglich

Was wird benötigt?

  • Eine laufenden Docker Jitsi Meet Instanz (siehe Anleitung)
  • 2 Server mit gleicher Ausstattung an CPU Kernen und Bandbreite
  • Optional: Die beiden Server sind über ein internes Netzwerk verbunden

Offene Ports in der Firewall (extern):

  • 4443/tcp
  • 10000/udp

Offene Ports in der Firewall (host zu host):

  • 2377/tcp
  • 7946/tcp+udp
  • 4789/udp

Punkt 1: Docker Swarm einrichten

Docker liefert ein Orchestrierungswerkzeug namens Swarm mit. Wir benutzen Swarm nur um ein Overlay Netzwerk zwischen Server A und B herzustellen. Die Docker Container starten wir weiterhin über docker-compose. Das hält uns weiterhin nahe am originalen Jitsi Meet Docker.

Im Testsetup habe ich 2 Debian Linux Server mit einem internen Netzwerk 10.10.0.0/16. Es funktioniert aber auch über das öffentliche Internet.

Unseren Server A richten wir als Swarm Manager ein.

test:/opt/docker/jitsi-meet# docker swarm init
Swarm initialized: current node (zfmm8ze98lgdlc5qgo9jojqfn) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-5ixzd9lfw7o9f0xp4gx27yuxggb9anse6savqs7cous55oqpdd-ce4yj3e5zybrwhl6o60am9a3s 10.10.60.20:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

Auf unserem zweiten Server (Server B) installieren wir docker und docker-compose nach Anleitung: Eigene Jitsi Meet Instanz installieren (Docker / Ubuntu / Nginx)
Es reicht der Anleitung bis Punkt 2 zu folgen.

Server B wird dann als Worker Node hinzugefügt.

test2:/opt/docker/jitsi-meet# docker swarm join --token SWMTKN-1-5ixzd9lfw7o9f0xp4gx27yuxggb9anse6savqs7cous55oqpdd-ce4yj3e5zybrwhl6o60am9a3s 10.10.60.20:2377
This node joined a swarm as a worker.

Nun überprüfen wir ob Server A beide Nodes korrekt sieht.

test:/opt/docker/jitsi-meet# docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
o2xn4ksllc5o3b1zii0lemylh     test2               Ready               Active                                  19.03.8
zfmm8ze98lgdlc5qgo9jojqfn *   test                Ready               Active              Leader              19.03.8

Punkt 2: Overlay Netzwerk anlegen

Auf der Manager Node (Server A) erstellen wir unser Jitsi Meet Overlay Netzwerk.

test:/opt/docker/jitsi-meet# docker network create --driver=overlay --attachable jitsi-meet
prjmyedevt8yumtfwyepza9te

Punkt 3: restart.sh auf Server A anpassen

Wir fügen die markierten Zeilen unserem restart.sh Script hinzu.

  1. Es wird geprüft ob das Overlay Netzwerk existiert, falls nein wird es erstellt
  2. Es wird der Netzwerkname ausgetauscht. Docker Swarm erlaubt keine Punkte („.“) im Overlay Netzwerknamen
  3. Das Netzwerk muss auf „external“ gestellt werden, ansonsten kann docker-compose nicht das Overlay Netzwerk von Swarm nutzen

#!/bin/bash

DOCKERPATH=/opt/docker

# Create overlay network if not exist
if [ $(docker network ls | grep jitsi-meet | wc -l) = 0 ]; then
        docker network create --driver=overlay --attachable jitsi-meet
fi

# Configure overlay network in docker-compose.yml
cd $DOCKERPATH/jitsi-meet
sed -i 's/meet.jitsi/jitsi-meet/g' docker-compose.yml
if [ $(grep "hostname: jvb" docker-compose.yml | wc -l) = 0 ]; then
sed -i '/image: jitsi\/jvb:latest/a \ hostname: jvb' docker-compose.yml
fi
grep -qxF '      external: true' docker-compose.yml || echo '      external: true' >> docker-compose.yml

# Shutdown jitsi meet containers and remove images
cd $DOCKERPATH/jitsi-meet
docker-compose down --rmi all

# Delete configs and recreate folders
rm -rf .jitsi-meet-cfg/
mkdir -p .jitsi-meet-cfg/{web/letsencrypt,transcripts,prosody,jicofo,jvb}

# Start Jitsi Meet
docker-compose up -d
sleep 10

# Customize
./customize.sh

# Set JVB Logging from INFO to WARNING
sed -i 's/.level=.*/.level=WARNING/' .jitsi-meet-cfg/jvb/logging.properties
docker restart jitsi-meet-jvb-1

Wir starten Jitsi Meet auf Server A mit dem angepassten Script neu.

./restart.sh

Punkt 4: Zweite JVB auf Server B einrichten

Wichtig ist ein identisches JVB_AUTH_PASSWORD auf allen JVB Instanzen zu verwenden. Wir nutzen das Passwort von Server A und spielen es auf Server B ein.

Server A:

test:/opt/docker/jitsi-meet# grep JVB_AUTH_PASSWORD .env
JVB_AUTH_PASSWORD=8d3a55aab4fced07e5304f624d86b1ce

Server B:

test2:/opt/docker/jitsi-meet# sed -i 's/JVB_AUTH_PASSWORD=.*/JVB_AUTH_PASSWORD=8d3a55aab4fced07e5304f624d86b1ce/' .env

Websockets: Damit die Websockets korrekt funktionieren, muss in die .env noch JVB_WS_SERVER_ID=jvb2 eingefügt werden. Als ID muss die Service-Bezeichnung aus der docker-compose.yml Datei genutzt werden (jvb2).

Wir erstellen docker-compose-jvb2.yml um nur die Jitsi Videobridge (JVB) auf Server B zu starten.

version: '3'

services:
    # Video bridge
    jvb2:
        hostname: jvb2
        image: jitsi/jvb:${JITSI_IMAGE_VERSION:-stable}
        restart: ${RESTART_POLICY:-unless-stopped}
        ports:
            - '${JVB_PORT:-10000}:${JVB_PORT:-10000}/udp'
        volumes:
            - ${CONFIG}/jvb:/config:Z
        environment:
            - AUTH_TYPE
            - DISABLE_POLLS
            - ENABLE_AUTH
            - ENABLE_AV_MODERATION
            - ENABLE_BREAKOUT_ROOMS
            - ENABLE_END_CONFERENCE
            - ENABLE_GUESTS
            - ENABLE_IPV6
            - ENABLE_LOBBY
            - ENABLE_RECORDING
            - ENABLE_XMPP_WEBSOCKET
            - ENABLE_JAAS_COMPONENTS
            - GC_TYPE
            - GC_INC_TH
            - GC_INC_SPEED
            - GC_INC_STEP_SIZE
            - GC_GEN_MIN_TH
            - GC_GEN_MAX_TH
            - GLOBAL_CONFIG
            - GLOBAL_MODULES
            - JIBRI_RECORDER_USER
            - JIBRI_RECORDER_PASSWORD
            - JIBRI_XMPP_USER
            - JIBRI_XMPP_PASSWORD
            - JICOFO_AUTH_PASSWORD
            - JICOFO_COMPONENT_SECRET
            - JIGASI_XMPP_USER
            - JIGASI_XMPP_PASSWORD
            - JVB_AUTH_USER
            - JVB_AUTH_PASSWORD
            - JWT_APP_ID
            - JWT_APP_SECRET
            - JWT_ACCEPTED_ISSUERS
            - JWT_ACCEPTED_AUDIENCES
            - JWT_ASAP_KEYSERVER
            - JWT_ALLOW_EMPTY
            - JWT_AUTH_TYPE
            - JWT_ENABLE_DOMAIN_VERIFICATION
            - JWT_TOKEN_AUTH_MODULE
            - MATRIX_UVS_URL
            - MATRIX_UVS_ISSUER
            - MATRIX_UVS_AUTH_TOKEN
            - MATRIX_UVS_SYNC_POWER_LEVELS
            - LOG_LEVEL
            - LDAP_AUTH_METHOD
            - LDAP_BASE
            - LDAP_BINDDN
            - LDAP_BINDPW
            - LDAP_FILTER
            - LDAP_VERSION
            - LDAP_TLS_CIPHERS
            - LDAP_TLS_CHECK_PEER
            - LDAP_TLS_CACERT_FILE
            - LDAP_TLS_CACERT_DIR
            - LDAP_START_TLS
            - LDAP_URL
            - LDAP_USE_TLS
            - MAX_PARTICIPANTS
            - PROSODY_RESERVATION_ENABLED
            - PROSODY_RESERVATION_REST_BASE_URL
            - PUBLIC_URL
            - TURN_CREDENTIALS
            - TURN_HOST
            - TURNS_HOST
            - TURN_PORT
            - TURNS_PORT
            - TURN_TRANSPORT
            - TZ
            - XMPP_DOMAIN
            - XMPP_AUTH_DOMAIN
            - XMPP_GUEST_DOMAIN
            - XMPP_MUC_DOMAIN
            - XMPP_INTERNAL_MUC_DOMAIN
            - XMPP_MODULES
            - XMPP_MUC_MODULES
            - XMPP_MUC_CONFIGURATION
            - XMPP_INTERNAL_MUC_MODULES
            - XMPP_RECORDER_DOMAIN
            - XMPP_PORT
        networks:
            jitsi-meet:
                aliases:
                    - ${XMPP_SERVER:-xmpp.meet.jitsi}

# Custom network so all services can communicate using a FQDN
networks:
    jitsi-meet:
      external: true

Dazu legen wir ein passendes restart.sh Script an.

  1. Als erstes wird ein Dummy Container gestartet, da docker-compose aktuell kein Overlay Netzwerk auf den Worker Nodes anlegen kann
  2. Danach wird der JVB Container gestartet

#!/bin/bash

DOCKERPATH=/opt/docker

# Start dummy container (for overlay network)
if [ $(docker network ls | grep jitsi-meet | wc -l) = 0 ]; then
        docker rm dummy
        docker run -itd --name dummy --net jitsi-meet alpine
        sleep 5
fi

# Shutdown jitsi meet containers and remove images
cd $DOCKERPATH/jitsi-meet
docker-compose -f docker-compose-jvb2.yml down --rmi all

# Delete Configs and recreate folders
rm -rf .jitsi-meet-cfg/
mkdir -p .jitsi-meet-cfg/jvb

# Start Stack
docker-compose -f docker-compose-jvb2.yml up -d
sleep 10

# JVB Logging from INFO to WARNING
sed -i 's/.level=.*/.level=WARNING/' .jitsi-meet-cfg/jvb/logging.properties
docker restart jitsi-meet-jvb2-1

Punkt 5: Zweite JVB starten

Zuerst überwachen wir das Logfile auf Server A.

docker logs -f jitsi-meet-jicofo-1

Dann starten wir auf Server B den JVB Container.
WICHTIG: Es muss immer zuerst die Jitsi Meet Master Instanz (auf Server A) gestartet werden bevor eine JVB Instanz joinen kann!

./restart.sh

Im Log sollte nun diese Zeile zu sehen sein.

...
Jicofo 2020-04-29 13:44:34.207 INFO: [38] org.jitsi.jicofo.bridge.BridgeSelector.log() Added new videobridge: Bridge[jid=jvbbrewery@internal-muc.meet.jitsi/1a542adbca3a, relayId=null, region=null, stress=0.00]
...

Fertig! Eine zweite JVB steht eurer Jitsi Meet Instanz nun zur Verfügung.

Als nächstes: Jitsi Meet Grafana Statistiken (Docker)
oder: Jitsi Meet Docker: WelcomePage anpassen

Euer adminForge Team

UnterstützenDas Betreiben der Dienste, Webseite und Server machen wir gerne, kostet aber leider auch Geld.
Unterstütze unsere Arbeit mit einer Spende.