Jitsi-Meet-Unstable-Installation auf Debian 10

Videokonferenzen mit Jitsi-Meet, kurz: Jitsi, erfreut sich derzeit großer Beliebtheit. Um eine Konferenz zu starten oder an einer teilzunehmen brauchen man weder einen Account, kein Browser-Plugin und auch keine App. Wobei es für App-Liebhaber eine gute App für iOS und Android gibt. Die Android-App ist auch in F-Droid verfügbar.

Die benutzte Technik ist grob mit der des aktuell sehr gehypten Zoom vergleichbar. Jitsi-Meet fällt im Gegensatz zu Zoom aber nicht regelmäßig durch Sicherheitsprobleme auf, ist Freie Software und kann sehr einfach auf einem eigenen Server installiert werden.

Eine eigene Jitsi-Installation hat viele Vorteile: Man kann Zugriffsrechte vergeben, so dass nicht jeder ein Meeting starten oder betreten kann. Außerdem kann die Oberfläche sowohl optisch als auch funktional umgestaltet werden: Man kann z.B. Logos austauschen, nicht benötigte Funktionen abschalten oder einstellen, dass beim Betreten eines Meetings Kamera und Mikrofon erstmal aus sind. Außerdem macht man sich unabhängiger von den Diensten Dritter.

Für die Installation der “stable“-Variante von Jitsi auf Debian gibt es eine funktionierende offizielle Installationsanleitung samt Video-Tutorial.

Wenn du also nur nur schnell Jitsi-Meet aufsetzen willst: Benutze Jitsi-Meet “stable” und halte dich an die offizielle Anleitung, das funktioniert und ist erheblich leichter als das unten!

Der “unstable“-Zweig von Jitsi – und um den geht es hier – entspricht in etwa dem Stand des öffentlichen Jitsi-Servers https://meet.jit.si und bringt neuere Funktionen mit, z.B. die “Speaker-Stats”, eine Liste, auf der angezeigt wird, wer wie lange gesprochen hat. Dafür ist er eben auch “unstable”: Weniger gut geprüft, ständig im Wandel, und so wird diese Installationsanleitung wohl auch bald veraltet sein. Aktuell (April 2020) funktioniert sie.

Ziele

  • Es soll ein Jitsi-Meet-Server “unstable” installiert werden.
  • Die Domain dazu soll “meet.brightyoga.de” sein.
  • Der Server bekommt ein LetsEncrypt-Zertifikat.
  • Nur bekannte Benutzer dürfen Meetings starten.
  • In der Benutzeroberfläche werden ein paar Logos ausgetauscht und Knöpfe entfernt.

Voraussetzungen

  • Internetanschluss mit ausreichend Bandbreite – pro Nutzer etwa 5 MBit/s im Up- und Downstream.
  • Server ist per Domainname erreichbar
  • Die Hardware sollte mindestens 2 GByte RAM haben und mindestens so schnell wie ein Raspberry Pi 3 sein

Installation

1. Hostnamen setzen

  • Hostname in /etc/hostname eintragen: meet.brightyoga.de
  • In /etc/hosts hinzufügen: 127.0.1.1 meet.brightyoga.de

2. Nginx und Certbot installieren

apt-get install nginx-full

apt-get install python3-certbot-nginx
/usr/bin/certbot --non-interactive --agree-tos --email foo@example.com --nginx -d meet.brightyoga.de

Der obige certbot-Befehl erledigt die Registrierung bei LetsEncrypt, besorgt das Zertifikat und konfiguriert Nginx für TLS um. Außerdem wird ein systemd-timer angelegt, mit dem regelmäßig das TLS-Zertifikat überprüft und erneuert wird.

3. Jitsi-Meet

Repository hinzufügen

wget -qO - https://download.jitsi.org/jitsi-key.gpg.key | sudo apt-key add - sudo sh -c "echo 'deb https://download.jitsi.org unstable/' > /etc/apt/sources.list.d/jitsi-unstable.list" sudo apt-get -y updat

(Siehe https://desktop.jitsi.org/Main/InstallJitsiMeetDebianNightlyRepository)

Pakete installieren

apt-get install jitsi-meet jitsi-meet-turnserver

Bei den debconf-Fragen den Hostnamen angeben und den Pfad zu dem oben von certbot erstellten Zertifikat:

  • Hostname: meet.brightyoga.de
  • I want to use my own certificate
    • SSL-Key: /etc/letsencrypt/live/meet.brightyoga.de/privkey.pem
    • Certificate: /etc/letsencrypt/live/meet.brightyoga.de/cert.pem

Das Paket „jitsi-meet-turnserver“ ist optional: Bei Konferenzen mit nur zwei Teilnehmern versucht Jitsi-Meet standardmäßig, eine direkte Verbindung zwischen den Teilnehmern aufzubauen (P2P), erst bei mehr Teilnehmern wird auf Client-zu-Server umgestellt. Damit P2P auch mit Clients hinter NAT-Routern funktioniert ist ein TURN-Server nötig. Wird das Paket nicht installiert, wird der TURN-Server von jitsi.org benutzt.

Da wir immer mit mehr als zwei Teilnehmern rechnen, schalten wir P2P weiter unten bei der Konfiguration aus. Es ist also grundsätzlich überhaupt kein TURN-Server nötig. Wir installieren ihn trotzdem – einfach weil wir es können. Außerdem schadet ist ja nicht.

4. Nginx konfigurieren

Aktuell zeigt Nginx noch seine Default-Seite und nicht die Jitsi-Meet-Webseite, außerdem scheitert systemctl restart nginx.
Grund dafür ist, dass sowohl jitsi-meet als auch die Nginx-Default-Konfiguration um „/“ konkurrieren.
Darum die Nginx-Default-Seite löschen und Nginx neu starten:

rm /etc/nginx/sites-enabled/default
systemctl restart nginx

Die Nginx-Konfigurationsverzeichnisse sollte jetzt so aussehen:

root@meet:~# ls -l /etc/nginx/sites-enabled/ total 0 lrwxrwxrwx 1 root root 50 Mar 27 00:05 meet.brightyoga.de.conf -> /etc/nginx/sites-available/meet.brightyoga.de.conf

root@meet:/etc/nginx# ls -l /etc/nginx/modules-enabled/
total 16
lrwxrwxrwx 1 root root 57 Mar 26 23:47 50-mod-http-auth-pam.conf -> /usr/share/nginx/modules-available/mod-http-auth-pam.conf
lrwxrwxrwx 1 root root 56 Mar 26 23:47 50-mod-http-dav-ext.conf -> /usr/share/nginx/modules-available/mod-http-dav-ext.conf
lrwxrwxrwx 1 root root 53 Mar 26 23:47 50-mod-http-echo.conf -> /usr/share/nginx/modules-available/mod-http-echo.conf
lrwxrwxrwx 1 root root 54 Mar 26 23:47 50-mod-http-geoip.conf -> /usr/share/nginx/modules-available/mod-http-geoip.conf
lrwxrwxrwx 1 root root 61 Mar 26 23:47 50-mod-http-image-filter.conf -> /usr/share/nginx/modules-available/mod-http-image-filter.conf
lrwxrwxrwx 1 root root 60 Mar 26 23:47 50-mod-http-subs-filter.conf -> /usr/share/nginx/modules-available/mod-http-subs-filter.conf
lrwxrwxrwx 1 root root 62 Mar 26 23:47 50-mod-http-upstream-fair.conf -> /usr/share/nginx/modules-available/mod-http-upstream-fair.conf
lrwxrwxrwx 1 root root 60 Mar 26 23:47 50-mod-http-xslt-filter.conf -> /usr/share/nginx/modules-available/mod-http-xslt-filter.conf
lrwxrwxrwx 1 root root 48 Mar 26 23:47 50-mod-mail.conf -> /usr/share/nginx/modules-available/mod-mail.conf
lrwxrwxrwx 1 root root 50 Mar 26 23:47 50-mod-stream.conf -> /usr/share/nginx/modules-available/mod-stream.conf
lrwxrwxrwx 1 root root 48 Apr 6 10:56 60-jitsi-meet.conf -> /usr/share/jitsi-meet-turnserver/jitsi-meet.conf

IPv6-Fix

Dummerweise hört Nginx mit der von Jitsi-Meet mitgebrachten Standardkonfiguration nur auf IPv4. Um Nginx auch auf IPv6-Anfragen antworten zu lassen müssen zwei Dateien geändert werden (Änderungen fettgedruckt):

--- /etc/nginx/modules-enabled/60-jitsi-meet.conf.old   2020-04-06 11:33:07.431675481 +0200
+++ /etc/nginx/modules-enabled/60-jitsi-meet.conf 2020-04-06 11:29:03.479010404 +0200
@@ -18,6 +18,7 @@
server {
listen 443;
  listen [::]:443;
# since 1.11.5 ssl_preread on;
--- /etc/nginx/sites-enabled/meet.brightyoga.de.conf.old        2020-04-06 11:34:22.759522056 +0200
+++ /etc/nginx/sites-enabled/meet.brightyoga.de.conf 2020-04-06 11:34:33.928090308 +0200
@@ -2,6 +2,7 @@
server {
listen 80;
  listen [::]:80;
server_name meet.brightyoga.de;
location ^~ /.well-known/acme-challenge/ {

(adaptiert von https://github.com/jitsi/jitsi-meet/commit/5d8d0b9a017766a1652b1d94722b31fd819fe359#diff-59e8f55910ace3753b251f2d7c4eb48c):

Fix für Android-App

Damit die Android-App eine Verbindung zum Server aufbauen kann, muss die mitgelieferte Nginx-Letsencrypt-Konfiguration angepasst werden:

diff -Nur /etc/nginx/sites-enabled/meet.brightyoga.de.conf.old /etc/nginx/sites-enabled/meet.brightyoga.de.conf
--- /etc/nginx/sites-available/meet.brightyoga.de.conf.old 2020-06-05 13:33:31.745402598 +0200
+++ /etc/nginx/sites-available/meet.brightyoga.de.conf 2020-06-05 13:33:38.881628800 +0200
@@ -27,7 +27,7 @@
add_header Strict-Transport-Security "max-age=31536000";
- ssl_certificate /etc/letsencrypt/live/meet.brightyoga.de/cert.pem;
+ ssl_certificate /etc/letsencrypt/live/meet.brightyoga.de/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/meet.brightyoga.de/privkey.pem;
root /usr/share/jitsi-meet;

5. Workarounds

Issue 1127

Wenn openjdk-11 verwendet wird – und das wird es, openjdk-11 ist Standard in Debian 10 – können zwar Konferenzen gestartet werden, sie brechen aber sofort wieder ab.
In /var/log/jitsi/jvb.log lassen sich dann Java-Fehler finden wie accessible: module jdk.management does not "opens com.sun.management.internal" to unnamed module
Das Problem ist bekannt (siehe https://github.com/jitsi/jitsi-videobridge/issues/1127). Bis es offiziell gelöst wird funktioniert folgender Workaround:

In der Datei /etc/jitsi/videobridge/config folgende JAVA_SYS_PROPS hinzufügen: --add-opens jdk.management/com.sun.management.internal=ALL-UNNAMED

Dann systemctl restart jitsi-videobridge

Prosody und HTTPS-Bosh

Wenn in Prosody BOSH aktiviert wird (und das macht Jitsi), dann versucht Prosody neben dem HTTP-Bosh-Port auf Port 8280 zusätzlich einen HTTPS-Bosh-Port auf Port 8281 zu starten. Das klappt aber nicht da es dafür in der Prosody-Konfiguration kein passendes Zertifikat gibt, und Prosody startet daraufhin sein BOSH-Modul nicht. In “/var/log/prosody/prosody.err” steht: “Error binding encrypted port for https: No certificate present in SSL/TLS configuration for https port 5281”

Da Jitsi verwendet nur den HTTP-Bosh-Por benutzt kann der HTTPS-Bosh-Port einfach abgeschaltet werden. Dazu in /etc/prosody/prosody.cfg.lua die zeile “https_ports = { }” eintragen

Ab jetzt sollte Jitsi-Meet funktionieren.

6. Jitsi-Meet für anonyme Meetings sperren

Standardmäßig darf jeder unseren Jitsi-Meet-Server benutzen und Meetings beginnen. Unser Ziel ist es jedoch, dass dies nur bekannte Nutzer dürfen.

Bei Jitsi-Meet ist der automatisch mitinstallierte XMPP-Server Prosody für die Benuterverwaltung zuständig.
Benutzer können mit Benutzername und Passwort direkt in Prosody angelegt werden (“interne Authentifizierung”), Prosody kann aber auch Benutzername und Passwort zur Prüfung an ein anderes Programm übergeben und anhand dessen Rückgabe entscheiden, ob der Benutzer ein gültiger Benutzer ist oder nicht (“externe Authentifizierung”). Als externes Programm kann z.B. ein Webserver benutzt werden.
Da wir nur wenige Benutzer haben werden wir die interne Authentifizierung verwenden.

Interne Authentifizierung einschalten

Jitsi Meet verwendet in Prosody verschiedene Virtual Hosts für verschiedene Zwecke. Diese Virtual Hosts werden nur von Jitsi Meet und Prosody verwendet und sind nicht von außen sichtbar, sie brauchen also auch kein LetsEncrypt-Zertifikat.

Der VirtualHost “meet.brightyoga.de” wird benutzt, um Meetingräume anzulegen. Das sollen nur noch bekannte Benutzer dürfen.
Darum in der Datei /etc/prosody.conf.d/meet.brightyoga.de.cfg.lua im VirtualHost “meet.brightyoga.de” die Zeile
authentication = "anonymous"
ersetzen durch:
authentication = "internal_plain"

Ganz offensichtlich braucht’s jetzt einen Gastzugang. Dazu muss unterhalb des VirtualHost “meet.brightyoga.de” ein neuer VirtualHost namens “guest.meet.brightyoga.de” angelegt werden:

VirtualHost "guest.meet.brightyoga.de"
authentication = "anonymous"
c2s_require_encryption = false

-- Hier die Module vom VirtualHost "meet.brightyoga.de" hinkopieren
-- sonst klappt die Verbindung zum Turn-Server nicht (siehe Browser-Console)
modules_enabled = {
"bosh";
"pubsub";
"ping";
"speakerstats";
"turncredentials";
"conference_duration";
}

Jetzt müssen noch die Clients als auch die Jicofo-Komponente von Jitsi-Meet (die ist das Bindeglied zwischen Prosody und der Videoübertragung) darüber in Kenntnis gesetzt werden, dass es statt einem einzigen VirtualHost jetzt deren zwei gibt, einen zur anonymen Nutzung und einen mit Authentifizierung.

Clients nutzen die Datei /etc/jitsi/meet/meet.brightyoga.de-config-js. In dieser Datei die Zeile “anonymousdomain” hinzufügen:

var config = {
hosts: {
domain: 'meet.brightyoga.de',
anonymousdomain: 'guest.meet.brightyoga.de',
[...]

Jicofo benutzt als Konfigurationsdatei /etc/jitsi/jicofo/sip-communicator.properties. Am Ende dieser Datei folgende Zeile hinzufügen:

org.jitsi.jicofo.auth.URL=XMPP:meet.brightyoga.de 

(Siehe https://github.com/jitsi/jicofo#secure-domain)

User anlegen

User, die Meetings starten sollen, können dann angelegt werden mit: prosodyctl register <USERNAME> meet.brightyoga.de <PASSWORT>

GUI-Anpassungen

Grundsätzlich bleiben alle Anpassungen bei einem Update von Jitsi-Meet erhalten – bis auf die in /usr/share/jitsi-meet.

In ”/etc/jitsi/meet/meet.brightyoga.de-config.js”:

Diese Datei enthält Starteinstellungen für die Clients (Webseite und Apps).

  • Meetings mit deaktivierten Video+Audio betreten:
    • startWithAudioMuted: true,
    • startWithVideoMuted: true,
  • Avatare, Callstats.io-API usw. von externen Servern abschalten: disableThirdPartyRequests: true,
  • Teilnehmer zwingen einen Namen anzugeben: requireDisplayName: true,
  • Auch bei nur zwei Teilnehmern keine P2P-Verbindung aufbauen sondern die Kommunikation gleich über den Server laufen lassen: p2p: {enabled: false },

Eigene Logos verwenden

Achtung: Die Änderungen sind nicht update-fest!

  • Eigenes Wasserzeichen statt Jitsi-Wasserzeichen: /usr/share/jitsi-meet/images/watermark.png durch ein PNG mit Transparenz und etwa der selben Größe (612×272) überschreiben.
  • Eigenes Favicon: /usr/share/jitsi-meet/images/favicon.ico mit eigenem Favicon überschreiben.
  • Eigenes iOS-Icon: /usr/share/jitsi-meet/images/apple-touch-icon.png mit eigenem PNG der Größe 180×180 überschreiben.

In ”/usr/share/jitsi-meet/interface_config.js”:

Diese Datei konfiguriert die Jitsi-Meet-Konferenzoberfläche. Achtung: Die Änderungen sind nicht update-fest!

Ein Klick auf das Jitsi-Meet-Wasserzeichen öffnet normalerweise die Jitsi-Webseite. Da ich oben das Wasserzeichen mit einem eigenen ersetzt habe, sollte der Link auch auf die eigene Webseite zeigen:
JITSI_WATERMARK_LINK: ‘https://www.brightyoga.de’,

Der Fenstertitel bzw. der Name in der App kann so geändert werden:
APP_NAME: ‘Meet Bright Yoga’,

Wenn man ein bisschen Werbung für Jitsi machen will kann man so einen kleinen Schriftzug mit Link links unten anzeigen lassen:
SHOW_POWERED_BY: true,

In TOOLBAR_BUTTONS kann man nicht benötigte oder nicht erwünschte Funktionen deaktivieren. Dazu einfach den entsprechenden Eintrag rauslöschen.

Protokollierung reduzieren

Nginx protokolliert für Jisti-Meet-Nutzer nur die IP 127.0.0.1 – ihre echten IP-Adressen stehen in /var/log/jvb.log. In journald wird nichts protokolliert.

/var/log/jvb.log wird von Logrotate verwaltet, darum in /etc/logrotate.conf die Zeile die mit „rotate“ beginnt ändern zu „rotate 1“. Damit werden Logs nur für eine Woche aufgehoben. Das sollte für eine Fehlersuche reichen.

Die Protokollierung kann (und sollte!) weiter reduziert werden indem in der Datei /etc/jitsi/videobridge/logging.properties die Zeile “.level=INFO” geändert wird zu “.level=WARNING”. Dann werden gar keine IP-Adressen mehr aufgezeichnet.

Jitis-Videobridge bei Absturz automatisch neu starten

Gelegentlich schmiert der Service “jitsi-videobridge2” ab. Um diesen Service wieder automatisch neu starten zu lassen:

# systemctl edit jitsi-videobridge2.service
[Service]
Restart=on-failure
RestartSec=5


Apps

Auf https://jitsi.org/downloads/ gibt es Apps für iOS und Android. Die Android-App gibt es in zwei Varianten: Mit Google-Trackern im Google-Store und ohne Tracker in F-Droid.

Außerdem kann man dort für Windows, MacOS und diverse Linux-Distributionen “Jitsi Desktop” herunterladen. Das kann hilfreich sein wenn der Browser mit Jitsi zicken macht.