Seite wählen

Jitsi Best Practice und Skalierung

von | Mrz 27, 2020 | Apps, Jitsi, Security, Linux, Technology, Betriebssysteme, Network

Seit nun mehr als zwei Wochen wird dort wo es möglich ist von Zu Hause aus gearbeitet. Home-Office für ALLE! Naja mindest für die die es können.

Damit ist auch von einem Tag auf den anderen der Bedarf an Kommunikations-Werkzeugen vor allem für Video-Konferenzen gestiegen.
Hierfür gibt es einige Plattformen welche mittels Jitsi Video- und Audiokommunikation als Service anbieten. Darunter auch NETWAYS Web Services
Jitsi ist eine Freie Software welche auch selbst betrieben werden kann.
Beim Betrieb von Jitsi jedoch zeigt sich das Jitsi sehr schwierig in der Skalierung ist. Es benötigt die richtigen Ressourcen und die richtigen Clients für die Nutzung, um nicht ab einer zweistelligen Zahl von Nutzern in einen reinen Ton- und Bildsalat zu enden. Die technischen Dokumentationen jedoch sind nicht sehr ausgeprägt und durch ihre Zerstreuung sehr schwer zu einem ganzen zusammen zu fügen.

Daher werden wir uns folgend mit den Punkten Anforderungen, Skalierung und Nutzung auseinander setzen.

Empfehlung für einen eigenen Jitsi Server/Videobridge

Nach meinen Tests und der Güte an vorhandenen Quellen zur Hilfe und Dokumentation komme ich zu folgendem Ergebnis:

    • Betriebssystem: Debian 10 oder Ubuntu 18.04.4 LTS
    • Soviel CPU wie geht
      (klingt komisch ist aber so)
      CPU: bei durchschnittlich 10 Teilnehmer pro Konferenz kommen ich mit 2vCPU für die Videobridge ganz gut klar. Mehr zur Skalierung der CPU findet ihr hier:

jitsi-videobridge-performance-evaluation

  • CPU Jitis/Jifico/Prosody: Hier würde auch eine (v)CPU ausreichen, hängt jedoch auch wieder von der Frequentierung ab.
  • RAM: 4-8 GB für beide Server-Varianten
  • Speicherplatz: max. 50 GB SSD für beide Server-Varianten
  • Eine hohe Bandbreite
  • Die Unstable Version von Jitsi:

[code lang=“plain“]
# install the key
wget -qO – https://download.jitsi.org/jitsi-key.gpg.key | apt-key add –
# add the unstable repo
sh -c "echo ‚deb https://download.jitsi.org unstable/‘ > /etc/apt/sources.list.d/jitsi-unstable.list"
apt update
[/code]

Eine gute Installations-Anleitung dazu gibt es zum einen von Jan Doberstein auf seinem Blog jalogisch.de
oder auch sehr hilfreich und weiterführend auf der Seite lw1.at guides

Skalierung einer Jitsi Infrastruktur

Ausgangslage

Wir haben einen vollständig installierten Jitsi Server Namens jitsi.example.com auf Basis von Debian. Jetzt wollen wir mehr mehr Ressourcen bereit stellen, so müssen wir weitere jitsi-videobridge Instanzen aufsetzen.
In der vollständigen Installation eines Jitsi-Servers auf Basis von Debian 10 sind folgende Pakete installiert:

[code lang=“plain“]
ii jitsi-meet 1.0.4314-1 all WebRTC JavaScript video conferences
ii jitsi-meet-prosody 1.0.3914-1 all Prosody configuration for Jitsi Meet
ii jitsi-meet-web 1.0.3914-1 all WebRTC JavaScript video conferences
ii jitsi-meet-web-config 1.0.3914-1 all Configuration for web serving of Jitsi Meet
ii jitsi-videobridge2 1132-1 amd64 WebRTC compatible Selective Forwarding Unit (SFU)
[/code]

Der Part jitsi-videobridge ist der Teil der den jtisi-meet mit der Video und Audio Übertragung versorgt. Er schließt sich an jitsi-meet und dem verwendeten prosody (XMPP-Server) an.

Anbindung einer Videobridge

Dazu binden wir die die Paketquellen auf dem zweiten Server vb1.example.com ein und installieren die Videobridge:

[code lang=“plain“]
# install the key
wget -qO – https://download.jitsi.org/jitsi-key.gpg.key | apt-key add –
# add the unstable repo
sh -c "echo ‚deb https://download.jitsi.org unstable/‘ > /etc/apt/sources.list.d/jitsi-unstable.list"
apt update
apt install jitsi-videobridge2
[/code]

Sollte eine Firewall auf dem Server jitsi.example.com aktiviert sein so müssen wir den Port 5222 für eingehende Kommunikation öffnen.

Auf dem zweiten Server vb1.example.com passen wir jetzt die Datei „/etc/jitsi/videobridge/config“ an:

[code lang=“plain“]
# Jitsi Videobridge settings

# sets the XMPP domain (default: none)
JVB_HOSTNAME=jitsi.example.com

# sets the hostname of the XMPP server (default: domain if set, localhost otherwise)
JVB_HOST=jitsi.example.com
….
[/code]

Dann kommen wir zu Datei für die SIP-Kommunikation. Diese sollte vom Hauptserver jitsi.example.com übernommen werden und die UUID sollte hierbei auf jedem Server unterschiedlich gesetzt sein.
Die Datei „/etc/jitsi/videobridge/sip-communicator.properties“ wird wie folgt eingestellt:

[code lang=“plain“]
org.jitsi.videobridge.DISABLE_TCP_HARVESTER=true
org.jitsi.videobridge.ENABLE_STATISTICS=true
# Notwendig falls der Server hinter einem NAT steht.
org.ice4j.ice.harvest.NAT_HARVESTER_LOCAL_ADDRESS=local-ip
org.ice4j.ice.harvest.NAT_HARVESTER_PUBLIC_ADDRESS=public-ip
org.jitsi.videobridge.STATISTICS_TRANSPORT=muc
org.jitsi.videobridge.xmpp.user.shard.HOSTNAME=jitsi.example.com
org.jitsi.videobridge.xmpp.user.shard.DOMAIN=auth.jitsi.example.com
org.jitsi.videobridge.xmpp.user.shard.USERNAME=jvb
org.jitsi.videobridge.xmpp.user.shard.PASSWORD=
org.jitsi.videobridge.xmpp.user.shard.MUC_JIDS=JvbBrewery@internal.auth.jitsi.example.com
#UUID am besten mit "uuidgen" neu gernieren muss auf beiden Servern Einzigartig sein.
org.jitsi.videobridge.xmpp.user.shard.MUC_NICKNAME=9a6187f0-6d3f-46df-b1ff-ce7d2d69513a
org.jitsi.videobridge.xmpp.user.shard.DISABLE_CERTIFICATE_VERIFICATION=true
[/code]

Auf Debian 10 tritt mit Java 11 folgender Fehler auf:

[code lang=“plain“]
VB 2020-03-21 19:29:23.687 SEVERE: [16] org.jitsi.utils.concurrent.RecurringRunnableExecutor.log() The invocation of the method org.jitsi.videobridge.stats.StatsManager$StatisticsPeriodicRunnable.run() threw an exception.
java.lang.reflect.InaccessibleObjectException: Unable to make public long com.sun.management.internal.OperatingSystemImpl.getTotalPhysicalMemorySize() accessible: module jdk.management does not "opens com.sun.management.internal" to unnamed module @54ca3634
at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:340)
at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:280)
at java.base/java.lang.reflect.Method.checkCanSetAccessible(Method.java:198)
at java.base/java.lang.reflect.Method.setAccessible(Method.java:192)
at org.jitsi.videobridge.stats.OsStatistics.getTotalMemory(OsStatistics.java:138)
at org.jitsi.videobridge.stats.VideobridgeStatistics.generate0(VideobridgeStatistics.java:703)
at org.jitsi.videobridge.stats.VideobridgeStatistics.generate(VideobridgeStatistics.java:450)
at org.jitsi.videobridge.stats.StatsManager$StatisticsPeriodicRunnable.doRun(StatsManager.java:321)
at org.jitsi.utils.concurrent.PeriodicRunnableWithObject.run(PeriodicRunnableWithObject.java:87)
at org.jitsi.utils.concurrent.RecurringRunnableExecutor.run(RecurringRunnableExecutor.java:216)
at org.jitsi.utils.concurrent.RecurringRunnableExecutor.runInThread(RecurringRunnableExecutor.java:292)
at org.jitsi.utils.concurrent.RecurringRunnableExecutor.access$000(RecurringRunnableExecutor.java:36)
at org.jitsi.utils.concurrent.RecurringRunnableExecutor$1.run(RecurringRunnableExecutor.java:328)
[/code]

Dieser kann beseitigt werden mittels folgender Ergänzung am Ende der Java System Properties in der Datei „/etc/jitsi/videobridge/config“:

[code lang=“plain“]
JAVA_SYS_PROPS="-Dnet.java.sip.communicator.SC_HOME_DIR_LOCATION=/etc/jitsi -Dnet.java.sip.communicator.SC_HOME_DIR_NAME=videobridge -Dnet.java.sip.communicator.SC_LOG_DIR_LOCATION=/var/log/jitsi -Djava.util.logging.config.file=/etc/jitsi/videobridge/logging.properties –add-opens jdk.management/com.sun.management.internal=ALL-UNNAMED"
[/code]

Nun können wir die Videobridge starten:

[code lang=“plain“]
systemctl enable jitsi-videobridge && systemctl start jitsi-videobridge
[/code]

An der Stelle geht auch ein Dank an Jan Doberstein der mich auf diese Spur gebracht hat und in seinem Blog-Folge Artikel zu Scaling Jitsi

Nutzung

Das Protkoll WebRTC, welches Jitsi nutzt, wird zur Zeit nur sauber von Google Chrome unterstützt. Somit sollte allen Nutzern dieser Browser, für die Anwendung am Notebook empfohlen werden. Für Androide und iOS Geräte gibt es Applikationen den jeweiligen App-Stores. Sehr schöne Zusammenfassung und eine ausführliche Benutzer-Anleitung hierzu gibt es auch auf der Seite des Freifunk München.

Sicherheit

Zum Thema Sicherheit empfiehlt es sich am Besten zuerst die Stunning-Server von Google in der Datei „/etc/jitsi/meet/jitsi.example.com-config.js zu ersetzen. Eine geeignete Stunning-Server Konfiguration kann wie folgt lauten:

[code lang=“plain“]
stunServers: [
{ urls: ’stun:stun.schlund.de:3478′ },
{ urls: ’stun:stun.t-online.de:3478′ },
{ urls: ’stun:stun.1und1.de:3478′ },
{ urls: ’stun:stun.hosteurope.de:3478′ },
{ urls: ’stun:stun.gmx.de:3478′ },
],
[/code]

Zustätzlich wenn Ihr nicht eine gänzlich freie Plattform, sondern eine mit Moderaten oder sogennante Host per Raum gestützte Instanz betreiben wollt, empfiehlt es sich in prosody und jitsi-meet die Benutzerauthentifzierung für das erstellen von Räumen zu aktivieren.
In der Datei für die prosody-Konfiguration „/etc/prosody/conf.avail/jitsi.example.com.cfg.lua“, setzen wir den Wert für „authentication“ auf „internal_plain“ und fügen einen neuen VirtualHost darunter ein ein:

[code lang=“plain“]
VirtualHost "jitsi.yourdomain.example"
— enabled = false — Remove this line to enable this host
authentication = "internal_plain"
— Properties below are modified by jitsi-meet-tokens package config
— and authentication above is switched to "token"
–app_id="example_app_id"
–app_secret="example_app_secret"
— Assign this host a certificate for TLS, otherwise it would use the one
— set in the global section (if any).
— Note that old-style SSL on port 5223 only supports one certificate, and will always
— use the global one.
ssl = {
key = "/etc/prosody/certs/jitsi.yourdomain.example.key";
certificate = "/etc/prosody/certs/jitsi.yourdomain.example.crt";
}
— we need bosh
modules_enabled = {
"bosh";
"pubsub";
"ping"; — Enable mod_ping
}
c2s_require_encryption = false

VirtualHost "guest.jitsi.example.com"
authentication = "anonymous"
c2s_require_encryption = false
[/code]

In der Datei „/etc/jitsi/meet/jitsi.example.com-config.js“ geben wir nun den neuen VirtualHost an:

[code lang=“plain“]
var config = {
hosts: {
// XMPP domain.
domain: ‚jitsi.yourdomain.example‘,

// When using authentication, domain for guest users.
anonymousdomain: ‚guest.jitsi.yourdomain.example‘,
}
}
[/code]

Nun müssen wir noch jifico dazu veranlassen auch eine Authentifizierung durchzuführen und die Klasse in der „/etc/jitsi/jicofo/sip-communicator.properties“ laden:

[code lang=“plain“]
org.jitsi.jicofo.auth.URL=XMPP:jitsi.example.com
[/code]

Danach müssen die Dienste neu gestartet werden:

[code lang=“plain“]
sudo systemctl restart prosody.service
sudo systemctl restart jicofo.service
[/code]

Für die Anbindung einer Authentifizierung in Prosody gibt es auch Enterprise fähige Funktionen für LDAP und Co. Die obige Lösung beschreibt es für ein überschaubares Setup, denn die Benutzer hier müssen dann im Anschluss mit der prosodctl generiert werden:

[code lang=“plain“]
prosodyctl register jitsi-meet.example.com
[/code]

Abschließend bleibt zusagen…

Es ist nicht leicht gute Dokumentationen zu Jitsi und dessen Betrieb zu finden, eben so wie für das Scalling. Eine einheitliche Dokumentation gibt es nicht und somit macht es einen Gesamtüberblick nicht sehr leicht.
Neben der Jitis-Community und der Docs auf GitHub gibt es eine paar bereits schon erwähnte Artikel aber auch die sind rah. Daher die Bitte wenn jemand verbesserungen hat, meldet euch gerne!

Wenn Ihr eine Instanz dringend benötigt und euch nicht mit dem Betrieb ausseinandersetzen könnt oder naja vielleicht nicht wollt, dann schaut doch einfach bei unseren Kollengen von NWS vorbei. Dort bekommt Ihr aktuell mit dem Code #StayAtHome eine kostenlose Jitsi-Instanz für drei Monate und das ganz ohne Abo-Falle!

Also bleibt Zuhause und fragt euch gerade in diesen Tagen doch mindestens einmal am Tag:

1. Ist es wahr?
2. Ist es fair für alle Beteiligten?
3. Wird es Freundschaft und guten Willen fördern?
4. Wird es dem Wohl aller Beteiligten dienen?“

(Das sollten wir uns bei allem Fragen, was wir denken, sagen oder tun IMHO!)

Daniel Neuberger
Daniel Neuberger
Senior Consultant

Nach seiner Ausbildung zum Fachinformatiker für Systemintegration und Tätigkeit als Systemadministrator kam er 2012 zum Consulting. Nach nun mehr als 4 Jahren Linux und Open Source Backup Consulting zieht es ihn in die Welt des Monitorings und System Management. Seit April 2017 verstärkt er das NETWAYS Professional Services Team im Consulting rund um die Themen Elastic, Icinga und Bareos. Wenn er gerade mal nicht um anderen zu Helfen durch die Welt tingelt geht er seiner Leidenschaft für die Natur beim Biken und der Imkerei nach und kassiert dabei schon mal einen Stich.

14 Kommentare

  1. joschi

    Ich wiederhole mich mal von https://mastodon.social/@joschi/103857445690842807 und https://mastodon.social/@joschi/103861781513490222:

    Die von dir aufgelisteten STUN-Server der United Internet AG sind (nicht überraschend) die gleichen Maschinen.

    stun.schlund.de, stun.1und1.de und stun.gmx.de sind identisch, stun.einsundeins.de gibt es nicht. ?

    # host stun.gmx.de
    stun.gmx.de is an alias for stun.1und1.de.
    stun.1und1.de has address 212.227.67.33
    stun.1und1.de has address 212.227.67.34

    # host stun.gmx.net
    stun.gmx.net is an alias for stun.1und1.de.
    stun.1und1.de has address 212.227.67.34
    stun.1und1.de has address 212.227.67.33

    Antworten
  2. Jan

    In Zeiten wo jede Videokonferenz überlastet ist oder aus Datenschutzgründen nicht verwendet werden kann, hilft ein eigener Server enorm. Wer möchte kann meinen Jitsi Server gern mit verwenden.

    (Serverstandort: Nürnberg/Deutschland)

    Antworten
    • TGM

      Jitsi ist schon ziemlich geiles Zeugs. Leider nicht immer soooo geil dokumentiert. Alleine die Einwahl per Telefon hat mich Tage gedauert. Aber läuft. Endlich! 🙂

      Antworten
  3. Thomas F.

    Ich bin schon etwas erschrocken über die Dokumentation für Jitsi. Da scheint wieder einmal etwas zusammengebastelt worden zu sein.
    Seit Stunden drehe ich mich auf diversen englischen und deutschen Seiten im Kreis. Ich habe keine Installations-Doku gefunden, der man Schritt für Schritt folgen kann und die nur das Nötige enthält – allenfalls mit kurzen Kommentaren, wo nötig.
    Ich habe die Infos auf dieser Seite auf ~30 Zeilen zusammengedampft und alles befolgt, aber erhalte nach Einrichtung eines Raums und Login die lapidare Meldung: „Something went wrong and we cannot connect to the conference: connection.otherError“. Solange ich die Änderungen nicht vorgenommen hatte, konnte sich Jeder anonym einloggen, das klappte also.

    Ich habe schon hunderte Seiten an Wiki-Dokumenten erstellt, so schwierig ist das also nicht, wenn man sich mit dem Thema auskennt. Leider interessiert das die meisten Entwickler nicht, ich kenne das aus eigener Erfahrung.

    Antworten
    • Thomas F.

      Ich habe das Problem gefunden und gelöst. Ich werde mal eine Minimal-Anleitung schreiben und auf mein Problem besonders aufmerksam machen, da es sicher auch manch anderen betreffen wird.

      Antworten
  4. Daniel Neuberger

    Hallo Thomas F,

    es wäre sehr freundlich von dir wenn du mich an den wissen teilhaben lassen könntest so das ich es im Artikel als Update unterbringen kann.
    Danke.

    Antworten
  5. christian campo

    Mich würde das Thema Skalierung extrem interessieren. Ich hab den Server gerade in Azure aufgesetzt und fahr ihn immer nur dann hoch, wenn wir den brauchen. (etwas spezieller Usecase egal)

    Aber wenn ich jetzt sagen wir mal 30 oder 40 Leute drauf lassen will (mit Video), wieviel CPU (vCPU) brauch ich und wieviel Memory. So der grobe Tip soviel wie geht, fand ich jetzt nicht so doll hilfreich…..

    Gehts nicht etwas genauer…. ? Bandbreite ist bei Azure kein Problem und Disk ist SSD.

    Antworten
  6. fred

    Danke für die Anleitung, das funktioniert 1a.

    Evtl. könnte man noch überlegen, das Octo-Protokoll zu verwenden, dann kann eine Konferenz mehrere Brücken gleichzeitig benutzen und die Last wird besser auf die Server verteilt. (Außerdem kann man auf dem jitsi-meet Host-Server auch noch eine Brücke installieren, da der sonst evtl. gar nicht ausgelastet wird. Ich teste das gerade auf meinem mini System für Familie und Freunde: 1. Host mit 1CPU (Jitsi-Meet Host + Bridge), 2. Host mit 2CPU (nur JVB).

    Hier die Konfiguration:
    https://community.jitsi.org/t/working-multi-jitsi-meet-multi-videobridge-setup/24704/27

    „That is possible, You will need to enable octo on your bridges.

    in the jicofo/sip-communicator.properties add

    org.jitsi.jicofo.BridgeSelector.BRIDGE_SELECTION_STRATEGY=RegionBasedBridgeSelectionStrategy
    # org.jitsi.jicofo.BridgeSelector.BRIDGE_SELECTION_STRATEGY=SplitBridgeSelectionStrategy

    (The SplitBridgeSelectionStrategy is for testing only, it will split each conference immediately)

    in config.js add the octo part to the testing key:

    testing: {
    octo: {
    probability: 1
    },

    and set a region in the deployment info:

    deploymentInfo: {
    // shard: „shard1“,
    // region: „europe“,
    // userRegion: „asia“
    userRegion: „myRegion“
    },

    (this can be more complicated if you have multiple regions)

    Finally, in config files of the videobridges:

    # Octo configuration
    org.jitsi.videobridge.octo.BIND_ADDRESS=<>
    org.jitsi.videobridge.octo.PUBLIC_ADDRESS=<>
    org.jitsi.videobridge.octo.BIND_PORT=4096
    org.jitsi.videobridge.REGION=myRegion

    (also, open port 4096/10000 between the videobridges)“

    Antworten
  7. markus roth

    Ich habe einen Jitsi Server am Laufen und würde nun gerne die Authentifizierung über eine Active Directory Anbindung realisieren. Es gibt zwar im jitsi Communty Forum ein paar Threads, doch bei meinem jitsi Server wird die AD nicht kontaktiert.
    Hat das jemand schon eingerichtet?
    Über Hinweise wäre ich dankbar!

    Antworten
    • Florian

      Hallo Markus,

      vor den selben Problemen stehe ich auch.
      Habe SASLAUTH nach Anleitung im WIKI durchkonfiguriert und kann mit dem SASLTEST auch erfolgreich zur ActiveDirectory verbinden. Auch mit LDAP2 habe ich erste Gehversuche gemacht. Bin aber nicht soweit gekommen, dass die Videositzung eine Authenfifizierung durchgibt.

      Antworten
  8. Christopher

    Zwei Fragen hätte ich:
    1. Wieso wird hier die unstable von Jitsi verwendet?
    2. Der Artikel ist ja von März – kann mittlerweile die stable verwendet werden?

    Antworten
  9. Jens

    Hallo zusammen,

    hat jemand Erfahrung mit der Einbindung von Jigasi, ich hab eigentlich soweit alles am laufen einwählen klappt.

    Seit Tagen arbeite in an dem Problem das die Dial In Nummern nicht angezeigt werden.

    Gibt es deutsche Firmen die einen unterstützen können?

    Vielen Dank

    Antworten

Trackbacks/Pingbacks

  1. Kommunikation und Barrierefreiheit (5/7): Jitsi-Server nutzen – produktiver und weitere Eindrücke (3/3) – Patrick's Pinguin-WG - […] ich an dieser Stelle gern in den Artikel aufnehme.1) Der Freifunk München hat eine gute kurze und prägnante Anleitung…
  2. Kommunikation und Barrierefreiheit (5/7): Jitsi-Server nutzen – erste Eindrücke (1/3) – Patrick's Pinguin-WG - […] Update: Von Michael habe ich den Link zu einer Anleitung erhalten, wie man den Server mit einer einfachen Benutzerverwaltung…
  3. Installation eines eigenen Jitsi Meet Servers - Anleitung und Tipps | Tobias Scheible - […] und überspringen ein paar Punkte. Sehr ausführlich und aktuell ist hingegen der Artikel „Jitsi Best Practice und Skalierung“ von…
  4. BigBlueButton & Jitsi Meet - 2 Tools für Videokonferenzen - […] https://www.netways.de/blog/2020/03/27/jitsi-best-practice-und-skalierung/ […]

Einen Kommentar abschicken

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Mehr Beiträge zum Thema Apps | Jitsi | Security | Linux | Technology | Betriebssysteme | Network

Kibana Sicherheits-Updates: CVSS:Critical

Und täglich grüßt das Murmeltier. Nein nicht ganz. Heute ist es  aus der Elastic Stack Werkzeugkiste Kibana, für das es ein wichtiges Sicherheits-Update gibt. Es besteht auf jeden Fall Handlungsbedarf! IMHO auch wenn ihr die "Reporting" Funktion deaktiviert habt. Der...

Graylog Release Version 5.2 ist da! HURRA!

Diese Woche wurde Graylog 5.2 veröffentlicht. Natürlich gibt es auch in diesem Release wieder Abstufungen für Open, Operations und Security. Da wir nicht auf alles eingehen können, möchte ich hier auf die hervorzuhebenden Neuerungen und Änderungen eingehen. Ein...