Nextcloud/Talk/HPB: Unterschied zwischen den Versionen
Keine Bearbeitungszusammenfassung |
Keine Bearbeitungszusammenfassung |
||
Zeile 110: | Zeile 110: | ||
make build | make build | ||
== Konfiguration == | |||
Eine beispielhafte Konfigurationsdatei findet sich in /usr/src/nextcloud-spreed-signaling als '''server.conf.in''' | Eine beispielhafte Konfigurationsdatei findet sich in /usr/src/nextcloud-spreed-signaling als '''server.conf.in''' |
Version vom 6. Januar 2021, 16:19 Uhr
Komponenten des Signaling-Servers
Der Signaling-Server besteht aus den folgenden Komponenten / Diensten:
- dem Nextcloud Talk signaling server Signaling
- dem Janus WebRTC gateway Janus
- und dem NATS messaging server NATS
Vorbereitungen
Für die jeweiligen Komponenten werden Schlüssel (keys) benötigt, die im Vorfeld wie folgt erzeugt werden können:
- der <api-Key> für Janus:
openssl rand -base64 16
- ein Hash-Key:
openssl rand -hex 16
- ein Block-Key:
openssl rand -hex 16
- ein Secret Key für die Nextcloud
openssl rand -hex 16
- der Schlüssel für den TURN-Server ist in den Talk-Einstellungen der Nextcloud zu finden (https://cloud.itw-berlin.net/settings/admin/talk)
Die Adressen der benötigten Server:
- Nextcloud-Server : cloud.itw-berlin.net
- TURN-Server : cloud.itw-berlin.net:5349
- Signaling Server : signaling.foxtom.de
Installation der Komponenten / Dienste
Janus
Janus kann über die Paketverwaltung installiert werden:
apt install janus
Die anzupassenden Konfigurationsdateien finden sich im Verzeichnis /etc/janus. Von Bedeutung sind die Dateien:
- janus.jcfg
- janus.transport.http.jcfg
- und janus.transport.websockets.jcfg
In der Datei janus.jcfg müssen folgende Einstellungen angepasst werden:
... stun_server = "cloud.itw-berlin.net" stun_port = 5349 ... full_trickle = true ... turn_server = "cloud.itw-berlin.net" turn_port = 5349 ... turn_rest_api_key = "<api-Key>" ...
Um den Janus-Server so zu konfigurieren, daß er nur lokal angesprochen werden kann, werden die Dateien janus.transport.http.jcfg & janus.transport.websockets.jcfg wie folgt modifiziert:
janus.transport.http.jcfg:
... interface = "lo" ...
janus.transport.websockets.jcfg:
... ws_interface = "lo" ...
NATS
NATS kann durch das Hinzufügen der entsprechenden Quelle:
sudo curl -sL -o /etc/apt/trusted.gpg.d/morph027-nats-server.asc https://packaging.gitlab.io/nats-server/gpg.key echo "deb https://packaging.gitlab.io/nats-server nats main" | sudo tee /etc/apt/sources.list.d/morph027-nats-server.list
direkt im Anschluß über die Paketverwaltung installiert werden:
sudo apt update sudo apt install -y nats-server
Die Konfigurationsdatei nats.conf wird im Verzeichnis /etc/nats angelegt und enthält nur die Zeile "listen: 127.0.0.1:4222":
sudo install -d -o nats -g nats /etc/nats sudo -u nats echo "listen: 127.0.0.1:4222" > /etc/nats/nats.conf
Signaling Server
Zur Installation des Servers wird das Paket golang-go benötigt, welches über die Paketverwaltung installiert werden kann:
apt install golang-go
Die benötigten Quellpakete werden über GitHub bezogen und hier im Verzeichnis /usr/src abgelegt:
cd /usr/src git clone https://github.com/strukturag/nextcloud-spreed-signaling.git cd /usr/src/nextcloud-spreed-signaling
Der anschließende Befehl make build erstellt das Programm bin/signaling
make build
Konfiguration
Eine beispielhafte Konfigurationsdatei findet sich in /usr/src/nextcloud-spreed-signaling als server.conf.in
Diese Datei wird nach /etc/signaling/server.conf kopiert:
mkdir -p /etc/signaling cd /usr/src/nextcloud-spreed-signaling cp server.conf.in /etc/signaling/server.conf
Um den Signaling-Server als Systemdienst installieren zu können, wird ein Benutzer und eine Gruppe angelegt:
groupadd signaling useradd --system --gid signaling --shell /usr/sbin/nologin --comment "Standalone signaling server for Nextcloud Talk." signaling
und die Berechtigungen angepasst:
chmod 600 /etc/signaling/server.conf chown signaling: /etc/signaling/server.conf
Entsprechend den lokalen Begebenheiten wir diese Datei wie folgt editiert:
listen = 127.0.0.1:8080 ... [sessions] hashkey = <Hash-Key> ... blockkey = <Block-Key> ... [backend] backends = backend1 [backend1] url = https://cloud.itw-berlin.net ... secret = <Nextcloud Secret Key> ... [nats] url = nats://localhost:4222 ... [mcu] type = janus ... url = ws://127.0.0.1:8188 ... [turn] apikey = <api-key> secret = <TURN-Server-Key> servers = turn:cloud.itw-berlin.net:5349?transport=udp,turn:cloud.itw-berlin.net:5349?transport=tcp ...
Starten des Signaling-Servers
Für einen ersten Test muß der Janus-Server bereits laufen:
sudo systemctl start janus
sudo systemctl status janus ● janus.service - Janus WebRTC gateway Loaded: loaded (/lib/systemd/system/janus.service; enabled; vendor preset: enabled) Active: active (running) since Wed 2021-01-06 15:07:00 CET; 15s ago Docs: https://janus.conf.meetecho.com/docs/index.html Main PID: 9851 (janus) Tasks: 24 (limit: 2296) Memory: 9.1M CGroup: /system.slice/janus.service └─9851 /usr/bin/janus -o Jan 06 15:07:01 signaling janus[9851]: [ERR] [config.c:janus_config_parse:191] -- Error reading configuration file 'janus.transport.rabbitmq.cfg'... error 2 (No such file or directory) Jan 06 15:07:01 signaling janus[9851]: RabbitMQ SSL support disabled Jan 06 15:07:01 signaling janus[9851]: [WARN] RabbitMQ support disabled (Janus API) Jan 06 15:07:01 signaling janus[9851]: [WARN] RabbitMQ support disabled (Admin API) Jan 06 15:07:01 signaling janus[9851]: [WARN] RabbitMQ support disabled for both Janus and Admin API, giving up Jan 06 15:07:01 signaling janus[9851]: [WARN] The 'janus.transport.rabbitmq' plugin could not be initialized Jan 06 15:07:01 signaling janus[9851]: [WARN] libnice version outdated: 0.1.14 installed, at least 0.1.15 recommended Jan 06 15:07:01 signaling janus[9851]: HTTP transport timer started Jan 06 15:07:09 signaling janus[9851]: Creating new session: 5197647642285633; 0x7efe24004830 Jan 06 15:07:09 signaling janus[9851]: Creating new handle in session 5197647642285633: 2088316009596726; 0x7efe24004830 0x7efe24001be0
Direktes Starten des Signaling-Servers im Vordergrund:
sudo /usr/src/nextcloud-spreed-signaling/bin/signaling --config /etc/signaling/server.conf 2021-01-06 15:11:51.109402 I | main.go:130: Starting up version 64cccab641874b3e688c1eb9029b5bb9215741e5/go1.11.6 as pid 9913 2021-01-06 15:11:51.109824 I | main.go:139: Using a maximum of 1 CPUs 2021-01-06 15:11:51.111647 I | natsclient.go:116: Connection established to nats://localhost:4222 (ND2IPCPXAOZMW5QPQ3R476UVGKI42RUNGIQ7YOHLNHK3QLTS7HXIVIWH) 2021-01-06 15:11:51.111713 I | backend_configuration.go:77: Backend backend1 added for https://cloud.itw-berlin.net/ 2021-01-06 15:11:51.111723 I | hub.go:177: Using a maximum of 8 concurrent backend connections per host 2021-01-06 15:11:51.111739 I | hub.go:184: Using a timeout of 10s for backend connections 2021-01-06 15:11:51.111759 I | hub.go:270: Not using GeoIP database 2021-01-06 15:11:51.113242 I | mcu_janus.go:289: Connected to Janus WebRTC Server 0.9.2 by Meetecho s.r.l. 2021-01-06 15:11:51.113260 I | mcu_janus.go:293: Found JANUS VideoRoom plugin 0.0.9 by Meetecho s.r.l. 2021-01-06 15:11:51.113269 I | mcu_janus.go:299: Data channels are supported 2021-01-06 15:11:51.113274 I | mcu_janus.go:305: Full-Trickle is enabled 2021-01-06 15:11:51.113280 I | mcu_janus.go:308: Maximum bandwidth 1048576 bits/sec per publishing stream 2021-01-06 15:11:51.113285 I | mcu_janus.go:309: Maximum bandwidth 2097152 bits/sec per screensharing stream 2021-01-06 15:11:51.114259 I | mcu_janus.go:315: Created Janus session 6900302758812903 2021-01-06 15:11:51.114951 I | mcu_janus.go:322: Created Janus handle 7778710372665701 2021-01-06 15:11:51.115064 I | main.go:226: Using janus MCU 2021-01-06 15:11:51.115132 I | hub.go:357: Using a timeout of 10s for MCU requests 2021-01-06 15:11:51.115192 I | backend_server.go:94: Using configured TURN API key 2021-01-06 15:11:51.115250 I | backend_server.go:95: Using configured shared TURN secret 2021-01-06 15:11:51.115315 I | backend_server.go:97: Adding "turn:cloud.itw-berlin.net:5349?transport=udp" as TURN server 2021-01-06 15:11:51.115372 I | backend_server.go:97: Adding "turn:cloud.itw-berlin.net:5349?transport=tcp" as TURN server 2021-01-06 15:11:51.115420 I | backend_server.go:104: No IPs configured for the stats endpoint, only allowing access from 127.0.0.1 2021-01-06 15:11:51.115613 I | main.go:302: Listening on 127.0.0.1:8080
Einrichtung des Signaling-Servers als Systemdienst
cp dist/init/systemd/signaling.service /etc/systemd/system/signaling.service
Einbinden des Signaling Servers in Nextcloud
- Dies geschieht unter Einstellungen > Talk.
- Ganz unten wird nun ein Signaling Server mit dem Plus-Zeichen hinzugefügt.
- Die Domain lautet hierfür https://signaling.meinedomain.de/standalone-signaling.
- Unter Gemeinsames Geheimnis wird nun der Nextcloud Secret Key hinterlegt, den wir ganz am Anfang erzeugt haben:
Hinterlegen des Signaling Servers in der Nextcloud Talk Konfiguration
Die Option SSL Zertifikat überprüfen sollte hier aktiviert werden, wenn der Signaling Server über ein valides Zertifikat verfügt (zum Beispiel Let’s Encrypt).
Benchmark/Test
Für den Signaling Server gibt es ebenfalls einen mitgelieferten Client, mit dem man den Server testen einen Benchmark ausführen kann.
Dazu muss der Client erst einmal gebaut werden:
cd /etc/nextcloud-spreed-signaling make client
Als nächstes muss die Server-Konfiguration noch geändert werden, damit Verbindungen mit den Client möglich sind: vi /etc/signaling/server.conf
Hier muss in der Backend-Sektion die Variable allowall auf true gesetzt werden, damit keine Einschränkung auf bestimmte Domains besteht. [backend] # ... allowall = true # ...
Der Service ist dann noch neu zu starten: service signaling restart Nun kann mit den Client ein Benchmark durchgeführt werden:
cd /etc/nextcloud-spreed-signaling ./bin/client -addr localhost:8080
Der Client baut daraufhin 100 Verbindungen zum Server auf und zeigt den Durchsatz an.
Benchmark des Signaling Servers
Wichtig ist hier v.a., dass sämtliche Verbindungen zu Stande kommen („All connections established“).
- Im Hintergrund sieht man, dass das System CPU-seitig ordentlich unter Last gesetzt wird.
Wichtig: Aus Sicherheitsgründen sollte die Variable allowall in der server.conf nach dem Test wieder auf false gesetzt werden (Neustart des Services nicht vergessen).
Wenn ihr nun alles richtig gemacht habt, sollte curl -i https://signaling.xy.de/standalone-signaling/api/v1/welcome folgende Antwort liefern:
HTTP/1.1 200 OK Date: Thu, 05 Jul 2018 09:28:08 GMT Server: nextcloud-spreed-signaling/1.0.0 Content-Type: application/json; charset=utf-8 Content-Length: 59 {"nextcloud-spreed-signaling":"Welcome","version":"1.0.0"}
Quelle: https://nichteinschalten.de/signalisierungsserver-fuer-nextcloud-aufsetzen-how-to/
systemctl restart janus && systemctl enable janus
systemctl start nats-server && systemctl enable nats-server
Install nextcloud-spreed-signaling Server
cp bin/signaling /usr/bin/
[backend] allowed = nextcloud.example.com allowall = false secret = 692cdc99256135bcb7849ca1886e2ed6 timeout = 10 connectionsperhost = 8
and if it listens on port 8080:
netstat -tulpen | grep 8080
Enable and start service:
systemctl enable signaling.service systemctl start signaling.service
http://nats.io/documentation/tutorials/gnatsd-install/
https://github.com/meetecho/janus-gateway) can be used to act as a WebRTC gateway. See the documentation of Janus on how to configure and run the server. At least the VideoRoom plugin and the websocket transport of Janus must be enabled.
The signaling server uses the VideoRoom plugin of Janus to manage sessions. All gateway details are hidden from the clients, all messages are sent through the signaling server. Only WebRTC media is exchanged directly between the gateway and the clients.
Edit the server.conf and enter the URL to the websocket endpoint of Janus in the section [mcu] and key url. During startup, the signaling server will connect to Janus and log information of the gateway.
The maximum bandwidth per publishing stream can also be configured in the section [mcu], see properties maxstreambitrate and maxscreenbitrate.
Benchmarking the server
A simple client exists to benchmark the server. Please note that the features that are benchmarked might not cover the whole functionality, check the implementation in src/client for details on the client.
To authenticate new client connections to the signaling server, the client starts a dummy authentication handler on a local interface and passes the URL in the hello request. Therefore the signaling server should be configured to allow all backend hosts (option allowall in section backend).
The client is not compiled by default, but can be using the client target:
$ make client Usage:
$ ./bin/client Usage of ./bin/client: -addr string http service address (default "localhost:28080") -config string config file to use (default "server.conf") -maxClients int number of client connections (default 100)
Links
Intern
TODO
Extern
- https://github.com/strukturag/nextcloud-spreed-signaling
- https://de.wikipedia.org/wiki/WebRTC
- https://decatec.de/home-server/nextcloud-talk-mit-eigenem-signaling-server-high-performance-backend/
- https://decatec.de/home-server/nextcloud-auf-ubuntu-server-20-04-lts-mit-nginx-mariadb-php-lets-encrypt-redis-und-fail2ban/
- https://decatec.de/home-server/nextcloud-talk-mit-eigenem-turn-server-coturn/
- https://decatec.de/linux/lets-encrypt-zertifikate-mit-acme-sh-und-nginx/
- https://decatec.de/home-server/rsa-und-ecdsa-zertifikate-mit-nginx-hybrid-loesung/
- https://decatec.de/home-server/tlsv1-3-unter-ubuntu-server-18-04-lts-mit-nginx/
- https://decatec.de/home-server/docker-auf-ubuntu-server/