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 1 added one line
At line 5 changed one line
Offizielle Anleitung: [https://jitsi.github.io/handbook/docs/devops-guide/devops-guide-quickstart]
Anleitung: [https://github.com/jitsi/jitsi-meet/blob/master/doc/quick-install.md]
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://github.com/jitsi/jitsi-meet/blob/master/doc/scalable-installation.md
At line 13 changed one line
Weitere Doku zur Architektur und Skalierung von meet.ffmuc.net:
Nach Videobridge-Installation auf jeden Fall Passwort in /etc/jitsi/videobridge/config und /etc/jitsi/jicofo/sip-communicator.properties mit prosody-server abgleichen.Falls Login fehlschlägt, mit prosodyctl zurücksetzen.
At line 15 changed 2 lines
* [https://www.slideshare.net/AnnikaWickert/freifunk-munich-how-to-scale-jitsi-231999167]
* [https://github.com/freifunkMUC/ffmuc-salt-public/tree/master/jitsi]
Bei Fehler "Could not build trust path": auth.meet.example.org.crt in jeder videobridge in ca-certificates aufnehmen
At line 18 changed one line
! Architektur
Weitere Doku: https://www.slideshare.net/AnnikaWickert/freifunk-munich-how-to-scale-jitsi-231999167
At line 20 removed 299 lines
* 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]
! Setup Signaling Node
Nginx, Prosody, certbot und gültiges Zertifikat für meet.example.org:
{{{
apt install prosody lua-event nginx
apt install certbot python3-certbot-nginx
certbot --nginx -d meet.example.org
}}}
In prosody libevent aktivieren, ansonsten ist bei 1024 connections Schluss:
In /etc/prosody/prosody.cfg.lua:
{{{
use_libevent = true
network_backend = "event"
}}}
Jicofo und Jitsi Meet Web:
{{{
curl https://download.jitsi.org/jitsi-key.gpg.key | sudo sh -c 'gpg --dearmor > /usr/share/keyrings/jitsi-keyring.gpg'
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
apt update
}}}
{{{
apt install jicofo
apt install jitsi-meet-web jitsi-meet-prosody jitsi-meet-web-config
}}}
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.
Nach der Installation von jicofo in der {{{/etc/jitsi/jicofo/config}}} folgendes setzen:
{{{
JICOFO_HOSTNAME=meet.example.org
JICOFO_AUTH_DOMAIN=auth.meet.example.org
}}}
Außerdem in der {{{/etc/jitsi/jicofo/sip-communicator.properties}}} folgendes setzen:
{{{
org.jitsi.jicofo.BRIDGE_MUC=JvbBrewery@internal.auth.meet.example.org
}}}
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;
}}}
! Setup Video Node
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:
{{{
curl https://download.jitsi.org/jitsi-key.gpg.key | sudo sh -c 'gpg --dearmor > /usr/share/keyrings/jitsi-keyring.gpg'
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
apt update
}}}
{{{
apt install jitsi-videobridge2
}}}
Nach Videobridge-Installation Passwort der JVB auf Signaling Node zurücksetzen:
{{{
prosodyctl passwd jvb@auth.meet.example.org
}}}
Dann in {{{/etc/jitsi/videobridge/config}}} und {{{/etc/jitsi/videobridge/jvb.conf}}} eintragen.
In {{{/etc/jitsi/videobridge/jvb.conf}}} folgendes hinzufügen:
{{{
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
}
}
}
}}}
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
}
}}}
Nginx installieren, gültiges Zertifikat für jvb1.meet.example.org via certbot besorgen:
{{{
apt install nginx
apt install certbot python3-certbot-nginx
certbot --nginx -d jvb1.meet.example.org
}}}
Nginx als websocket-Reverse-Proxy für jvb1.meet.example.org einrichten:
Datei {{{/etc/nginx/sites-enabled/jvb1.meet.example.org}}}:
{{{
upstream jvb {
zone upstreams 64K;
server 127.0.0.1:9090;
keepalive 2;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name jvb1.meet.example.org;
access_log off;
error_log off;
ssl_certificate /etc/letsencrypt/live/jvb1.meet.example.org/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/jvb1.meet.example.org/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
# colibri (JVB) websockets
location ~ ^/colibri-ws/default-id/(.*) {
proxy_pass http://jvb/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;
}
}
}}}
Falls gewünscht, die Statistik-APIs in {{{/etc/jitsi/videobridge/jvb.conf}}} anschalten, evtl. mit {{{host = ...}}} auf internes Interface legen:
{{{
http-servers {
private {
port = 8080
}
}
}}}
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 321 changed one line
vom Freifunk München: 20 Server für 10000 User, We can run 280 people without issue with ressources compareable with AWS c5.2xlarge. ([https://twitter.com/i/status/1253353265158332416])
vom Freifunk München: 20 Server für 10000 User, We can run 280 people without issue with ressources compareable with AWS c5.2xlarge. (https://twitter.com/i/status/1253353265158332416)
At line 323 changed one line
vom den Matrix-Machern: Roughly speaking we're seeing Jitsi serve around 1000 concurrent streams (i.e. 25x 50-user conferences) on a typical 4 core box with 8GB of RAM. However, it's worth noting that Jitsi is pretty low resource - all it's doing is forwarding streams of data around the place. All the heavy lifting is done by the clients when displaying all the concurrent videos, so it's the clients which tend to be the bottleneck. ([https://news.ycombinator.com/item?id=22804401])
vom den Matrix-Machern: Roughly speaking we're seeing Jitsi serve around 1000 concurrent streams (i.e. 25x 50-user conferences) on a typical 4 core box with 8GB of RAM. However, it's worth noting that Jitsi is pretty low resource - all it's doing is forwarding streams of data around the place. All the heavy lifting is done by the clients when displaying all the concurrent videos, so it's the clients which tend to be the bottleneck. (https://news.ycombinator.com/item?id=22804401)
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 371 changed one line
Jitsi per User/Passwort schützen, wenn nicht jeder eine Konferenz starten soll: [https://github.com/jitsi/jicofo#secure-domain]
Jitsi per User/Passwort schützen, wenn nicht jeder eine Konferenz starten soll: https://github.com/jitsi/jicofo#secure-domain
At line 375 changed one line
Dateien von {{{/usr/share/jitsi-meet}}} nicht editieren, sondern nach {{{/etc/jitsi/meet}}} kopieren, dort anpassen und via Webserver-Regeln ausliefern.
Dateien von /usr/share/jitsi-meet nicht editieren, sondern nach /etc/jitsi/meet kopieren, dort anpassen und via Webserver-Regeln ausliefern.
At line 380 changed 14 lines
{{{
<template id = "welcome-page-additional-content-template">
<div class="welcome-page-content">
<div class="welcome-footer">
<div class="welcome-footer-content">
<div class="welcome-footer-about">
<div>
<a href="https://jitsi.org/jitsi-meet/" rel="noopener" target="_blank">Powered by Jitsi Meet</a> | <a href="https://example.org/imprint" rel="noopener" target="_blank">Impressum</a> | <a href="https://example.org/privacy" rel="noopener" target="_blank">Datenschutz</a>
</div>
</div>
</div>
</div>
</div>
</template>
{{{
%%welcome-page-content
%%welcome-footer
%%welcome-footer-content
%%welcome-footer-about
[Powered by Jitsi Meet|https://jitsi.org/jitsi-meet/|rel='noopener' target='_blank'] | [Impressum|https://example.org/imprint|rel='noopener' target='_blank'] | [Datenschutz|https://example.org/privacy|rel='noopener' target='_blank']
/%
/%
/%
/%
At line 397 changed 3 lines
{{{
<style>
.welcome-page-content {
{{{ .welcome-page-content {
At line 420 changed 3 lines
}
.welcome-page-content .welcome-footer-content {
} .welcome-page-content .welcome-footer-content {
At line 427 changed 3 lines
}
.welcome-page-content .welcome-footer-about {
} .welcome-page-content .welcome-footer-about {
At line 437 changed 3 lines
}
.welcome-page-content .welcome-footer-about:last-child {
} .welcome-page-content .welcome-footer-about:last-child {
At line 441 changed 3 lines
}
</style>
}}}
}}}}
At line 446 removed 5 lines
{{{
Alias "/static/welcomePageAdditionalContent.html" "/etc/jitsi/meet/static/welcomePageAdditionalContent.html"
<Location /static/welcomePageAdditionalContent.html>
Require all granted
</Location>
At line 452 changed 2 lines
Alias "/plugin.head.html" "/etc/jitsi/meet/plugin.head.html"
<Location /plugin.head.html>
{{{ Alias "/static/welcomePageAdditionalContent.html" "/etc/jitsi/meet/static/welcomePageAdditionalContent.html"
At line 455 changed one line
</Location>
Alias "/plugin.head.html" "/etc/jitsi/meet/plugin.head.html"
Require all granted
At line 458 changed one line
Wenn die Datei {{{/usr/share/jitsi-meet/interface_config.js}}} angepasst werden soll, ebenfalls mit Kopie unter {{{/etc/jitsi/meet}}} arbeiten.
Wenn die Datei /usr/share/jitsi-meet/interface_config.js angepasst werden soll, ebenfalls mit Kopie unter /etc/jitsi/meet arbeiten.
At line 460 changed one line
Außerdem sind folgende Anpassungen in der {{{/etc/jitsi/meet/meet.example.org-config.js}}} empfohlen:
Außerdem sind folgende Anpassungen in der /etc/jitsi/meet/meet.example.org-config.js empfohlen:
At line 462 changed 5 lines
{{{
/// Sprecherdetektion aus Clientseite deaktivieren, schont CPU auf Clients
disableAudioLevels: true,
defaultLanguage: 'de',
{{{/// Nur letzte 6 Sprecher als Video anzeigen, schont CPU auf Clients und Bandbreite
channelLastN: 6,/// Sprecherdetektion aus Clientseite deaktivieren, schont CPU auf Clients
disableAudioLevels: true,defaultLanguage: 'de',
At line 469 changed 3 lines
disableThirdPartyRequests: true,
/// Auf eigene Hilfe-/Impressumsseite und Desktop-Apps während Call im Menü hinweisen
disableThirdPartyRequests: true,/// Auf eigene Hilfe-/Impressumsseite und Desktop-Apps während Call im Menü hinweisen
At line 481 removed 260 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" }
}}}
!!! Telefoneinwahl
Setup:
* Sipgate Basic: [https://www.sipgatebasic.de/]
* Asterisk aus Ubuntu-Paketquellen
* Jigasi: [https://github.com/jitsi/jigasi]
* ConferenceMapper: [https://github.com/luki-ev/conferencemapper]
Architektur
{{{
Festnetznummer
+-----------------+
| |
| Sipgate Basic +<------------------+
| | RTP |
+--------+--------+ |
^ |
|SIP |
v |
+--------+--------+ +--------v--------+
| | | |
| Asterisk +<-------->+ Jigasi |
| | SIP | |
+-----------------+ +--------+--------+
| ^
|HTTP |
v |
+--------+--------+ |
| | |
|ConferenceMapper | |Web-RTC
| | |
+-----------------+ |
^ |
|HTTP |
| v
+--------+--------+ +--------+--------+
| | | |
| Jitsi Meet +--------->+ Videobridge |
| | | |
+-----------------+ +-----------------+
}}}
Schematischer Ablauf: Eine Jitsi-Konferenz wird per Browser aufgemacht. Dabei ruft der Webclient den ConferenceMapper auf und dieser liefert eine 6-stellige Nummer zum Raumnamen. Diese wird dann auch im Jitsi-Info-Dialog nach der Einwahlnummer angezeigt. Ein weiterer Teilnehmer ruft die Sipgate-Basic-Numme an. Der Anruf kommt bei Asterisk an. Asterisk nimmt den Anruf entgegen und fragt per DTMF die "Konferenz-PIN" ab, schlägt den Raumnamen im ConferenceMapper nach, fügt dann den SIP-Header Jitsi-Conference-Room: mit dem Raumnamen hinzu und ruft bei der Jigasi-Gegenstelle an. Wenn Jigasi den Anruf entgegennimmt, stellt Asterisk die VoIP-RTP-Sprachverbindung direkt zwischen Sipgate und Jigasi her. Jigasi selbst nimmt erfährt dann via XMPP die Videobridge-Details und stellt seinerseits eine Verbindung zur Videobridge her, über die dann die Audiokommunikation läuft.
Zusammengefasst: Asterisk und der ConferenceMapper übernehmen nur Signaling-Funktionen und sind an der eigentlichen Sprachverbindung nicht beteiligt, Jigasi ist als "RTP <-> WebRTC-Proxy" Teil der Audiokette.
Die Anleitung basiert auf [https://doku.jgz-energie.net/jitsi-meet/#telefoneinwahl] und dem "Hello World"-Kapitel des deutschen Askterisk-Buchs [http://das-asterisk-buch.de/1.6/installation-einleitung.html]
!! Setup Asterisk
Ubuntu Server 20.04, Asterisk und jq (für conferenceMapper-API) installieren, default-Konfiguration löschen
{{{
apt install asterisk jq
rm /etc/asterisk/sip.conf
rm /etc/asterisk/extensions*
}}}
/etc/asterisk/sip.conf, aaaa ist Sipgate User, bbbb Sipgate Passwort, cccc ist Jigasi-SIP-Passwort, d.d.d.d ist die öffentliche IP-Adresse des Jigasi-Servers.
{{{
[general]
port=5060
bindaddr=0.0.0.0
language=de
deny=0.0.0.0/0.0.0.0
permit=d.d.d.d/255.255.255.255
allowguest=no
register => aaaa:bbbb@sipgate.de/aaaa
[ext-sip-account]
type=friend
context=von-voip-provider
username=aaaa
fromuser=aaaa
secret=bbbb
host=sipgate.de
fromdomain=sipgate.de
qualify=yes
insecure=port,invite
nat=yes
disallow=all
allow=alaw
[2000]
type=friend
context=meine-telefone
secret=cccc
host=dynamic
disallow=all
allow=alaw
}}}
extensions.conf, aaaa ist Sipgate User, https://meet.example.org/conferenceMapper ist die Adresse des ConferenceMappers (siehe unten).
{{{
[default]
exten => s,1,Hangup()
[von-voip-provider]
exten => aaaa,1,Answer()
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,SIPAddHeader(Jitsi-Conference-Room:${CURL_RESULT})
same => n,Dial(SIP/2000,5)
same => n,Log(NOTICE, Contacting Jigasi... Status is ${DIALSTATUS} );
same => n,GotoIf($["${DIALSTATUS}" = "BUSY"]?error)
same => n,GotoIf($["${DIALSTATUS}" = "NOANSWER"]?conf-busy)
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,Hangup()
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()
same => n(conf-busy),Playback(confbridge-begin-leader)
same => n,Log(NOTICE, waiting 120 sec for conference with pin ${confid} to start);
same => n,Dial(SIP/2000,120)
}}}
Asterisk neustarten um Konfiguration vollständig anzuwenden:
{{{
systemctl restart asterisk
}}}
!! Deutsche Sprachdateien nachinstallieren
In den Ubuntu-Paketquellen gibt es keine deutschen Asterisk-Sprachdateien, aber [https://www.asterisksounds.org] stellt deutsche Sprachdateien bereit.
Installation:
{{{
mkdir /usr/share/asterisk/sounds/de
cd /usr/share/asterisk/sounds/de
wget -O core.zip https://www.asterisksounds.org/de/download/asterisk-sounds-core-de-sln16.zip
wget -O extra.zip https://www.asterisksounds.org/de/download/asterisk-sounds-extra-de-sln16.zip
unzip core.zip
unzip extra.zip
chown -R asterisk:asterisk /usr/share/asterisk/sounds/de
}}}
!! Setup Jigasi
Jigasi installieren
{{{
apt install jigasi
}}}
Bei der Installation wird nach Jigasi-SIP-User und Passwort gefragt.
Jigasi-SIP-User ist 2000@<IP-Asterisk>
Jigasi-Passwort cccc aus Asterisk-Konfiguration oben
In der Jigasi-Konfiguration {{{/etc/jitsi/jigasi/sip-communicator.properties}}} auf jeden Fall das Packet-Logging deaktivieren:
{{{
net.java.sip.communicator.packetlogging.PACKET_LOGGING_ENABLED=false
}}}
Außerdem für Prosody-Self-Signed-Zertifikate ALWAYS_TRUST_MODE_ENABLED aktivieren:
{{{
net.java.sip.communicator.service.gui.ALWAYS_TRUST_MODE_ENABLED=true
}}}
Die Standard-Konfiguration von Jigasi geht davon aus, dass der Jitsi-Prosody auf dem selben Host installiert ist. Wenn das Im Cluster-Setup nicht so ist, dann:
in {{{/etc/jitsi/jigasi/config}}} JIGASI_HOSTNAME und JIGASI_HOST auf den Prosody-Host setzen. In {{{/etc/jitsi/jigasi/sip-communicator.properties}}} die org.jitsi.jigasi.xmpp.acc.SERVER_ADDRESS auf den Prosody-Host setzen.
Mit der obenstehenden Asterisk-Konfiguration ist nur ein Call-In in eine Konferenz möglich, kein Call-Out. Um Call-Out von Jitsi auch in der Jitsi-Meet-UI zu deaktivieren, folgende Anpassung in der {{{/etc/jitsi/jigasi/config}}}:
{{{
JIGASI_OPTS="--nocomponent=true"
}}}
!! Setup ConferenceMapper
ConferenceMapper von {{{https://github.com/luki-ev/conferencemapper}}} installieren und konfigurieren.
Die resultierende URL dann noch in der Asterisk-Konfiguration {{{/etc/asterisk/extentions.conf}}} hinterlegen.
Eine statische Datei mit den Einwahlnummern unter {{{https://meet.example.com/numbers.json}}} via apache-vhost verfügbar machen:
{{{
Alias "/numbers.json" "/etc/jitsi/meet/numbers.json"
<Location /numbers.json>
Require all granted
</Location>
}}}
Inhalt von /etc/jitsi/meet/numbers.json, FFFF/FFFF durch Sipgate Basic-Festnetznummer ersetzen:
{{{
{"message":"Einwahlnummern","numbers":{"DE":["FFFF/FFFF"]},"numbersEnabled":true}
}}}
!! Setup Jitsi-Meet
Audio-Konfiguration in Jitsi-Meet config.js aktivieren:
{{{
dialInNumbersUrl: 'https://meet.example.org/numbers.json',
dialInConfCodeUrl: 'https://meet.example.org/conferenceMapper',
}}}
!! Troubleshooting und Stolperfallen
Ton von Asterisk kommt noch, aber kein Ton mehr nach Join der Konferenz, mögliche Ursachen
* Jigasi meldet sich nicht mit öffentlicher IP an Asterisk an, deswegen kann keine direkte Verbindung von Sipgate zu Jigasi aufgebaut werden.
* 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
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.)