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.
1 2 3 4 5 6 7 8 |
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.
1 2 |
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.
1 2 3 4 |
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.
1 2 |
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-compose
nicht das Overlay Netzwerk von Swarm nutzen
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
#!/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.
1 |
./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:
1 2 |
test:/opt/docker/jitsi-meet# grep JVB_AUTH_PASSWORD .env JVB_AUTH_PASSWORD=8d3a55aab4fced07e5304f624d86b1ce |
Server B:
1 |
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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 |
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-compose
aktuell kein Overlay Netzwerk auf den Worker Nodes anlegen kann - Danach wird der JVB Container gestartet
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
#!/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.
1 |
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!
1 |
./restart.sh |
Im Log sollte nun diese Zeile zu sehen sein.
1 2 3 |
... 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ütze unsere Arbeit mit einer Spende. |