Nextcloud/Talk/HPB
Nextcloud Talk High Performance Backend
Beschreibung
Janus WebRTC gateway
WebRTC ist eine Abkürzung für Web Real-Time Communication, also Echtzeitkommunikation. WebRTC ist ein offener Standard, der durch eine Sammlung von Kommunikationsprotokollen und Programmierschnittstellen definiert wird. Dieser Standard ermöglicht es Clients (wie beispielsweise Webbrowsern) eine direkte Verbindung zueinander aufzubauen. Der Vorteil besteht darin, daß keine zusätzliche Software installiert werden muss, wie es etwa bei Skype oder Zoom der Fall ist. Des Weiteren werden Server-Ressourcen geschont. WebRTC läuft innerhalb der Browser-Sandbox und ist dadurch auch sicher - es werden keine PlugIns benötigt oder andere Prozesse gestartet. Damit die Clients voneinander erfahren, wie sie die direkte Verbindung zueinander aufbauen können, sind die Dienste eines Signaling-Servers notwendig.
- Weitere Informationen
NATS messaging server
Der NATS-Server ermöglicht es Anwendungen und Diensten Daten auszutauschen, die in Nachrichten unterteilt sind. Clients stellen über eine URL eine Verbindung zum NATS-Server her und können anschließend Nachrichten zu einem bestimmten Betreff abonnieren oder veröffentlichen.
- Weitere Informationen
Signaling-Server
Der Signaling-Server ermöglicht Clients, die eine direkte Verbindung zueinander aufbauen wollen, den Austausch von Informationen, die dies gewährleisten. Möchte sich ein Client A mit einem Client B verbinden, signalisiert er dies dem Signaling-Server. Sollte Client B der Verbindungsanfrage zustimmen, übermittelt dieser seine Verbindungsinformationen an den Signaling-Server, der diese an Client A weiterreicht. Daraufhin erfolgt der direkte Verbindungsaufbau zwischen den Clients A und B.
- Weitere Informationen
Apache Webserver
Der Apache Webserver ist einer der meistgenutzten Webserver im Internet. Die Software ist modular aufgebaut und dementsprechend durch die Installation von zusätzlichen Modulen in ihrer Funktionalität erweiterbar. Für den Signaling-Server wird eine eigene Subdomain erzeugt (signaling.foxtom.de) und Apache als Reverse-Proxy konfiguriert. Bei einem solchen Szenario beantwortet der Webserver die Anfragen nicht selbst, sondern übergibt sie an einen Backend-Server, der keine direkte Verbindung zum Internet hat. Der Backend-Server - in diesem Fall der Signaling-Server - bearbeitet die Anfrage und übergibt den Inhalt zurück an den Apache-Webserver, der damit die HTTP-Antwort erzeugt und zurück an den anfragenden Client sendet. Im Endeffekt wird hier ein Zugang zum Signaling-Server über HTTPS geschaffen.
- Weitere Informationen
- https://httpd.apache.org/docs/2.4/ Dokumentation zum Apache HTTP Server
- https://httpd.apache.org/docs/2.4/howto/reverse_proxy.html Reverse Proxy
Installation
Vorbereitung
Schlüssel (keys) erstellen
- <api-Key> für Janus
$ openssl rand -base64 16
- Hash-Key
$ openssl rand -hex 16
- Block-Key
$ openssl rand -hex 16
- Secret Key für die Nextcloud
$ openssl rand -hex 16
- openssl
- Option rand Pseudozufallszeichenketten einer bestimmten Kodierung und der angegebenen Länge erzeugt werden.
- Option base64
- wird eine Zeichenkette aus Zahlen, Groß- & Kleinbuchstaben, sowie den Zeichen '+' und '/' generiert
- Option hex eine Zeichenkette aus Hexadezimalzahlen erzeugt wird.
Server-Daten
Nextcloud-Server: cloud.foxtom.de TURN-Server: cloud.foxtom.de:5349 Signaling Server: signaling.foxtom.de
Konfiguration
Dateien
Anwendungen
Sicherheit
Dokumentation
RFC
Man-Pages
Info-Pages
Projekt-Homepage
Links
Siehe auch
Weblinks
- 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/
Einzelnachweise
Testfragen
Testfrage 1
Testfrage 2
Testfrage 3
Testfrage 4
Testfrage 5
Janus
siehe Nextcloud:Talk:HPB:Janus
NATS
siehe Nextcloud:Talk:HPB:NATS
Signaling Server
Zur Installation des Servers wird das Paket golang-go benötigt, welches über die Paketverwaltung installiert werden kann:
apt install golang-go
Installation
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
Beispielkonfiguration
/usr/src/nextcloud-spreed-signaling/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.foxtom.de ... 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.foxtom.de:5349?transport=udp,turn:cloud.foxtom.de:5349?transport=tcp ...
Zum automatischen Starten des Signaling-Servers als Systemdienst werden die folgenden Befehle ausgeführt:
cp dist/init/systemd/signaling.service /etc/systemd/system/signaling.service systemctl enable signaling.service systemctl start signaling.service
Starten des Signaling-Servers
Ist Janus-Server bereits gestartet, kann der Signaling-Server für einen Test direkt aufgerufen werden:
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.foxtom.de/ 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.foxtom.de:5349?transport=udp" as TURN server 2021-01-06 15:11:51.115372 I | backend_server.go:97: Adding "turn:cloud.foxtom.de: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
Debugging
Log prüfen
Mit dem Befehl journalctl lassen sich die Einträge des Systemd-Logbuchs zum Siganling-Servers ausgeben:
$ sudo journalctl -u signaling -- Logs begin at Mon 2021-02-01 13:01:38 CET, end at Mon 2021-02-01 14:21:47 CET. -- Feb 01 13:01:38 signaling signaling[10668]: client.go:251: Client from 46.90.62.181 has RTT of 127 ms (127.606144ms) Feb 01 13:01:38 signaling signaling[10668]: client.go:251: Client from 91.64.35.249 has RTT of 71 ms (71.768255ms) Feb 01 13:01:38 signaling signaling[10668]: client.go:251: Client from 91.64.2.4 has RTT of 49 ms (49.079442ms) Feb 01 13:01:38 signaling signaling[10668]: client.go:251: Client from 89.249.64.252 has RTT of 60 ms (60.899805ms) Feb 01 13:01:39 signaling signaling[10668]: client.go:251: Client from 217.94.247.3 has RTT of 37 ms (37.689669ms) Feb 01 13:01:39 signaling signaling[10668]: client.go:251: Client from 95.90.232.210 has RTT of 57 ms (57.636709ms) Feb 01 13:01:39 signaling signaling[10668]: client.go:251: Client from 91.64.50.230 has RTT of 54 ms (54.221002ms) ...
Fehlermeldungen sind bei der aktuell laufenden Instanz des Signaling-Servers von dieser Art & nur sporadisch:
Feb 01 13:02:23 signaling signaling[10668]: client.go:271: Error reading from 95.90.245.7: read tcp 127.0.0.1:8080->127.0.0.1:35230: use of closed network connection
Debug-/Loglevel einstellen
Frontend-Webserver (Apache)
- [Normalerweise?] wird der Signalisierungsserver hinter einem Webserver ausgeführt, der das SSL-Protokoll ausführt oder als Load Balancer für mehrere Signalisierungsserver fungiert.
Installation
Konfuguration
- Um den Apache-Webservice als Frontend für den Signalisierungsserver zu konfigurieren
- müssen die Module mod_proxy_http und mod_proxy_wstunnel aktiviert sein
- damit WebSocket- und API-Backend-Anforderungen weitergeleitet werden können
# a2enmod proxy # a2enmod proxy_http # a2enmod proxy_wstunnel
Virtual-Host einrichten
Jetzt kann die Virtual-Host-Konfiguration von Apache erweitert werden, um Anfragen an den Signalisierungsserver weiterzuleiten (vorausgesetzt, der Server wird auf der lokalen Schnittstelle an Port 8080 ausgeführt). Für signaling.foxtom.de sollte die Datei /etc/apache2/sites-available/signaling.foxtom.de.conf wie folgt editiert werden:
<IfModule mod_ssl.c> <VirtualHost *:443> ServerAdmin webmaster@localhost DocumentRoot /var/www/html ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined ServerName signaling.foxtom.de SSLCertificateFile /etc/letsencrypt/live/signaling.foxtom.de/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/signaling.foxtom.de/privkey.pem Include /etc/letsencrypt/options-ssl-apache.conf ProxyErrorOverride On DocumentRoot "/var/www/html" ProxyPass /error/ ! ErrorDocument 404 /error/404_proxy.html ProxyPass / "http://127.0.0.1:8080/" RewriteEngine on RewriteCond %{HTTP:Upgrade} websocket [NC] RewriteCond %{HTTP:Connection} upgrade [NC] RewriteRule ^/?(.*) "ws://127.0.0.1:8080/$1" [P,L] </VirtualHost> </IfModule>
Debugging
Log prüfen
Die Log-Dateien des Apache-Webservers werden im Verzeichnis /var/log/apache2/ gespeichert. Dabei kommt der Datei error.log die größte Bedeutung zu - sie ist der erste Anlaufpunkt zu Fehlerdiagnose:
$ sudo tail -f /var/log/apache2/error.log [Tue Feb 02 00:00:01.238481 2021] [mpm_event:notice] [pid 22518:tid 139736999879808] AH00489: Apache/2.4.38 (Debian) OpenSSL/1.1.1d configured -- resuming normal operations [Tue Feb 02 00:00:01.238532 2021] [core:notice] [pid 22518:tid 139736999879808] AH00094: Command line: '/usr/sbin/apache2'
Die access-Log-Dateien protokollieren jeden Zugriff auf denn Webserver:
$ sudo tail -f /var/log/apache2/access.log 116.202.118.50 - - [01/Feb/2021:15:01:53 +0100] "POST /api/v1/room/maf38kte HTTP/1.1" 200 3898 "-" "Nextcloud Server Crawler" 116.202.118.50 - - [01/Feb/2021:15:02:10 +0100] "POST /api/v1/room/maf38kte HTTP/1.1" 200 3930 "-" "Nextcloud Server Crawler" ... 116.202.118.50 - - [01/Feb/2021:15:03:04 +0100] "POST /api/v1/room/maf38kte HTTP/1.1" 200 3914 "-" "Nextcloud Server Crawler" 116.202.118.50 - - [01/Feb/2021:15:03:17 +0100] "POST /api/v1/room/maf38kte HTTP/1.1" 200 3898 "-" "Nextcloud Server Crawler"
$ sudo tail -f /var/log/apache2/other_vhosts_access.log
Debug-/Loglevel einstellen
Sollten die in den Log-Dateien erfassten Informationen zur Fehlerdiagnose nicht ausreichen, läßt sich durch Modifikation der Konfigurationsdatei des Webservers das Log-Level erhöhen. Der Standardeintrag in der Datei /etc/apache2/apache2.conf ist "LogLevel warn". Detailliertere Informationen können mit notice, info oder debug erhalten werden. Es besteht auch die Möglichkeit, das Log-Level einzelner Module des Werbservers anzupassen, wie zum Beispiel mit: "LogLevel warn proxy:debug"
Firewall konfigurieren
TODO: Welche Ports müssen geöffnet sein?
TODO: Welche Schritte sind notwendig, um dies mit ufw zu tun?
TODO: Wie kann die Konfiguration geprüft werden?
$ sudo apt install ufw
$ sudo ufw allow http $ sudo ufw allow https $ sudo ufw allow ssh $ sudo ufw allow 5349/tcp $ sudo ufw allow 5349/udp
$ sudo ufw enable
$ sudo ufw status Status: active To Action From -- ------ ---- 80/tcp ALLOW Anywhere 443/tcp ALLOW Anywhere 22/tcp ALLOW Anywhere 5349/tcp ALLOW Anywhere 5349/udp ALLOW Anywhere 80/tcp (v6) ALLOW Anywhere (v6) 443/tcp (v6) ALLOW Anywhere (v6) 22/tcp (v6) ALLOW Anywhere (v6) 5349/tcp (v6) ALLOW Anywhere (v6) 5349/udp (v6) ALLOW Anywhere (v6)
Einbinden in Nextcloud Talk
- 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).
Quelle: https://nichteinschalten.de/signalisierungsserver-fuer-nextcloud-aufsetzen-how-to/
netstat -tulpen | grep 8080
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.
Schlüssel für den TURN-Server
- Talk-Einstellungen der Nextcloud
TODO: Beschreibung des Klickwegs als Text
TODO: Screenshot hinzufügen
Sofern bereits ein TURN-Server installiert ist, kann der benötigte Schlüssel im Administrator-Bereich der Nextcloud ausgelesen werden: Einstellungen >> Talk. Über den Link: https://cloud.foxtom.de/settings/admin/talk gelangt man direkt zu den Einstellungen. Der Schlüssel findet sich auch in der Datei /etc/turnserver.conf (static-auth-secret=<Schlüssel>).