This page (revision-76) was last changed on 19-Mar-2022 23:42 by Christoph S.

This page was created on 25-Apr-2020 22:51 by Christoph S.

Only authorized users are allowed to rename pages.

Only authorized users are allowed to delete pages.

Page revision history

Version Date Modified Size Author Changes ... Change note
76 19-Mar-2022 23:42 26 KB Christoph S. to previous
75 22-Apr-2021 12:50 26 KB jitsi_meet to previous | to last
74 25-Jan-2021 23:20 26 KB Christoph S. to previous | to last
73 25-Jan-2021 23:20 26 KB Christoph S. to previous | to last
72 25-Jan-2021 23:13 26 KB Christoph S. to previous | to last
71 19-Jan-2021 00:23 26 KB Christoph S. to previous | to last
70 18-Jan-2021 22:51 25 KB Christoph S. to previous | to last
69 08-Jan-2021 13:36 24 KB Christoph S. to previous | to last
68 08-Jan-2021 13:36 24 KB Christoph S. to previous | to last
67 08-Jan-2021 13:30 23 KB Christoph S. to previous | to last
66 08-Jan-2021 13:24 23 KB Christoph S. to previous | to last
65 07-Jan-2021 07:26 22 KB Christoph S. to previous | to last
64 07-Jan-2021 07:20 22 KB Christoph S. to previous | to last
63 06-Jan-2021 19:34 22 KB Christoph S. to previous | to last
62 06-Jan-2021 19:19 21 KB Christoph S. to previous | to last
61 30-Dec-2020 17:10 21 KB Christoph S. to previous | to last

Page References

Incoming links Outgoing links

Version management

Difference between version and

At line 5 changed one line
Offizielle Anleitung: [https://jitsi.github.io/handbook/docs/devops-guide/devops-guide-quickstart]
Anleitung: [https://jitsi.github.io/handbook/docs/devops-guide/devops-guide-quickstart]
At line 7 removed 2 lines
Weitere Anleitung inkl. Telefoneinwahl: [https://doku.jgz-energie.net/jitsi-meet/]
At line 11 changed one line
Offizielle Anleitung: [https://jitsi.github.io/handbook/docs/devops-guide/devops-guide-scalable]
Anleitung: [https://jitsi.github.io/handbook/docs/devops-guide/devops-guide-scalable]
At line 13 changed one line
Weitere Doku zur Architektur und Skalierung von meet.ffmuc.net:
Architektur: 1x Signaling Node mit prosody, jicofo, nginx, jitsi-meet-web
Nx Video Node mit jitsi-videobridge2 (und optional jigasi)
At line 15 removed 13 lines
* [https://www.slideshare.net/AnnikaWickert/freifunk-munich-how-to-scale-jitsi-231999167]
* [https://github.com/freifunkMUC/ffmuc-salt-public/tree/master/jitsi]
! Architektur
* 1-mal Signaling Node mit prosody, jicofo, nginx, jitsi-meet-web: 1 core, 2GB RAM ausreichend
* 1-mal SIP Node mit asterisk: Minimale Konfiguration, also 1 core, 500MB RAM ausreichend
* N-mal Video Node mit jitsi-videobridge2 (und optional jigasi): 4-8 cores, 8GB RAM, 1GBit/s Netzwerk, dedizierte Hardware (zB. IONOS L-16 HDD, Hetzner AX41 oder vergleichbares)
Übersicht der vollständigen Architektur von {{{jitsi.luki.org}}} als Beispiel:
[jitsi-architecture.png]
At line 30 changed one line
Nginx, Prosody, certbot und gültiges Zertifikat für meet.example.org:
Nginx, Prosody, certbot + gültiges Zertifikat für meet.example.org
At line 33 changed one line
apt install prosody lua-event nginx
apt install prosody nginx
add-apt-repository ppa:certbot/certbot
At line 35 changed one line
certbot --nginx -d meet.example.org
certbot --nginx
At line 38 removed 3 lines
In prosody libevent aktivieren, ansonsten ist bei 1024 connections Schluss:
In /etc/prosody/prosody.cfg.lua:
At line 42 removed 8 lines
use_libevent = true
network_backend = "event"
}}}
Jicofo und Jitsi Meet Web:
{{{
At line 51 changed one line
echo 'deb [signed-by=/usr/share/keyrings/jitsi-keyring.gpg] https://download.jitsi.org stable/' | sudo tee /etc/apt/sources.list.d/jitsi-stable.list > /dev/null
echo 'deb [[signed-by=/usr/share/keyrings/jitsi-keyring.gpg] https://download.jitsi.org stable/' | sudo tee /etc/apt/sources.list.d/jitsi-stable.list > /dev/null
At line 60 changed one line
Bei der Installation von {{{jitsi-meet-prosody}}} wird ein Videobridge-Passwort abgefragt. Dieses kann zufällig gesetzt werden, es wird später bei der Installation des ersten Video Nodes mit {{{prosodyctl}}} überschrieben.
Bei der Installation von {{{jitsi-meet-prosody}}} wird ein Videobridge-Passwort abgefragt. Hier ein sicheres Passwort erstellen und dann später beim Setup der Video Nodes verwenden.
At line 62 changed one line
Nach der Installation von jicofo in der {{{/etc/jitsi/jicofo/config}}} folgendes setzen:
Nach der Installation von jicofo kontrollieren, dass in der {{{/etc/jitsi/jicofo/config}}} folgendes gesetzt ist:
At line 41 added one line
JICOFO_HOST=localhost
At line 44 added one line
JICOFO_AUTH_USER=focus
At line 69 changed one line
Außerdem in der {{{/etc/jitsi/jicofo/sip-communicator.properties}}} folgendes setzen:
Außerdem kontrollieren, dass in der {{{/etc/jitsi/jicofo/sip-communicator.properties}}} folgendes gesetzt ist:
At line 74 removed 42 lines
RAM-Einstellungen für jicofo. In {{{/etc/jitsi/jicofo/config}}} folgendes am Anfang der JAVA_SYS_PROPS ergänzen setzen, hier 1GB:
{{{
JAVA_SYS_PROPS="-Xms1g -Xmx1g ...
}}}
WebSocket-Verbindung von Clients zu Prosody für XMPP ermöglichen:
In {{{/etc/prosody/conf.avail/meet.example.org.cfg.lua}}} folgendes global ergänzen:
{{{
consider_websocket_secure = true;
cross_domain_websocket = true;
}}}
Außerdem in {{{/etc/prosody/conf.avail/meet.example.org.cfg.lua}}} im existiereden Abschnitt {{{VirtualHost "meet.example.org"}}} die {{{modules_enabled}}} um {{{"websocket";}}} ergänzen:
{{{
VirtualHost "meet.example.org"
modules_enabled = {
"bosh";
"pubsub";
"ping"; -- Enable mod_ping
"speakerstats";
"turncredentials";
"conference_duration";
"websocket"; -- Neu für XMPP von Clients zu Prosody
}
}}}
Danach prosody neustarten und in der {{{/etc/jitsi/meet/meet.example.org-config.js}}} für die Clients bekanntmachen, indem die websocket:-Zeile einkommentiert wird:
{{{
// Websocket URL
websocket: 'wss://meet.example.org/xmpp-websocket',
}}}
wasm im nginx als mime-type bekannt machen, damit der Fehler "TypeError: Failed to execute 'compile' on 'WebAssembly'" behoben wird. Dazu in der {{{/etc/nginx/mime.types}}} Folgendes ergänzen:
{{{
application/wasm wasm;
}}}
At line 118 removed 4 lines
Der oder die Video Node(s) sollten dedizierte Server mit dedizierten Netzwerkkarten sein, damit der Netzwerktraffic (Packets / Sekunde) auch bewältigt werden.
Installation der Software:
At line 124 changed one line
echo 'deb [signed-by=/usr/share/keyrings/jitsi-keyring.gpg] https://download.jitsi.org stable/' | sudo tee /etc/apt/sources.list.d/jitsi-stable.list > /dev/null
echo 'deb [[signed-by=/usr/share/keyrings/jitsi-keyring.gpg] https://download.jitsi.org stable/' | sudo tee /etc/apt/sources.list.d/jitsi-stable.list > /dev/null
At line 132 changed one line
Nach Videobridge-Installation Passwort der JVB auf Signaling Node zurücksetzen:
Nach Videobridge-Installation auf jeden Fall Passwort in {{{/etc/jitsi/videobridge/config}}} und {{{/etc/jitsi/jicofo/sip-communicator.properties}}} mit prosody auf Signaling Node abgleichen. Falls Login fehlschlägt, mit {{{prosodyctl}}} auf Signaling Node zurücksetzen.
At line 134 changed 3 lines
{{{
prosodyctl passwd jvb@auth.meet.example.org
}}}
Bei Fehler "Could not build trust path": {{{auth.meet.example.org.crt}}} in jeder videobridge als {{{.crt}}} in {{{/usr/local/share/ca-certificates}}} aufnehmen und {{{update-ca-certificates}}} ausführen.
At line 138 changed one line
Dann in {{{/etc/jitsi/videobridge/config}}} und {{{/etc/jitsi/videobridge/jvb.conf}}} eintragen.
Setup von websocket als datachannel
At line 140 changed 2 lines
In {{{/etc/jitsi/videobridge/jvb.conf}}} folgendes hinzufügen:
In {{{/etc/jitsi/videobridge/sip-communicator.properties}}} folgendes hinzufügen:
At line 143 changed 20 lines
videobridge {
apis {
xmpp-client {
configs {
connection-id {
hostname = "meet.example.org"
domain = "auth.meet.example.org"
username = "jvb"
password = "...."
muc_jids = "JvbBrewery@internal.auth.meet.example.org"
muc_nickname = "..."
disable_certificate_verification = true
}
}
}
rest {
enabled = true
}
}
}
# datachannel
org.jitsi.videobridge.rest.jetty.port=9090
org.jitsi.videobridge.rest.jetty.host=localhost
org.jitsi.videobridge.rest.COLIBRI_WS_TLS=true
org.jitsi.videobridge.rest.COLIBRI_WS_DOMAIN=jvb1.meet.example.org:443
At line 165 removed 21 lines
RAM-Einstellungen für videobridge. In {{{/etc/jitsi/videobridge/config}}} folgendes setzen, hier 8GB:
{{{
VIDEOBRIDGE_MAX_MEMORY="8g -Xms8g"
}}}
Setup von websocket als Bridge channel:
In {{{/etc/jitsi/videobridge/jvb.conf}}} folgendes hinzufügen:
{{{
http-servers {
public {
port = 9090
}
}
websockets {
enabled = true
domain = "jvb1.meet.example.org:443"
tls = true
}
}}}
At line 83 added one line
add-apt-repository ppa:certbot/certbot
At line 191 changed one line
certbot --nginx -d jvb1.meet.example.org
certbot --nginx
At line 198 removed 5 lines
upstream jvb {
zone upstreams 64K;
server 127.0.0.1:9090;
keepalive 2;
}
At line 208 removed 3 lines
access_log off;
error_log off;
At line 218 changed one line
proxy_pass http://jvb/colibri-ws/default-id/$1$is_args$args;
proxy_pass http://127.0.0.1:9090/colibri-ws/default-id/$1$is_args$args;
At line 227 removed one line
Falls gewünscht, die Statistik-APIs in {{{/etc/jitsi/videobridge/jvb.conf}}} anschalten, evtl. mit {{{host = ...}}} auf internes Interface legen:
At line 229 changed 7 lines
{{{
http-servers {
private {
port = 8080
}
}
}}}
Weitere Doku zur Architektur und Skalierung von meet.ffmuc.net: [https://www.slideshare.net/AnnikaWickert/freifunk-munich-how-to-scale-jitsi-231999167]
At line 237 removed 82 lines
Da auf den Video Nodes nur vertrauenswürdiger Code läuft, können die Spectre & Meltdown-Mitigations abgeschaltet werden. Dies verbessert die context-switching-Performance, siehe [https://www.phoronix.com/scan.php?page=article&item=3-years-specmelt&num=1].
Daher in der {{{/etc/default/grub}}} (oder bei Hetzner in der {{{/etc/default/grub.d/hetzner.cfg}}}) Folgendes zu {{{GRUB_CMDLINE_LINUX_DEFAULT}}} hinzufügen:
{{{
mitigations=off
}}}
Danach mit {{{sudo update-grub}}} aktivieren und den Server neu starten. Dann mit {{{lscpu}}} nachsehen, ob die Einstellung greift. Wenn bei den Vulnerabilties "Vulnerable" steht, dann ist alles in Ordnung:
{{{
Vulnerability Itlb multihit: KVM: Vulnerable
Vulnerability L1tf: Mitigation; PTE Inversion; VMX vulnerable
Vulnerability Mds: Vulnerable; SMT vulnerable
Vulnerability Meltdown: Vulnerable
Vulnerability Spec store bypass: Vulnerable
Vulnerability Spectre v1: Vulnerable: __user pointer sanitization and usercopy barriers only; no swapgs barriers
Vulnerability Spectre v2: Vulnerable, IBPB: disabled, STIBP: disabled
Vulnerability Srbds: Vulnerable
Vulnerability Tsx async abort: Vulnerable
}}}
Außerdem laufen die Videokonferenzen zuverlässiger, wenn die CPUs nicht hoch- und runtertakten. Dazu auf den CPU-Governor "performance" umstellen:
{{{
systemctl disable ondemand.service
apt install cpufrequtils
}}}
In der {{{/etc/default/cpufrequtils}}} Folgendes einstellen:
{{{
ENABLE="true"
GOVERNOR="performance"
}}}
Danach reboot und mittels {{{cpufreq-info}}} überprüfen:
{{{
cpufreq-info
...
The governor "performance" may decide which speed to use
...
}}}
! Logging deaktivieren
Jicofo {{{/etc/jitsi/jicofo/logging.properties}}}: top-Level auf OFF, alle anderen level auskommentieren:
{{{
.level=OFF
#net.sf.level=SEVERE
#net.java.sip.communicator.plugin.reconnectplugin.level=FINE
#org.ice4j.level=SEVERE
#org.jitsi.impl.neomedia.level=SEVERE
}}}
Prosody {{{/etc/prosody/prosody.cfg.lua}}}:
{{{
log = {
-- Log files (change 'info' to 'debug' for debug logs):
--info = "/var/log/prosody/prosody.log";
error = "/var/log/prosody/prosody.err";
-- Syslog:
--{ levels = { "error" }; to = "syslog"; };
}
}}}
Videobridge {{{/etc/jitsi/videobridge/logging.properties}}}: top-Level auf OFF, alle anderen level auskommentieren:
{{{
.level=OFF
#org.jitsi.videobridge.xmpp.ComponentImpl.level=FINE
# All of the INFO level logs from MediaStreamImpl are unnecessary in the context of jitsi-videobridge.
#org.jitsi.impl.neomedia.MediaStreamImpl.level=WARNING
}}}
Nginx: In allen vhosts:
{{{
access_log off;
}}}
At line 325 removed 4 lines
Aus den Jitsi-Community-Foren: [https://community.jitsi.org/t/maximum-number-of-participants-on-a-meeting-on-meet-jit-si-server/22273/47]
Tuning-Tipps auf Server- und Client-Seite: [https://community.jitsi.org/t/maximum-number-of-participants-on-a-meeting-on-meet-jit-si-server/22273/80]
At line 334 removed one line
* 40 User: 16% CPU-Auslasting für [PX61-NVMe|https://www.hetzner.com/de/news/dedicated-root-server-mit-dem-standard-der-zukunft/] (Xeon(R) CPU E3-1275 v5 @ 3.60GHz), 80MBit/s eingehend, 30 MBit/s ausgehend
At line 336 removed 33 lines
Der "Stress-Level" eine einheitenlose Kennzahl, standardmäßig auf 50000pps (eingehend+ausgehend) normiert. Als Beispiel: Wenn die Video-Node 10000pps eingehend und 10000pps ausgehend hat, dann ergibt das 20000pps / 50000pps = 0.4, also einen "Stress-Level" von 0.4 oder 40%.
Kalibrierung des Stress-Berechnung an vorhandene Hardware. Dazu einmal eine "große" Konferenz, zB mit 15 Personen starten, dabei die Paket-Rate (pps) und CPU-Auslastung erfassen.
Als Beispiel: 25000pps auf 8-Core Intel(R) Xeon(R) CPU E3-1275 v5 @ 3.60GHz führten zu 16% CPU-Auslastung. Annahme: Bis zu 80% CPU ist ok, dann heißt das geschätzt 80%/16% = 5 * 25000pps = 125000pps als Lastgrenze:
In {{{/etc/jitsi/videobridge/jvb.conf}}} das Ergebnis eintragen:
{{{
load-management {
# Whether or not the reducer will be enabled to take actions to mitigate load
reducer-enabled = true
load-measurements {
packet-rate {
# 25000 pps produced 16% CPU utilization => load threshold at 80% CPU => 125000 pps
load-threshold = 125000
# 80% load-threshold
recovery-threshold = 100000
}
}
load-reducers {
last-n {
reduction-scale = .75
recover-scale = 1.25
impact-time = 1 minute
minimum-last-n-value = 0
maximum-enforced-last-n-value = 40
}
}
}
}}}
At line 222 added 3 lines
/// Nur letzte 6 Sprecher als Video anzeigen, schont CPU auf Clients und Bandbreite
channelLastN: 6,
At line 482 removed 34 lines
!!! Hardening
Nginx-Konfiguration auf sicheren und schnellen Stand bringen: TLSv1.3 aktivieren, HTTP2 aktivieren,Cipher auf "ECDHE+AESGCM:ECDHE+CHACHA20" beschränken:
{{{
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name jitsi.luki.org;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers "ECDHE+AESGCM:ECDHE+CHACHA20";
}
}}}
Jicofo REST-API in {{{/etc/jitsi/jicofo/sip-communicator.properties}}} auf localhost beschränken:
{{{
org.jitsi.jicofo.auth.jetty.host=localhost
}}}
Jigasi REST-API in {{{/etc/jitsi/jigasi/sip-communicator.properties}}} auf localhost beschränken:
{{{
org.jitsi.jigasi.rest.jetty.host=localhost
}}}
Prosody auf lokale Netzwerke in der {{{/etc/prosody/prosody.cfg.lua}}} beschränken:
{{{
interfaces = { "127.0.0.1", "10.0.0.2" }
}}}
At line 568 changed one line
Ubuntu Server 20.04, Asterisk und jq (für conferenceMapper-API) installieren, default-Konfiguration löschen
Ubuntu Server 20.04, Asterisk installieren, default-Konfiguration löschen
At line 571 changed one line
apt install asterisk jq
apt install asterisk
At line 611 changed one line
extensions.conf, aaaa ist Sipgate User, https://meet.example.org/conferenceMapper ist die Adresse des ConferenceMappers (siehe unten).
extensions.conf, aaaa ist Sipgate User, https://meet.example.org/conferenceMapper ist die Adresse des ConferenceMappers (siehe unten)
At line 614 removed one line
exten => s,1,Hangup()
At line 618 changed 5 lines
same => n,Read(confid,hello&conf-getpin&astcc-followed-by-pound)
same => n,Log(NOTICE, query conferenceMapper for pin ${confid});
same => n,Set(CURL_RESULT=${SHELL(curl --silent https://meet.example.org/conferenceMapper?id=${confid} | jq -r .conference)})
same => n,Log(NOTICE, conferenceMapper result is ${CURL_RESULT});
same => n,GotoIf($[ ${CURL_RESULT} = false]?conf-unknown)
same => n,Read(confid,conf-getpin&astcc-followed-by-pound)
same => n,Set(CURL_RESULT=${SHELL(curl --silent https://meet.example.org/conferenceMapper?id=${confid} | sed -e 's/.*"conference":"\(.*\)@.*/\1/')})
same => n,Verbose(0, ${CURL_RESULT});
At line 624 changed 3 lines
same => n,Dial(SIP/2000,5)
same => n,Log(NOTICE, Contacting Jigasi... Status is ${DIALSTATUS} );
same => n,GotoIf($["${DIALSTATUS}" = "BUSY"]?error)
same => n,Set(CDR(userfield)=Jitsi:${CURL_RESULT})
same => n,Dial(SIP/2000,3)
same => n,Verbose(0, Contacting Jigasi... Status is ${DIALSTATUS} );
same => n,GotoIf($["${DIALSTATUS}" = "BUSY"]?unknown)
At line 628 changed 6 lines
same => n,GotoIf($["${DIALSTATUS}" = "CANCEL"]?error)
same => n,GotoIf($["${DIALSTATUS}" = "CONGESTION"]?error)
same => n,GotoIf($["${DIALSTATUS}" = "CHANUNAVAIL"]?error)
same => n,GotoIf($["${DIALSTATUS}" = "DONTCALL"]?error)
same => n,GotoIf($["${DIALSTATUS}" = "TORTURE"]?error)
same => n,GotoIf($["${DIALSTATUS}" = "INVALIDARGS"]?error)
same => n,GotoIf($["${DIALSTATUS}" = "CANCEL"]?unknown)
same => n,GotoIf($["${DIALSTATUS}" = "CONGESTION"]?unknown)
same => n,GotoIf($["${DIALSTATUS}" = "CHANUNAVAIL"]?unknown)
same => n,GotoIf($["${DIALSTATUS}" = "DONTCALL"]?unknown)
same => n,GotoIf($["${DIALSTATUS}" = "TORTURE"]?unknown)
same => n,GotoIf($["${DIALSTATUS}" = "INVALIDARGS"]?unknown)
At line 635 removed 6 lines
same => n(conf-unknown),Playback(conf-invalid)
same => n,Log(ERROR, conferenceMapper did not find a conference for pin ${confid});
same => n,Hangup()
same => n(error),Playback(an-error-has-occured&pls-try-call-later)
same => n,Log(ERROR, joining conference ${confid}, status is ${DIALSTATUS});
same => n,Hangup()
At line 642 removed one line
same => n,Log(NOTICE, waiting 120 sec for conference with pin ${confid} to start);
At line 648 changed one line
systemctl restart asterisk
system restart asterisk
At line 657 changed 2 lines
mkdir /usr/share/asterisk/sounds/de
cd /usr/share/asterisk/sounds/de
mkdir /var/lib/asterisk/sounds/de
cd /var/lib/asterisk/sounds/de
At line 663 changed one line
chown -R asterisk:asterisk /usr/share/asterisk/sounds/de
chown -R asterisk.asterisk /var/lib/asterisk/sounds/de
find /var/lib/asterisk/sounds/de -type d -exec chmod 0775 {} \;
At line 715 changed one line
{"message":"Einwahlnummern","numbers":{"DE":["FFFF/FFFF"]},"numbersEnabled":true}
{"message":"Einwahlnummbern","numbers":{"DE":["FFFF/FFFF"]},"numbersEnabled":true}
At line 731 changed 2 lines
* Codecs von jigasi und codecs von initialer DTMF/Menü-Übertragung stimmen nicht über ein -> Asterisk, sip.conf: disallow=all, allow=alaw sowohl bei Sipgate-Abschnitt als auch bei Jigasi-Abschnitt
* HD-Telefonie (G.722) funktioniert nicht reibungslos mit Jigasi, daher auch -> Asterisk, sip.conf: disallow=all, allow=alaw sowohl bei Sipgate-Abschnitt als auch bei Jigasi-Abschnitt
* Codecs von jigasi und codecs von initialer DTMF-Übertragung stimmen nicht über ein -> Asterisk, sip.conf: disallow=all, allow=alaw sowohl bei Sipgate-Abschnitt als auch bei Jigasi-Abschnitt
At line 734 changed 7 lines
Asterisk-Konfiguration wird nur nach Neustart von Asterisk vollständig übernommen. Daher gerade bei Fehlersuche und Konfigurationsänderungen immer asterisk mit {{{systemctl restart asterisk}}} komplett neustarten! Das in manchen Dokumentationen genannte {{{asterisk -rx 'core reload'}}} reicht nicht.
!!! Sonstiges
Jitsi on ARM: [https://github.com/jitsi/jitsi-meet/issues/6449]
Frage: Kann Asterisk auch gleichzeitig für ausgehende Telefonate (dial out, call out) konfiguriert werden, so dass man die Telefoneinladung von Jitsi Meet nutzen kann? Was müsste man dann noch in der Konfiguration ergänzen? (Bitte entschuldigen Sie diesen Eintrag hier, ich konnte keine andere Möglichkeit finden diese Frage sonst zu stellen.)
Asterisk-Konfiguration wird nur nach Neustart von Asterisk vollständig übernommen. Daher gerade bei Fehlersuche und Konfigurationsänderungen immer askterisk komplett neustarten! Das in manchen Dokumentationen genannte {{{asterisk -rx 'core reload'}}} reicht nicht.