Jitsi Meet ist eine Open Source Videokonferenz Software die durch die Corona Pandemie in aller Munde ist. Ich persönliche finde Jitsi Meet eine der besten Alternativen zu Diensten wie Zoom, Teams und Co. Warum dies so ist und wie man Jitsi Meet benutzt beschreibe ich hier im
Tutorial: Videokonferenzen mit Jitsi Meet.
Ich möchte euch in dieser Anleitung zeigen wie die adminForge Jitsi Meet Instanz aufgesetzt wurde.
Aufbau des Setups:
- Ubuntu/Debian 11 als Betriebssystem
- Bereits laufender NGINX Webserver. Wir verwenden diesen als Proxy.
- Let’s Encrypt SSL Zertifikat (oder anderes)
- Aktuelle Docker CE Version
- Aktuelle Docker Compose Version
- Eine (Sub)domain wird benötigt die auf die IP-Adresse des Servers verweist – wie meet.example.com oder teamjoin.de
Offene Ports in der Firewall:
- 80/tcp
- 443/tcp
- 4443/tcp
- 10000/udp
Punkt 1: Docker CE installieren
Wir installieren Docker CE nach Anleitung.
Benötigte Pakete installieren:
1 |
apt-get update && apt-get install -y ca-certificates curl gnupg lsb-release git |
GPG Key herunterladen:
1 |
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg |
Repository hinzufügen Ubuntu:
1 2 3 |
echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null |
Repository hinzufügen Debian:
1 2 3 |
echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian \ $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null |
Docker CE installieren:
1 |
apt-get update && apt-get -y install docker-ce docker-ce-cli containerd.io |
Die aktuellste Docker Compose Version installieren wir mit diesem Befehl:
1 |
curl -L "https://github.com/docker/compose/releases/download/$(curl -s https://github.com/docker/compose/releases/latest | cut -d "/" -f8 | cut -d "\"" -f1)/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose; chmod +x /usr/local/bin/docker-compose |
Eine aktuelle Docker Compose Version, oder andere Installationsmöglichkeiten, gibt es hier: Docker Compose Anleitung
Punkt 2: Jitsi Meet Docker herunterladen
Zuerst erstellen wir uns einen Docker Ordner:
1 |
mkdir /opt/docker |
Wir wechseln in den Ordner und klonen das Git Repository:
1 2 |
cd /opt/docker git clone https://github.com/jitsi/docker-jitsi-meet.git |
Nun wechseln wir in diesen Ordner und kopieren die .env Konfigurationsdatei:
1 2 3 |
mv docker-jitsi-meet/ jitsi-meet/ cd jitsi-meet/ cp env.example .env |
Jetzt erstellen wir sichere Passwörter mit dem vorhandenen Script:
1 |
./gen-passwords.sh |
Die Konfigurationsordner in unserem Verzeichnis .jitsi-meet-cfg
müssen wir manuell erstellen:
1 |
mkdir -p .jitsi-meet-cfg/{web/letsencrypt,transcripts,prosody,jicofo,jvb,jigasi,jibri} |
Punkt 3: Jitsi Meet .env anpassen
Bevor es losgeht müssen wir ein paar Mindeständerungen vornehmen.
Ich habe den Konfigurationsordner von Jitsi Meet gerne im selben Docker Pfad. Darum passen wir diesen an:
1 2 |
# Directory where all configuration will be stored CONFIG=.jitsi-meet-cfg |
Da wir später unseren Nginx Proxy vorschalten stellen wir die HTTP Ports von Jitsi Meet auf localhost um:
1 2 3 4 5 |
# Exposed HTTP port HTTP_PORT=127.0.0.1:180 # Exposed HTTPS port HTTPS_PORT=127.0.0.1:1443 |
Nun estellt die Timezone in Deutschland auf Europe/Berlin:
1 2 |
# System time zone TZ=Europe/Berlin |
Nun tragen wir die (Sub)domain die wir für diese Jitsi Meet Instanz verwenden möchten ein:
1 2 |
# Public URL for the web service PUBLIC_URL=https://meet.example.com |
Einschalten von ein paar nützlichen Funktionen:
1 2 3 4 5 6 7 8 |
# Control whether the lobby feature should be enabled or not ENABLE_LOBBY=1 # Show a prejoin page before entering a conference ENABLE_PREJOIN_PAGE=1 # Enable breakout rooms ENABLE_BREAKOUT_ROOMS=1 |
Etherpad URL setzen, um gemeinsam an Dokumenten arbeiten zu können:
1 2 |
# Set etherpad-lite public URL (uncomment to enable) ETHERPAD_PUBLIC_URL=https://pad.adminforge.de/p/ |
Damit alles reibungslos läuft, tragen wir die Docker Host IP-Adresse ein:
1 2 |
# Public IP address JVB_ADVERTISE_IPS=< PUBLIC-IP-ADDRESS > |
Einen STUN Server für P2P Videokonferenzen (max. 2 Personen) hinterlegen wir ebenfalls. Damit werden nicht die von jitsi.net oder damals Google verwendet. Ihr dürft gerne die adminForge STUN Server verwenden:
1 2 |
# STUN servers used to discover the server's public IP JVB_STUN_SERVERS=relay.adminforge.de:443,relay2.adminforge.de:443 |
Damit nicht die unstable Version genutzt wird forcieren wir stable:
1 |
JITSI_IMAGE_VERSION=stable |
Punkt 4: Nginx Port 80 vHost erstellen
Nginx installieren.
1 |
apt install nginx |
Wir wechseln in den Nginx vHost Ordner.
1 |
cd /etc/nginx/sites-available/ |
Nun erstellen wir einen Port 80 vHost für Let’s Encrypt und zur Weiterleitung an HTTPS.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
server { listen 80; listen [::]:80; server_name meet.example.com; location /.well-known/acme-challenge { root /var/www/letsencrypt; default_type "text/plain"; try_files $uri =404; } location / { return 301 https://$host$request_uri; } } |
Wir aktivieren die Konfiguration.
1 |
ln -s /etc/nginx/sites-available/meet.example.com.conf /etc/nginx/sites-enabled/meet.example.com.conf |
Nun laden wir die Konfiguration.
1 |
systemctl reload nginx.service |
Wir erstellen uns ein kostenloses Let’s Encrypt SSL-Zertifikat. Ich beschreibe ausführlich wie dies funktioniert hier.
Eure Domain meet.example.com
muss vor diesem Schritt bereits auf die Server IP-Adresse auflösen!
Let’s Encrypt Kurzanleitung:
1 2 3 4 5 |
apt install -y socat curl https://get.acme.sh | sh source .bashrc acme.sh --set-default-ca --server letsencrypt acme.sh --set-default-chain --preferred-chain "ISRG" --server letsencrypt |
1 2 3 |
... CERT_HOME="/etc/ssl/private" ... |
1 2 3 |
mkdir /etc/nginx/global mkdir /var/www/letsencrypt chown www-data. /var/www/letsencrypt -R |
1 |
acme.sh --issue -k ec-384 -w /var/www/letsencrypt -d meet.example.com --reloadcmd "systemctl reload nginx.service" |
1 |
openssl dhparam -out /etc/nginx/dhparams.pem 4096 |
Punkt 5: Nginx Port 443 vHost erstellen
Nun erstellen wir einen vHost für SSL, bsp. meet.example.com_ssl.conf
. Bitte passt nach eurem Bedarf alles an.
WICHTIG: Damit der Jitsi Meet Desktop Client funktioniert, darf der Security Header X-Frame-Options
nicht gesetzt werden und Content-Security-Policy
nur abgeschwächt!
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 |
server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name meet.example.com; access_log off; error_log /var/log/nginx/meet.example.com.error.log; ssl_certificate /etc/ssl/private/meet.example.com_ecc/fullchain.cer; ssl_certificate_key /etc/ssl/private/meet.example.com_ecc/meet.example.com.key; ssl_dhparam /etc/nginx/dhparams.pem; ssl_buffer_size 1400; ssl_session_timeout 1d; ssl_session_cache shared:SSL:50m; ssl_session_tickets off; ssl_protocols TLSv1.2 TLSv1.3; # Ab Nginx 1.15.4 # ssl_early_data on; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384; ssl_prefer_server_ciphers on; ssl_stapling on; ssl_stapling_verify on; ssl_ecdh_curve X25519:P-384:P-256:P-521; resolver 176.9.93.198 176.9.1.117 valid=300s; resolver_timeout 5s; add_header Strict-Transport-Security "max-age=31536000; includeSubdomains; preload"; add_header X-Xss-Protection "1; mode=block"; add_header X-Content-Type-Options nosniff; add_header Referrer-Policy same-origin; proxy_cookie_path / "/; HTTPOnly; Secure"; add_header Expect-CT "enforce, max-age=21600"; add_header Feature-Policy "payment none"; keepalive_timeout 70; sendfile on; client_max_body_size 0; gzip on; gzip_disable "msie6"; gzip_vary on; gzip_proxied any; gzip_comp_level 6; gzip_buffers 16 8k; gzip_http_version 1.1; gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; location / { log_not_found off; proxy_cache_valid 200 120m; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Scheme $scheme; proxy_pass http://127.0.0.1:180/; } location ~ ^/colibri-ws/([a-zA-Z0-9-\.]+)/(.*) { tcp_nodelay on; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_pass http://127.0.0.1:180/colibri-ws/$1/$2$is_args$args; } location /xmpp-websocket { tcp_nodelay on; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; proxy_pass http://127.0.0.1:180/xmpp-websocket; } } |
Wenn alles angepasst ist erstellen wir den Symlink, ersetzt hier auch wieder meet.example.com
:
1 |
ln -s /etc/nginx/sites-available/meet.example.com_ssl.conf /etc/nginx/sites-enabled/meet.example.com_ssl.conf |
Jetzt prüfen wir ob alles korrekt ist un laden Nginx Konfigurationen neu:
1 2 3 |
nginx -t nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful |
1 |
systemctl reload nginx.service |
Punkt 6: Docker Container starten
Die Docker Container können nun gestartet werden. Wir verwenden dazu den sehr praktischen docker-compose
Befehl, der uns gleich alle 4 Container korrekt startet:
1 |
docker-compose up -d |
Ob alles läuft prüfen wir mit diesem Befehl:
1 2 3 4 5 6 |
docker-compose ps NAME COMMAND SERVICE STATUS PORTS jitsi-meet-jicofo-1 "/init" jicofo running jitsi-meet-jvb-1 "/init" jvb running 0.0.0.0:4443->4443/tcp, 0.0.0.0:10000->10000/udp, :::4443->4443/tcp, :::10000->10000/udp jitsi-meet-prosody-1 "/init" prosody running 5347/tcp jitsi-meet-web-1 "/init" web running 127.0.0.1:180->80/tcp, 127.0.0.1:1443->443/tcp |
Stoppen könnt ihr alles mit docker-compose down
.
WICHTIG: Wenn Anpassungen an der .env
gemacht wurden, muss der Config-Ordner .jitsi-meet-cfg
gelöscht werden um die Änderungen wirksam zu machen!
1 2 3 4 |
docker-compose down rm -r .jitsi-meet-cfg mkdir -p .jitsi-meet-cfg/{web/letsencrypt,transcripts,prosody,jicofo,jvb,jigasi,jibri} docker-compose up -d |
Fertig! Unter https://meet.example.com ist eure eigene Jitsi Meet Instanz nun erreichbar.
Als nächstes: Jitsi Meet Docker Instanz anpassen
Euer adminForge Team
Unterstütze unsere Arbeit mit einer Spende. |