Testinstallation im Grünen Netz ohne Let's Encrypt siehe → jitsi_in_gruen
Für eine eigene Jitsi-Installation nimmt man sinnvollerweise einen eigenen Server. Wir hatten keine Probleme mit einer virtuellen Maschine, bei hoher Last kann eine Installation auf der Hardware je nach installierten Zusatzmodulen eventuell Vorteile bringen.
Als Betriebssystem funktioniert für eine Basisinstallation Ubuntu Server 18.04 LTS, das bringt aber eine recht alte Prosody-Version mit. Es gibt ein paar Zusatzfeatures wie eine Statistik über die Anzahl der Meetings und Teilnehmer, die dann nicht funktionieren. Möchte man solche Features nutzen, ist eine Prosody-Version ab 11 sinnvoll (man kann die z. B. für Ubuntu 18.04 aus dem Prosody-Repossitory nachinstalliern).
Wenn man den Server hinter eine Firewall betreibt, so muss man diverse TCP-Ports und einen großen Bereich UDP-Ports öffnen. Da auf unserem Server sowieso nur Jitsi läuft, betreiben wir ihn ohne vorgeschaltete Firewall (man sollte dann den SSH-Port umbiegen).
Die zu öffnenden Ports sind TCP/443 TCP/80 and UDP/10000.
Die Installation besteht aus zwei Schritten, Jitsi + Let's-Encrypt. Bei der Installation sollte man gleich die endgültige Domain angeben. Wenn man die später ändern will, dann installiert man besser neu. Alle Befehle muss man als root (das ist die Bedeutung des „#“ vor jeder Befehlszeile) oder mit sudo ausführen:
# wget -qO - https://download.jitsi.org/jitsi-key.gpg.key | apt-key add - # sh -c "echo 'deb https://download.jitsi.org stable/' > /etc/apt/sources.list.d/jitsi-stable.list" # apt update # apt install jitsi-meet
Während der Installation „Zertifikat erstellen“ wählen. (… Generate …)
Danach Let’s-Encrypt einrichten:
# cd /usr/share/jitsi-meet/scripts/ # ./install-letsencrypt-cert.sh
Siehe auch → https://jitsi.org/downloads
Wir hatten in der Standardkonfiguration das Problem, dass der Java-Prozess für die Videobridge völlig aus dem Ruder lief, auch ohne aktive Meetings. Dies äußerte sich in einer Prozessorlast am Anschlag. Meetings mit mehr als einer Handvoll Leuten waren nicht sinnvoll.
Ich habe dann in der Datei /etc/jitsi/videobridge/sip-communicator.properties
die folgende Option
gesetzt:
org.jitsi.videobridge.DISABLE_TCP_HARVESTER=true
Dies unterdrückt offenbar eine Kommunikation per TCP – wir sehen keine offensichtlichen Konsequenzen (siehe https://github.com/jitsi/jitsi-videobridge/blob/master/doc/tcp.md).
In manchen Posts habe ich auch die Empfehlung gefunden, stattdessen einen Port vorzugeben (org.jitsi.videobridge.TCP_HARVESTER_PORT=4443
), habe das aber nicht getestet.
Ein STUN-Server (Simple Traversal of User Datagram Protocol [UDP] Through Network Address Translators) ermöglicht es NAT-Clients (z. B. Computer hinter einer Firewall), die Kommunikation mit anderen Konferenzteilnehmern außerhalb des lokalen Netzwerks aufzubauen. Die meisten STUN-Server arbeiten auf Port 3478. Jitsi verwendet WebRTC und benötigt dazu ggf. einen STUN-Server.
Wenn man seinen Jitsi-Server datenschutzkonform betreiben möchte, dann sollte man die standardmäßig verwendeten Google-STUN-Server deaktivieren.
Die werden in der Datei /etc/jitsi/meet/meine.domain.de-config.js
konfiguriert. Hier kann man seinen eigenen STUN-Server eintragen (z. B. ein Coturn). Es gibt öffentliche STUN-Server, bei denen man aber vorher klären sollte, ob man die für seine Jitsi-Installation verwenden darf. Beispiele wären:
{ urls: 'stun:stun.t-online.de:3478' }
oder
{ urls: 'stun:stun.1und1.de:3478' }
oder
{ urls: 'stun:stun.nextcloud.com:443' }
oder weitere öffentliche STUN-Server → public STUN List
1. Zunächst muss man einige Prosody-Module nachinstallieren:
# apt install prosody-modules
2. Nun aktiviert man man in der Datei /etc/prosody/conf.d/jitsi.meinedomain.de.cfg.lua
die LDAP-Anmeldung:
... VirtualHost "jitsi.meinedomain.de" -- authentication = "anonymous" authentication = "ldap2" ... c2s_require_encryption = false ...
3. Datei /etc/prosody/prosody.cfg.lua
: Im allgemeinen Teil bei „Server wide settings“ fügt man folgende Option ein:
--------- Server wide settings ---------- consider_bosh_secure = true ...
Und weiter unten überprüft man (Achtung, genau hinschauen: es gibt auch c2s):
s2s_secure_auth = false
4. Die Einstellungen für den LDAP-Server kommen in eine neue Datei /etc/prosody/conf.avail/ldap.cfg.lua
. Hier ein Beispiel für eine LMN 6.2. Als hostname kann auch eine IP eingetragen werden.
authentication = 'ldap2' ldap = { hostname = 'server.meine-schule.kfz.schule-bw.de:389', use_tls = true, bind_dn = 'uid=ldapbinddummy,ou=accounts,dc=meine-schule,dc=kfz,dc=schule-bw,dc=de', bind_password = 'geheimesPasswort', user = { basedn = 'ou=accounts,dc=meine-schule,dc=kfz,dc=schule-bw,dc=de', filter = '(objectClass=posixAccount)', usernamefield = 'uid', namefield = 'cn', }, }
5. Config aktivieren:
# cd /etc/prosody/conf.d/ # ln -s ../conf.avail/ldap.cfg.lua
6. Dienste neu starten:
# service prosody restart # service jicofo restart # service jitsi-videobridge2 restart
Wie man sieht, muss man über Port 389 (mit TLS) gehen, LDAPS über Port 636 fuinktioniert nicht. Den Port 389 muss man gegebenenfalls in der Firewall (IPFire/OPNsense) für den LMN-Server aufmachen. Der bind-user „ldapbinddummy“ ist ein Dummy-Account (z. B. ein Extraschüler).
Als bind-user funktionierte bei uns leider nur der admin bei einer anderen use_tls
Einstellung:
... use_tls = false, bind_dn = 'cn=admin,dc=meine-schule,dc=kfz,dc=schule-bw,dc=de', ...
Siehe auch → https://booting-rpi.blogspot.com/2015/09/using-ldap-authentication-with-jitsi.html
Zum Testen, ob die LDAP-Verbindung funktioniert kann man das Tool „ldapsearch“ am Jitsi-Server verwenden:
# apt-get install ldap-utils # ldapsearch -x -H ldap://server.meine-schule.de:389 -b "dc=meine-schule,dc=kfz,dc=schule-bw,dc=de"
Beim voranstehendem Befehl sollte eine Liste aller LDAP-Einträge des Servers (bei uns ca. 1500) ausgegeben werden. Wenn man nur den Eintrag z.B. vom „mueller“ möchte:
# ldapsearch -x -H ldap://server.meine-schule.de:389 -b "dc=meine-schule,dc=kfz,dc=schule-bw,dc=de" "uid=mueller"
Um den bind-user zu testen:
# ldapsearch -x -H ldap://server.meine-schule.de:389 -b "dc=meine-schule,dc=kfz,dc=schule-bw,dc=de" -D "cn=admin,dc=meine-schule,dc=kfz,dc=schule-bw,dc=de" -W "uid=mueller"
In der Datei /etc/prosody/conf.avail/ldap.cfg.lua
einen Filter setzen, der nur die Gruppen-ID der Lehrer zulässt:
... filter = '(&(objectClass=posixAccount)(gidNumber=10000))', ...
danach ausführen:
# service prosody restart
Automatische Anpassung, z.B. in einem Cron - Job um ab 18:00 Uhr nur noch Lehrer zulassen:
# sed -i 's/\s*filter\s*=.*/ filter = (\&(objectClass=posixAccount)(gidNumber=10000))/' /etc/prosody/conf.d/ldap.cfg.lua && service prosody restart
und wieder alle User zulassen:
# sed -i 's/\s*filter\s*=.*/ filter = (objectClass=posixAccount)/' /etc/prosody/conf.d/ldap.cfg.lua && service prosody restart
In der Datei /usr/share/jitsi-meet/lang/main-de.json
sind die deutschen Textmeldungen von jitsi hinterlegt. Dort findet man auch die Begrüßungstexte der Startseite:
... "welcomepage": { "appDescription": "Auf geht's! Starten Sie eine Videokonferenz mit dem ... "title": "Sichere, mit umfassenden Funktionen ... }
Datei editieren um die Texte anzupassen. Da die Texte teils gecached werden, erscheinen die Änderungen nicht immer unmittelbar bei der Web-Site.
siehe auch: → https://www.kuketz-blog.de/jitsi-meet-server-einstellungen-fuer-einen-datenschutzfreundlichen-betrieb/
Die Datei /usr/share/jitsi-meet/css/all.css
enthält die komplette css-Informationen. Sie ist leider exterm unübersichtlich, da alle Elemente in nur zwei riesig langen Zeilen stehen ohne jegliche Struktur - ist wohl für den Browser performanter! Ich habe die Datei mit sed umformatiert und Zeilenumbrüche eingefügt, dann wird sie etwas lesbarer:
# sed -i 's/}/}\n/g' /usr/share/jitsi-meet/css/all.css
Am Ende der Datei all.css
drei Zeilen hinzugefügt:
... .welcome .welcome-watermark{position:absolute;width:100%;height:auto} #footer{position:static;margin-top:20px;margin-bottom:20px;font-size:14px} #header{position:absolute;top:0;text-align:center;width:100%;margin-top:20px;margin-bottom:20px;font-size:14px}
und in /usr/share/jitsi-meet/static/welcomePageAdditionalContent.html
hinzugefügt:
... <div id="footer"> <center>Impressum ...... </center> </div> <div id="header"> <center>Datenschutz: Es ist verboten die Konferenz mitzuschneiden!</center> </div> ...
Hier sollte auch gesetzt werden, dass der Android-App-Link auf die trackerfreie Version im F-Droid-Store verlinkt (für iOS gibt es eine solche nicht):
... DEFAULT_REMOTE_DISPLAY_NAME: 'Schüler', DEFAULT_LOCAL_DISPLAY_NAME: 'ich', SHOW_JITSI_WATERMARK: true, JITSI_WATERMARK_LINK: 'https://www.meineschule.de', ... GENERATE_ROOMNAMES_ON_WELCOME_PAGE: false, ... /** * Specify custom URL for downloading android mobile app. */ MOBILE_DOWNLOAD_LINK_ANDROID: 'https://f-droid.org/en/packages/org.jitsi.meet/'
Das angezeigte Jitsi-Logo mit transparentem Hintergrund ist /usr/share/jitsi-meet/images/watermark.png
. Diese Datei kann mit einem eigenen Logo getauscht werden. Das Logo wird standardmäßig in einer Größe von 186×74 angezeigt. Ich habe die Datei watermark.png
ausgetauscht und dann in der Datei all.css
die Größenangabe geändert:
... .watermark{position:absolute;top:15;width:186px;height:74px;... ...
Variable in der Datei /usr/share/jitsi-meet/interface_config.js
setzen. Verwendet nun ein Teilnehmer einen dieser Browser, wird der Zugang mit einem Hinweis verweigert.
... UNSUPPORTED_BROWSERS: ['firefox', 'safari', 'mozilla'], ...
In der Datei /etc/jitsi/meet/jitsi.meineschule.de-config.js
die Auflösung von 720 auf z.B. 240 reduzieren, das genügt bei einer Videokonferenz mit mehreren Teilnehmern und somit kleinen Bildern.
... resolution: 240, constraints: { video: { aspectRatio: 16 / 9, height: { ideal: 240, max: 240, min: 240 } } }, ...