Version: 25.09.16
Videokonferenzen gehören heute zum Alltag – ob im Homeoffice, bei Online-Kursen oder im privaten Austausch. Mit Jitsi Meet haben Sie die Möglichkeit, eine komplett eigene Videokonferenz-Plattform zu betreiben – unabhängig von externen Diensten und mit voller Kontrolle über Daten und Funktionen. 🛡️
Ein eigener Jitsi-Server eignet sich z. B. für:
- 📚 Schulungen und Online-Kurse
- 👥 Team-Meetings im Unternehmen
- 🔒 Sichere, private Gespräche ohne Drittanbieter
Damit Sie erfolgreich starten können, sollten Sie ein paar Grundkenntnisse und Voraussetzungen mitbringen:
- 🐧 Linux-Basics (Server-Administration, SSH, Pakete installieren)
- 🐳 Erfahrung im Umgang mit Docker und Docker Compose (bereits installiert)
- 🌐 Grundwissen über Netzwerke und Domains (DNS, Ports, SSL-Zertifikate)
- ⚠️ !! eigener Turn / Coturn Server um Verbindungen von außen annehmen zu können! Grundvoraussetzung siehe Punkt 1 !! 🔥🔥
In diesem Tutorial zeige ich Ihnen Schritt für Schritt, wie Sie Ihren eigenen Jitsi Meet Server einrichten – von den Voraussetzungen bis hin zur lauffähigen Videokonferenz-Plattform.
Wir bedienen uns hierzu von einigen Elementen, die auf der offiziellen Jitsi Meet Konfigurationsseite entnommen werden können:
https://jitsi.github.io/handbook/docs/devops-guide/devops-guide-docker
1. Turn / Coturn Server
🔥 Jitsi Meet setzt einen funktionierenden turn / coturn Server voraus, damit externe Verbindungen über WebRTC angenommen werden können.‼️Portfreigabe von Coturn (UDP Port 3478, 40000 – 41000 und TCP 3478 sowie bei TLS noch 5349) müssen in der Firewall / VPS freigegeben sein.
Coturn wird auf dem Linux Server wie folgt installiert:
sudo apt update
sudo apt install coturn
Anschließend den entsprechenden Service aktivieren:
sudo systemctl enable coturn
Dann „nano etc/turnserver.conf“:
lt-cred-mech
realm=yourturnserver.com
listening-port=3478
listening-ip=IP-ADRESS-YOUR-VPS
min-port=40000
max-port=41000
# DB-Directory
userdb=/var/lib/turn/turndb
# LOGS
log-file=/var/log/turnserver.log
simple-log
Berechtigungen für die Datenbank (userdb) vergeben:
sudo mkdir -p /var/lib/turn
sudo rm -f /var/lib/turn/turndb #remove old DB
sudo -u turnserver touch /var/lib/turn/turndb
sudo chown -R turnserver:turnserver /var/lib/turn
sudo chmod 750 /var/lib/turn
sudo chmod 660 /var/lib/turn/turndb
Danach den Dienst starten:
sudo systemctl start coturn
Jetzt müssen wir noch die User in Coturn vergeben, insbesondere einen User den Jitsi Meet in der „.env Config Datei“ später benutzen wird.
sudo turnadmin -a -u user -p ultrastrongpassword -r yourturnserver.com -b /var/lib/turn/turndb
Hiermit lassen sich die erstellten Coturn User in der DB anzeigen:
sudo turnadmin -l -b /var/lib/turn/turndb
Solche Meldungen im Terminal können dabei ignoriert werden (es läuft alles einwandfrei):
0: : log file opened: /var/log/turn_2255621_2025-09-15.log 0: : SQLite connection was closed.
Getestet werden kann der eigene Turnserver mit folgendem Befehl:
turnutils_uclient -u user -w password -r yourturnserver.com -p 3478 -y turn.yourturnserver.com
Wenn so etwas angezeigt wird, hat alles funktioniert:
: : Total connect time is 1 0: : Total connect time is 1 0: : start_mclient: msz=4, tot_send_msgs=0, tot_recv_msgs=0, tot_send_bytes ~ 0, tot_recv_bytes ~ 0 1: : start_mclient: msz=4, tot_send_msgs=0, tot_recv_msgs=0, tot_send_bytes ~ 0, tot_recv_bytes ~ 0 2: : start_mclient: msz=4, tot_send_msgs=5, tot_recv_msgs=5, tot_send_bytes ~ 500, tot_recv_bytes ~ 500 3: : start_mclient: msz=4, tot_send_msgs=5, tot_recv_msgs=5, tot_send_bytes ~ 500, tot_recv_bytes ~ 500 4: : start_mclient: msz=4, tot_send_msgs=5, tot_recv_msgs=5, tot_send_bytes ~ 500, tot_recv_bytes ~ 500 4: : start_mclient: tot_send_msgs=20, tot_recv_msgs=20 4: : start_mclient: tot_send_bytes ~ 2000, tot_recv_bytes ~ 2000 4: : Total transmit time is 4 4: : Total lost packets 0 (0.000000%), total send dropped 0 (0.000000%) 4: : Average round trip delay 0.000000 ms; min = 0 ms, max = 0 ms 4: : Average jitter 0.100000 ms; min = 0 ms, max = 1 ms
Fertig! Nicht vergessen in der UFW-Firewall oder VPS-Firewall die entsprechenden Ports oben freizugeben!
2. Installation Jitsi Meet:
Wir loggen uns dazu auf unserem Server (Linux Ubuntu / VPS) ein und erstellen in unserem Projektordner einen neuen Ordner „jitsi“ und navigieren anschließend zu diesem.
cd /home/
mkdir jitsi
cd jitsi
Innerhalb des Jitsi Ordner führen wir folgenden Befehl aus:
wget $(wget -q -O - https://api.github.com/repos/jitsi/docker-jitsi-meet/releases/latest | grep zip | cut -d\" -f4)
Wir schauen uns dann in dem Ordner mit „ls“ an wie die Datei heißt, die wir heruntergeladen haben und führen dann folgenden Befehl aus:
unzip <filename>
3. Konfiguration:
Danach:
cp env.example .env
Mit dem cp env Befehl zu .env kopieren wir die Beispiel Konfigurationsdatei von Jitsi Meet zu unser eigenen .env Datei, in die nachher unsere Konfiguration ergänzt wird.
Jetzt müssen wir noch starke Passwörter für die .env Datei erstellen, die dann dort auch direkt eingetragen werden. Einfach folgenden Befehl in dem „jitsi“-Ordner ausführen:
./gen-passwords.sh
Nun erstellen wir die restlichen Konfigurationsdateien:
mkdir -p ~/.jitsi-meet-cfg/{web,transcripts,prosody/config,prosody/prosody-plugins-custom,jicofo,jvb,jigasi,jibri}
Nachdem alle config-Dateien erstellt wurden, starten wir das Docker Projekt kurz um es danach wieder auszuschalten:
docker compose up -d
docker compose down
Nun schauen wir uns die .env Konfigurationsdatei genauer an und ergänzen entsprechende Einträge:
nano .env
Folgender Inhalt sollte (angepasst!) in der .env Datei stehen, damit alles funktioniert:
# All config files into jitsi folder:
CONFIG=./config
HTTP_PORT=8000
HTTPS_PORT=8443
#Timezone
TZ=UTC
PUBLIC_URL=https://meeting.yourdomain.com
# Reachable IP from Outside the docker container:
JVB_ADVERTISE_IPS=128.XXX.XXX.XXX
# Enable authentication (will ask for login and password to join the meeting)
ENABLE_AUTH=1
# Enable guest access (if authentication is enabled, this allows for users to be held in lobby until registered user lets them in)
ENABLE_GUESTS=1
# Select authentication type: internal, jwt, ldap or matrix
AUTH_TYPE=internal
# XMPP password for Jicofo client connections
JICOFO_AUTH_PASSWORD=GENERATEDWITHGENPASSWORDSHFILEABOVE
# XMPP password for JVB client connections
JVB_AUTH_PASSWORD=GENERATEDWITHGENPASSWORDSHFILEABOVE
# XMPP password for Jigasi MUC client connections
JIGASI_XMPP_PASSWORD=GENERATEDWITHGENPASSWORDSHFILEABOVE
# XMPP password for Jigasi transcriber client connections
JIGASI_TRANSCRIBER_PASSWORD=GENERATEDWITHGENPASSWORDSHFILEABOVE
# XMPP recorder password for Jibri client connections
JIBRI_RECORDER_PASSWORD=GENERATEDWITHGENPASSWORDSHFILEABOVE
# XMPP password for Jibri client connections
JIBRI_XMPP_PASSWORD=GENERATEDWITHGENPASSWORDSHFILEABOVE
# Container restart policy
RESTART_POLICY=unless-stopped
# Jitsi image version (useful for local development)
#JITSI_IMAGE_VERSION=latest
ENABLE_XMPP_WEBSOCKET=1
ENABLE_COLIBRI_WEBSOCKET=1
#TURN SERVER CONFIGURATION:
# TURN-Server Configuration
TURN_HOST=yourturnserver.com
TURN_PORT=3478
TURN_TRANSPORT=udp,tcp
# If used TLS TURN SERVER
#TURNS_HOST=yourturnserver.com
#TURNS_PORT=443
# Login Data Turnserver (username:password)
TURN_CREDENTIALS=username:password
# Turn TTL in Seconds, let it so
TURN_TTL=86400
Wir müssen jetzt noch entsprechende User vergeben, da wir Jitsi Meet so eingestellt haben, dass nicht einfach Jeder, der die URL kennt eine Videokonferenz einberufen kann.
Das Docker Projekt wird gestartet mit:
docker compose up -d
Nun wechseln wir in den „prosody“ Jitsi Container.
docker compose exec prosody /bin/bash
Anschließend können wir User (Konferenzleiter) mit folgendem Befehl erstellen:
Hinweis: Konferenzleiter können später dann z.B. Firmenaccounts sein, die gegen Gebühr vergeben werden können.
prosodyctl --config /config/prosody.cfg.lua register TheDesiredUsername meet.jitsi TheDesiredPassword
Um einen User wieder zu löschen, folgender Befehl:
prosodyctl --config /config/prosody.cfg.lua unregister TheDesiredUsername meet.jitsi
Und um alle User anzuzeigen:
find /config/data/meet%2ejitsi/accounts -type f -exec basename {} .dat \;
Wir verlassen den „prosody“-Container anschließend wieder mit:
exit
4. Portfreigaben und NPM:
‼️ Jitsi Meet benötigt dringend noch den UDP Port 10000 zur Freigabe! ‼️(auch in der Firewall freigeben)
Bevor es in den NPM geht muss natürlich eine entsprechende Subdomain für unseren Videokonferenzserver bei dem Provider angelegt werden (DNS Eintrag mit Verweis auf die IP des Servers):
meeting.yourdomain.com
Im NPM (Nginx Proxy Manager) legen wir eine neue Domain (Proxy Host) an, zum Beispiel: meeting.yourdomain.com

Nach innen verweisen wir hierbei auf den HTTP Port 8000 und NPM kümmert sich um das SSL Zertifikat und die Verschlüsselung nach außen hin. Mit einem Klick auf „Save“ wird das Ganze gespeichert und die Konfiguration von unserem eigenen Jitsi Meet Server nach außen hin ist abgeschlossen.
5. Optional: eigenes „Branding“
Jetzt wollen wir noch ein individuelles „Branding“ vergeben, so dass auf der Startseite unserer „meeting.yourdomain.com“-URL nicht mehr „Jitsi Meet“ sondern z.B. „IT-Service-Commander“ steht:

Dazu muss eine entsprechende Sprachdatei gepatcht werden. Das kann man im Docker-Compose Container machen:
docker-compose exec web bash
Nano-Editor installieren, da der Container diese nicht kennt:
apt-get update
apt-get install -y nano
Die Datei editieren:
nano /usr/share/jitsi-meet/lang/main-de.json
Folgenden Auszug suchen und abändern:
"headerTitle": "Jitsi Meet",
"headerSubtitle": "Sichere und hochqualitative Konferenzen",
Die Datei abspeichern und den Container neu starten:
docker-compose restart web
Wenn man es allerdings dauerhaft lösen möchte muss man wie folgt vorgehen (bessere Variante):
In dem „jitsi“ Ordner (Docker Projektordner) folgende Datei anlegen:
nano docker-compose.override.yml
Folgender Inhalt:
services:
web:
volumes:
- ./overrides/lang/main-de.json:/usr/share/jitsi-meet/lang/main-de.json:ro
Auf dem Host die Verzeichnisstruktur anlegen:
mkdir -p ./overrides/lang
Die Sprachdatei aus dem Container heraus ziehen:
docker cp jitsi-web-1:/usr/share/jitsi-meet/lang/main-de.json ./overrides/lang/main-de.json
Und die Datei auf dem Host bearbeiten (wie oben schon geschrieben die Passage mit Jitsi Meet abändern):
nano ./overrides/lang/main-de.json
Zum Schluss noch einmal alles neu starten:
docker-compose up -d --force-recreate web
Fertig, das Branding sollte jetzt weg von Jitsi Meet sein und euer eigenes Branding enthalten.
6. Fertigstellung
✅ Wir sind fertig und haben folgendes eingerichtet:
🔗 Coturn / Turnserver, um die Erreichbarkeit sicherzustellen (nicht nur interne Verbindungen, sondern auch externe)
🖥️ Jitsi Meet Server
🌐 TCP und UDP Ports in der Firewall freigegeben.
🏷️ Zugriff über eine Subdomain für unseren Jitsi Meet Server.
🔒 Im NPM Manager SSL-Zertifikate vergeben.
🎨 Optional: eigenes Branding eingerichtet.
✨ Fertig – einsatzbereiter Jitsi Meet Server!
![]() | ![]() | |
| bc1pnks6qsyumceygnw760x6dthqzngm3pt5xtpkrh3n9ydm3e8ekgms7r4azl | Lightning: itsc@strike.me | https://paypal.me/TomC777 |
![]() | ![]() | ![]() |





