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.
- Es wird geprüft ob das Overlay Netzwerk existiert, falls nein wird es erstellt
- Es wird der Netzwerkname ausgetauscht. Docker Swarm erlaubt keine Punkte („.“) im Overlay Netzwerknamen
- Das Netzwerk muss auf „external“ gestellt werden, ansonsten kann
docker-composenicht 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.
- Als erstes wird ein Dummy Container gestartet, da
docker-composeaktuell kein Overlay Netzwerk auf den Worker Nodes anlegen kann - 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
Das Betreiben der Dienste, Webseite und Server machen wir gerne, kostet aber leider auch Geld.Unterstütze unsere Arbeit mit einer Spende. |
