Videokonferenzen mit Jitsi Meet
In diesem Beitrag dreht sich alles um die Einrichtung der Jitsi Software zum Bereitstellen von Videokonferenzen.
Inhalt:
- Vorbereitung
- Installation und Konfiguration Jitsi
- Secure Domain erstellen (kein öffentlicher Zugang)
- Datenschutz optimieren
Vorbereitung
Vorab empfiehlt es sich, das System auf den aktuellen Stand zu bringen, hierfür werden die Paketquellen zunächst neu eingelesen und im Anschluss alle verfügbaren Updates installiert.
System Updates einspielen:
apt update && apt upgrade -y
Danach muss die Domain, unter der unsere Jitsi Instanz später erreichbar werden soll via »localhost« aufgelöst werden.
Dazu wird der nachfolgende Eintrag in der »/etc/hosts« Datei eingefügt:
nano /etc/hosts
127.0.0.1 meet.domain.tld
Installation und Konfiguration Jitsi
Nach Abschluss der Vorbereitungen kann Jitsi Meet über die Paketquellen installiert werden:
apt install --no-install-recommends jitsi-meet
Danach wird die Standard Konfigurationsdatei gelöscht und die bestehende Konfigurationsdatei in ein neues Verzeichnis verschoben:
# Aktuelle Config Datei aus aktiven Seiten loeschen
rm /etc/nginx/sites-enabled/meet.domain.tld.conf
# Aktuelle Konfigurationsdatei in neues Verzeichnis verschieben
mv /etc/nginx/sites-available/meet.domain.tld.conf /etc/nginx/conf.d/meet.domain.tld.conf
Anpassung der Nginx Konfigurationsdatei
server_names_hash_bucket_size 64;
server {
listen 80;
listen [::]:80;
server_name meet.domain.tld;
location ^~ /.well-known/acme-challenge/ {
default_type "text/plain";
root /usr/share/jitsi-meet;
}
location = /.well-known/acme-challenge/ {
return 404;
}
location / {
return 301 https://$host$request_uri;
}
}
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name meet.domain.tld;
root /usr/share/jitsi-meet;
ssl_certificate /etc/letsencrypt/meet.domain.tld/ecc/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/meet.domain.tld/ecc/key.pem;
ssl_trusted_certificate /etc/letsencrypt/meet.domain.tld/ecc/cert.pem;
# security
include config/security.conf;
# logging
access_log /var/log/nginx/meet.domain.tld.access.log;
error_log /var/log/nginx/meet.domain.tld.error.log warn;
# ssi on with javascript for multidomain variables in config.js
ssi on;
ssi_types application/x-javascript application/javascript;
index index.html index.htm;
error_page 404 /static/404.html;
location = /config.js {
alias /etc/jitsi/meet/meet.domain.tld-config.js;
}
location = /external_api.js {
alias /usr/share/jitsi-meet/libs/external_api.min.js;
}
# ensure all static content can always be found first
location ~ ^/(libs|css|static|images|fonts|lang|sounds|connection_optimization|.well-known)/(.*)$
{
add_header 'Access-Control-Allow-Origin' '*';
alias /usr/share/jitsi-meet/$1/$2;
# cache all versioned files
if ($arg_v) {
expires 1y;
}
}
# BOSH
location = /http-bind {
proxy_pass http://localhost:5280/http-bind;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Host $http_host;
}
# xmpp websockets
location = /xmpp-websocket {
proxy_pass http://127.0.0.1:5280/xmpp-websocket?prefix=$prefix&$args;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $http_host;
tcp_nodelay on;
}
# colibri (JVB) websockets for jvb1
location ~ ^/colibri-ws/default-id/(.*) {
proxy_pass http://127.0.0.1:9090/colibri-ws/default-id/$1$is_args$args;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
tcp_nodelay on;
}
location ~ ^/([^/?&:'"]+)$ {
try_files $uri @root_path;
}
location @root_path {
rewrite ^/(.*)$ / break;
}
location ~ ^/([^/?&:'"]+)/config.js$
{
set $subdomain "$1.";
set $subdir "$1/";
alias /etc/jitsi/meet/meet.domain.tld-config.js;
}
# Anything that didn't match above, and isn't a real file, assume it's a room name and redirect to /
location ~ ^/([^/?&:'"]+)/(.*)$ {
set $subdomain "$1.";
set $subdir "$1/";
rewrite ^/([^/?&:'"]+)/(.*)$ /$2;
}
# BOSH for subdomains
location ~ ^/([^/?&:'"]+)/http-bind {
set $subdomain "$1.";
set $subdir "$1/";
set $prefix "$1";
rewrite ^/(.*)$ /http-bind;
}
# websockets for subdomains
location ~ ^/([^/?&:'"]+)/xmpp-websocket {
set $subdomain "$1.";
set $subdir "$1/";
set $prefix "$1";
rewrite ^/(.*)$ /xmpp-websocket;
}
}
Nach Abschluss der Änderungen wird der Webserver noch Probleme innerhalb der eben erstellten Config getestet und anschließend neu gestartet:
# Konfiguration überpruefen
nginx -t
# Webserver neu starten
systemctl restart nginx
Firewall Anpassung
Port | Protokoll | Kommentar |
---|---|---|
80 | TCP | HTTP Jitsi |
443 | TCP | HTTPS Jitsi |
10000 | UDP | Jitsi |
Für UFW sehen die abzusetzenden Befehle dann folgendermaßen aus:
ufw allow 80/tcp comment 'HTTP Traffic'
ufw allow 443/tcp comment 'HTTPS Traffic'
ufw allow in 10000/udp comment 'Jitsi'
Secure Domain erstellen (kein öffentlicher Zugang)
Nach der Standard Installation kann jeder, der die Adresse des Jitsi Servers kennt beliebig viele Räume erstellen und Meetings ansetzen. Möchte man dieses verhalten unterbinden ist ein wenig Nacharbeit in der Konfigurationsdatei nötig. Im Anschluss daran können nur noch authorisierte Nutzer mit Username und Kennwort Meetings ansetzen und starten.
Die benötigten Änderungen finden sich in der folgenden Datei:
nano /etc/prosody/conf.avail/meet.domain.tld.cfg.lua
Hier wird die Authentifizierung zugeschalten:
VirtualHost "meet.domain.tld"
authentication = "internal_plain"
Ebenso wird am Ende der Datei ein weiterer »VirtualHost« für Gäste der Konferenzen hinzugefügt:
VirtualHost "guest.meet.domain.tld"
authentication = "anonymous"
c2s_require_encryption = false
Nach Speichern der Datei wird der eben erstellte VirtualHost noch in Jitsi selbst hinterlegt. Hierfür wird die Konfigurationsdatei bearbeitet und um folgende Zeilen erweitert:
hosts: {
// XMPP
domain: 'meet.domain.tld',
// Domain fuer Gaeste
anonymousdomain: 'guest.meet.domain.tld',
[...]
Im letzten Schritt wird noch eine weitere Datei ergänzt:
nano /etc/jitsi/jicofo/sip-communicator.properties
org.jitsi.jicofo.auth.URL=XMPP:meet.domain.tld
Zuletzt werden die Logindaten generiert:
prosodyctl register Admin meet.domain.tld 'Pa$$wort'
- Username: Admin
- Kennwort: Pa$$wort
Dies kann pro Nutzer beliebig oft wiederholt werden.
Nach Neustart aller beteiligten Komponenten treten die Änderungen in Kraft:
systemctl restart prosody
systemctl restart jicofo
systemctl restart jitsi-videobridge2
Datenschutz optimieren
Obwohl Jitsi per Default schon recht datensparsam arbeitet, sendet es dennoch Daten an Drittanbieter (beispielsweise Gravatar um Bilder von Teilnehmern nachzuladen). Dies wird jetzt noch unterbunden:
Die Änderung wird ebenso in der »config.js« vorgenommen:
nano /etc/jitsi/meet/meet.domain.tld-config.js
disableThirdPartyRequests: true,
Nach erfolgreicher Änderung müssen sämtliche Dienste noch neu gestartet werden:
systemctl restart prosody
systemctl restart jicofo
systemctl restart jitsi-videobridge2