Nextcloud/Talk/HPB/Signaling-Server: Unterschied zwischen den Versionen
Die Seite wurde neu angelegt: „= Signaling Server = Zur Installation des Servers wird das Paket '''golang-go''' benötigt, welches über die Paketverwaltung installiert werden kann: apt i…“ |
K Textersetzung - „Man-Pages“ durch „Man-Page“ |
||
(68 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
= Signaling Server = | '''topic''' - Kurzbeschreibung | ||
= Beschreibung = | |||
* Der Signaling-Server (https://github.com/strukturag/nextcloud-spreed-signaling) 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. | |||
Vor kurzem wurde die Software zum Betrieb von Nextcloud Talk in größeren Nextcloudumgebungen als Open Source veröffentlicht: man braucht einen eigenen Signalisierungsserver, um mit mehreren Leuten parallel effektiv über Nextcloud Talk arbeiten zu können. | |||
* Per Default wird der interne verwendet. | |||
* Aufsetzen des Signalisierungsservers: https://github.com/strukturag/nextcloud-spreed-signaling | |||
= Installation = | |||
== Voraussetzungen == | |||
=== Server === | |||
* 4 CPU Cores | |||
* 16 GB RAM | |||
* 1 GBit/s Netzwerk (Up und Down) | |||
Darunter ist mit Einbußen bei Geschwindigkeit und Teilnehmerzahl zu rechnen. | |||
=== Software/Webserver/Domain === | |||
* Nextcloud Talk Installation mit coturn | |||
* DNS-Subdomain für den Signaling Server | |||
** Webserver-Konfiguration, die diese Domain bereits mit einem validen SSL-Zertifikat bedient. | |||
Einen STUN Server als auch den Signalisierungsserver auf eigenen VMs betreiben. | |||
* Den STUN Server sollte man bereits auf einer anderen Maschine gesondert betreiben: | |||
=== Szenario === | |||
Nextcloud-Server | |||
'''nextcloud.meinedomain.de''' | |||
TURN-Server (coturn) | |||
'''turn.meinedomain.de''' | |||
Signaling Server | |||
'''signaling.meinedomain.de''' | |||
Zur Installation des Servers wird das Paket '''golang-go''' benötigt, welches über die Paketverwaltung installiert werden kann: | Zur Installation des Servers wird das Paket '''golang-go''' benötigt, welches über die Paketverwaltung installiert werden kann: | ||
apt install golang-go | # '''apt install golang-go protobuf-compiler''' | ||
Die benötigten Quellpakete werden über GitHub bezogen und hier im Verzeichnis /usr/src abgelegt: | Die benötigten Quellpakete werden über GitHub bezogen und hier im Verzeichnis /usr/src abgelegt: | ||
cd /usr/src | # '''cd /usr/src''' | ||
git clone https://github.com/strukturag/nextcloud-spreed-signaling.git | # '''git clone https://github.com/strukturag/nextcloud-spreed-signaling.git''' | ||
Der anschließende Befehl '''make build''' erstellt das Programm '''bin/signaling''' | Der anschließende Befehl '''make build''' erstellt das Programm '''bin/signaling''' | ||
make build | # '''cd /usr/src/nextcloud-spreed-signaling''' | ||
# '''make build''' | |||
= Konfiguration = | |||
# '''mkdir -p /etc/signaling''' | |||
# '''cp /usr/src/nextcloud-spreed-signaling/server.conf.in /etc/signaling/server.conf''' | |||
mkdir -p /etc/signaling | |||
und die Berechtigungen angepasst: | und die Berechtigungen angepasst: | ||
chmod 600 /etc/signaling/server.conf | # '''chmod 600 /etc/signaling/server.conf''' | ||
chown signaling: /etc/signaling/server.conf | # '''chown signaling: /etc/signaling/server.conf''' | ||
Entsprechend den lokalen Begebenheiten wir diese Datei wie folgt editiert: | Entsprechend den lokalen Begebenheiten wir diese Datei wie folgt editiert: | ||
Zeile 60: | Zeile 88: | ||
Zum automatischen Starten des Signaling-Servers als Systemdienst werden die folgenden Befehle ausgeführt: | 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 | # '''cp dist/init/systemd/signaling.service /etc/systemd/system/signaling.service''' | ||
systemctl enable signaling.service | systemctl enable signaling.service | ||
systemctl start signaling.service | systemctl start signaling.service | ||
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''' | |||
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 | |||
... | |||
== Starten des Signaling-Servers == | == Starten des Signaling-Servers == | ||
Ist Janus-Server bereits gestartet, kann der Signaling-Server für einen Test direkt aufgerufen werden: | Ist Janus-Server bereits gestartet, kann der Signaling-Server für einen Test direkt aufgerufen werden: | ||
# '''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.109402 I | main.go:130: Starting up version 64cccab641874b3e688c1eb9029b5bb9215741e5/go1.11.6 as pid 9913 | ||
Zeile 91: | Zeile 153: | ||
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.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 | 2021-01-06 15:11:51.115613 I | main.go:302: Listening on 127.0.0.1:8080 | ||
== Debugging == | == Debugging == | ||
Zeile 99: | Zeile 160: | ||
Mit dem Befehl '''journalctl''' lassen sich die Einträge des Systemd-Logbuchs zum Siganling-Servers ausgeben: | Mit dem Befehl '''journalctl''' lassen sich die Einträge des Systemd-Logbuchs zum Siganling-Servers ausgeben: | ||
# '''journalctl -u signaling''' | |||
-- Logs begin at Mon 2021-02-01 13:01:38 CET, end at Mon 2021-02-01 14:21:47 CET. -- | -- 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 46.90.62.181 has RTT of 127 ms (127.606144ms) | ||
Zeile 110: | Zeile 172: | ||
... | ... | ||
Fehlermeldungen sind bei der aktuell laufenden Instanz des Signaling-Servers von dieser Art | Fehlermeldungen sind bei der aktuell laufenden Instanz des Signaling-Servers von dieser Art und 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 | 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 === | === Debug-/Loglevel einstellen === | ||
== Test und Benchmarking == | |||
=== Benchmark client === | |||
==== Installation ==== | |||
Zum Testen des Signaling-Servers wird ein einfaches Client-Programm zur Verfügung gestellt, welches jedoch zuvor kompiliert werden muß: | |||
$ cd /usr/src/nextcloud-spreed-signaling/ | |||
$ make client | |||
==== Konfiguration ==== | |||
Das Programm befindet sich im Anschluß im Verzeichnis /usr/src/nextcloud-spreed-signaling/bin/ und kann mit folgenden Optionen ausgeführt werden: | |||
* -addr <http-Service-Adresse> (Standard ist localhost:28080) | |||
* -config <Konfigurationsdatei> | |||
* -maxClients <Anzahl der Client-Verbindungen> (Standardwert ist 100) | |||
==== Anwendung ==== | |||
* Vor dem Ausführen des Programms muss die Konfigurationsdatei des Signaling-Servers dahin gehend editiert werden, dass nicht nur das eigentliche Backend zugelassen wird, sondern alle. Dazu muss in der Datei /etc/signaling/server.conf der Eintrag "'''allowall = true'''" vorhanden sein. | |||
Nachdem Neustart des Signaling-Servers kann der Test-Client gestartet werden: | |||
# '''systemctl restart signaling''' | |||
# '''client -addr localhost:8080 -config /etc/signaling/server.conf''' | |||
==== Bewertung der Ergebinisse ==== | |||
Bei der derzeitigen Implementierung des (laufenden) Signaling-Servers werden jedoch Fehler erzeugt: | |||
2021-02-01 12:53:51.717590 I | Using a maximum of 1 CPUs | |||
2021-02-01 12:53:51.717978 I | Backend server running on http://95.217.178.11:33031 | |||
2021-02-01 12:53:51.718066 I | Connecting to [ws://localhost:8080/spreed] | |||
2021-02-01 12:53:51.718130 I | Starting 100 clients | |||
2021-02-01 12:53:51.720849 I | Unsupported message type: {Id: Type:error Error:Incomplete OCS response Hello:<nil> Bye:<nil> Room:<nil> Message:<nil> Control:<nil> Event:<nil>} | |||
... | |||
2021-02-01 12:53:51.856629 I | Unsupported message type: {Id: Type:error Error:Incomplete OCS response Hello:<nil> Bye:<nil> Room:<nil> Message:<nil> Control:<nil> Event:<nil>} | |||
2021-02-01 12:53:51.857998 I | Clients created | |||
2021-02-01 12:53:51.859424 I | Unsupported message type: {Id: Type:error Error:Incomplete OCS response Hello:<nil> Bye:<nil> Room:<nil> Message:<nil> Control:<nil> Event:<nil>} | |||
2021-02-01 12:53:54.072980 I | Received bye: &{Reason:hello_timeout} | |||
... | |||
2021-02-01 12:53:54.090515 I | Received bye: &{Reason:hello_timeout} | |||
Die Ausgabe einer erfolgreichen Programmausführung ist folgend gezeigt (die user-ID's der sample-user wurden stark verkürzt): | |||
$ ./client -addr localhost:8081 -config /etc/signaling/server.conf | |||
2021-02-01 13:02:45.432124 I | Using a maximum of 2 CPUs | |||
2021-02-01 13:02:45.433055 I | Backend server running on http://192.168.178.63:40305 | |||
2021-02-01 13:02:45.433136 I | Connecting to [ws://localhost:8081/spreed] | |||
2021-02-01 13:02:45.433157 I | Starting 100 clients | |||
2021-02-01 13:02:45.448228 I | Registered as MTYxMjE4MDk2NXxaUXQxVEVydXVxLXEwZm1zRZUdHQmyVW (userid sample-user) | |||
2021-02-01 13:02:45.450357 I | Registered as MTYxMjE4MDk2NXw1aHRKWU14TWxoWWwyaM2ZhQTy88IIDt (userid sample-user) | |||
... | |||
2021-02-01 13:02:45.584143 I | Registered as MTYxMjE4MDk2NXxsUXVtblgyM0stanRGWDBDVlU1CaFRYO (userid sample-user) | |||
2021-02-01 13:02:45.585374 I | Clients created | |||
2021-02-01 13:02:45.585884 I | Registered as MTYxMjE4MDk2NXxMOTJzNkV1UkJMNGlueGR5OjOcJwcQiv (userid sample-user) | |||
2021-02-01 13:02:45.586546 I | Registered as MTYxMjE4MDk2NXxkMmNLaHZVamY5OWpsWEJmDYeRaCx7L0 (userid sample-user) | |||
2021-02-01 13:02:45.586572 I | All connections established | |||
2021-02-01 13:02:55.589250 I | Stats: sent=386158 (38615/sec), recv=386154 (38615/sec), delta=4 | |||
2021-02-01 13:03:05.587561 I | Stats: sent=766105 (42216/sec), recv=765975 (42202/sec), delta=130 | |||
... | |||
2021-02-01 13:04:15.586929 I | Stats: sent=3377364 (40248/sec), recv=3376924 (40219/sec), delta=440 | |||
2021-02-01 13:04:25.589070 I | Stats: sent=3754158 (37679/sec), recv=3754115 (37719/sec), delta=43 | |||
^C2021-02-01 13:04:31.612013 I | Interrupted | |||
2021-02-01 13:04:31.612031 I | Waiting for clients to terminate ... | |||
== Signaling Server als Systemdienst == | |||
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 | |||
* Damit der Signaling Server nicht jedesmal über die Konsole im Vordergrund gestartet werden muss, sollte dieser als Systemdienst installiert werden. | |||
* Dazu stoppen wir erst einmal die Konsolen-Instanz. | |||
* Zunächst legen wir uns einen speziellen User für den Signaling Server an: | |||
groupadd signaling | |||
useradd --system --gid signaling --shell /usr/sbin/nologin --comment "Standalone signaling server for Nextcloud Talk." signaling | |||
* Anschließend wird die Konfigurationsdatei des Servers noch an einen anderen Ort kopiert (damit diese zum Beispiel bei einem Update nicht überschrieben wird). | |||
* Ebenso werden die entsprechenden Berechtigungen gesetzt: | |||
mkdir -p /etc/signaling | |||
cp server.conf /etc/signaling/server.conf | |||
chmod 600 /etc/signaling/server.conf | |||
chown signaling: /etc/signaling/server.conf | |||
* Nun editieren wir noch die Datei für den Systemdienst: | |||
vi dist/init/systemd/signaling.service | |||
[Unit] | |||
Description=Nextcloud Talk signaling server | |||
| |||
[Service] | |||
ExecStart=/etc/nextcloud-spreed-signaling/bin/signaling --config /etc/signaling/server.conf | |||
User=signaling | |||
Group=signaling | |||
Restart=on-failure | |||
[Install] | |||
WantedBy=multi-user.target | |||
Der Dienst wird im System registriert und aktiviert: | |||
cp dist/init/systemd/signaling.service /etc/systemd/system/signaling.service | |||
systemctl enable signaling.service systemctl start signaling.service | |||
Anschließend wird der Signaling Server bei jedem Systemstart gestartet. | |||
= Anwendung = | |||
= Sicherheit = | |||
= Dokumentation = | |||
== RFC == | |||
== Man-Page == | |||
== Info-Pages == | |||
== Projekt == | |||
= Links = | |||
== Siehe auch == | |||
== Weblinks == | |||
= TMP = | |||
== Installation der Services == | |||
Den Signaling Server direkt von Github selbst kompilieren: | |||
# '''apt install git automake golang build-essential certbot nginx apt-transport-https ca-certificates curl gnupg-agent software-properties-common''' | |||
# '''cd /usr/src''' | |||
# '''git clone https://github.com/strukturag/nextcloud-spreed-signaling.git''' | |||
# '''cd nextcloud-spreed-signaling''' | |||
# '''make build''' | |||
# '''cp bin/signaling /usr/bin/''' | |||
Nun die Konfigurationsdatei aus dem Repo an die richtige Stelle kopieren.: | |||
mkdir /etc/signaling/ | |||
cp server.conf.in /etc/signaling/server.conf | |||
Anlegen eines users: | |||
useradd --system --shell /usr/sbin/nologin --comment "Standalone signaling server for Nextcloud Talk." signaling | |||
chown signaling: /etc/signaling/server.conf | |||
chmod 600 /etc/signaling/server.conf | |||
Anschließend den Service für den Signaling Server einrichten und vorher natürlich die Systemd Datei entsprechend eurer Pfade anpassen, wenn abweichend: | |||
cp dist/init/systemd/signaling.service /etc/systemd/system/signaling.service | |||
systemctl daemon-reload | |||
systemctl enable signaling | |||
=== Konfiguration des Signaling Servers === | |||
Abschließend müssen wir den Signaling Server noch konfigurieren: | |||
vi ''/etc/signaling/server.conf'' | |||
* '''hashkey''' mit ''openssl rand -hex 16'' generieren | |||
* '''blockkey''' mit ''openssl rand -hex 16'' generieren | |||
* '''internalsecret''' ebenfalls mit einem String Generator setzen | |||
* unter '''allowed''' alle Hostnamen eintragen, die dieses Backend verwenden dürfen | |||
* direkt darunter bei '''secret''' ein Secret generieren: | |||
Das wird später bei Nextcloud in den Settings eingetragen | |||
* '''connectionsperhost''' sollte adaptiert werden | |||
* unter nats wird die '''url''' so gesetzt: url = nats://localhost:4222 | |||
* bei mcu wird die '''url''' so gesetzt: url = ws://0.0.0.0:8188 (Janus läuft nicht localhost, ist noch ein offenes Security Thema) | |||
* unter turn wird '''apikey''' mit dem gleichen Wert vom Janus Server (turn_rest_api_key) gesetzt | |||
* das '''secret''' in der Rubrik turn bekommt den gleichen Wert wie ''static-auth-secret'' des Turnserver gesetzt | |||
* bei '''servers''' werden alle Turnserver kommasepariert so gesetzt: ''turn:116.202.113.XXX:5349?transport=tcp'' | |||
Nun sollte | |||
# '''systemctl status signaling''' | |||
erfolgreich sein. | |||
=== Nextcloud Integration === | |||
Installiert die Beta Version von Nextcloud Talk – am besten zum Testen mal in einer eigenen Installation auf dem Beta Release Channel für Nextcloud 19. | |||
* In den Einstellungen von Nextcloud im Reiter Talk nun folgende Konfiguration setzen: | |||
STUN und Signaling Server | |||
* Das gemeinsame Geheimnis ist das '''secret''' aus der Signaling Server conf | |||
=== Apache === | |||
Um den Apache-Webservice als Frontend für den eigenständigen 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 | |||
Jetzt kann die Apache VirtualHost -Konfiguration erweitert werden, um Anforderungen an den eigenständigen Signalisierungsserver weiterzuleiten (vorausgesetzt, der Server wird auf der lokalen Schnittstelle an Port 8080 unten ausgeführt): | |||
<VirtualHost *:443> | |||
<nowiki># ... existing configuration ...</nowiki> | |||
<nowiki># Enable proxying Websocket requests to the standalone signaling server.</nowiki> | |||
ProxyPass "/standalone-signaling/" "ws://127.0.0.1:8080/" | |||
RewriteEngine On | |||
<nowiki># Websocket connections from the clients.</nowiki> | |||
RewriteRule ^/standalone-signaling/spreed$ - [L] | |||
<nowiki># Backend connections from Nextcloud.</nowiki> | |||
RewriteRule ^/standalone-signaling/api/(.*) http://127.0.0.1:8080/api/$1 [L,P] | |||
<nowiki># ... existing configuration ...</nowiki> | |||
</VirtualHost> | |||
===Einrichtung des Frontend-Webservers=== | |||
Normalerweise wird der eigenständige Signalisierungsserver hinter einem Webserver ausgeführt, der das SSL-Protokoll ausführt oder als Load Balancer für mehrere Signalisierungsserver fungiert. | |||
In den folgenden Konfigurationsbeispielen wird von einem vorkonfigurierten Webserver (Nginx oder Apache) mit einem funktionierenden HTTPS-Setup ausgegangen, der die externe Schnittstelle des Servers überwacht, auf dem sich der eigenständige Signalisierungsserver befindet. | |||
Nachdem alles eingerichtet wurde, kann die Konfiguration mit curl getestet werden: | |||
$ curl -i https: //myserver.domain.invalid/standalone-signaling/api/v1/welcome HTTP / 1.1 200 OK Datum: Do, 05. Juli 2018 09:28:08 GMT Server: nextcloud-spreed-signalisierung / 1.0 .0 Inhaltstyp: application / json; Zeichensatz = utf-8 Inhaltslänge: 59 | |||
{"nextcloud-spreed-signalisierung": "Willkommen", "Version": "1.0.0"} | |||
===Einrichtung von Nextcloud Talk=== | |||
Melden Sie sich bei Ihrer Nextcloud als Administrator an und öffnen Sie die Seite mit den zusätzlichen Einstellungen. | |||
Scrollen Sie zum Abschnitt "Talk" und geben Sie die Basis-URL Ihres eigenständigen Signalisierungsservers in das Feld "Externer Signalisierungsserver" ein. | |||
Bitte beachten Sie, dass Sie https verwenden müssen, wenn Ihre Nextcloud auch unter https ausgeführt wird. | |||
Normalerweise sollten Sie https: // myhostname / Standalone-Signaling als URL eingeben. | |||
Der Wert "Shared Secret für externen Signalisierungsserver" muss mit dem Eigenschaftsgeheimnis im Abschnitt "Backend" Ihrer server.conf übereinstimmen. | |||
Wenn Sie ein selbstsigniertes Zertifikat für die Entwicklung verwenden, müssen Sie das Kontrollkästchen SSL-Zertifikat validieren deaktivieren, damit Backend-Anforderungen von Nextcloud an den Signalisierungsserver ausgeführt werden können. | |||
===Benchmarking des Servers=== | |||
Es gibt einen einfachen Client zum Benchmarking des Servers. Beachten Sie, dass die Benchmarking-Funktionen möglicherweise nicht die gesamte Funktionalität abdecken. Überprüfen Sie die Implementierung in src / client auf Details zum Client. | |||
Um neue Clientverbindungen zum Signalisierungsserver zu authentifizieren, startet der Client einen Dummy-Authentifizierungshandler auf einer lokalen Schnittstelle und übergibt die URL in der Hallo-Anforderung. Daher sollte der Signalisierungsserver so konfiguriert sein, dass alle Backend-Hosts zulässig sind (Option allowall im Abschnitt backend). | |||
Der Client wird nicht standardmäßig kompiliert, kann jedoch das Clientziel verwenden: | |||
$ Client machen | |||
Verwendung: | |||
$ ./bin/client | |||
Verwendung von ./bin/client: | |||
-addr string | |||
http-Dienstadresse (Standard "localhost: 28080") | |||
-config string | |||
Zu verwendende Konfigurationsdatei (Standard "server.conf") | |||
-maxClients int | |||
Anzahl der Clientverbindungen (Standard 100) | |||
= TMP 2 = | |||
'''Nextcloud Signaling Server''' (High Performance Backend) | |||
== Signaling Server installieren == | |||
Der Signaling Server (das High Performance Backend für Nextcloud) besteht aus mehreren Komponenten: | |||
* [https://github.com/strukturag/nextcloud-spreed-signaling Signaling Server] | |||
* [https://github.com/meetecho/janus-gateway Janus] (WebRTC Server) | |||
* [https://nats.io/ NATS-Server] | |||
=== Notwendigen Keys === | |||
Erzeugen | |||
* Janus API-Key: | |||
openssl rand -base64 16 | |||
* Hash-Key: | |||
openssl rand -hex 16 | |||
* Block-Key: | |||
openssl rand -hex 16 | |||
* Nextcloud Secret Key: | |||
openssl rand -hex 16 | |||
Bereitstellen | |||
* Turn-Server-Key | |||
''static-auth-secret'' aus ''/etc/turnserver.conf'' | |||
Im Weiteren wird auf diese Keys verwiesen (zum Beispiel: ''<Janus API-Key>'') | |||
=== Signaling Server === | |||
apt install golang-go | |||
cd /usr/src | |||
git clone https://github.com/strukturag/nextcloud-spreed-signaling.git | |||
cd /usr/src/nextcloud-spreed-signaling | |||
make build | |||
==== Konfigurations-Datei angepassen ==== | |||
cd /usr/src/nextcloud-spreed-signaling | |||
cp server.conf.in server.conf | |||
;server.conf | |||
listen = 127.0.0.1:8080 | |||
hashkey = <Hash-Key> | |||
blockkey = <Block-Key> | |||
backends = backend1 | |||
[backend1] | |||
# URL of the Nextcloud instance | |||
url = https://cloud.meinedomain.de | |||
| |||
# Shared secret for requests from and to the backend servers. | |||
# This must be the same value as configured in the Nextcloud admin ui. | |||
secret = <Nextcloud Secret Key> | |||
# Verbindung zum Websocket von Janus | |||
url = ws://127.0.0.1:8188 | |||
apikey = <Janus API-Key> | |||
secret = <Turn-Server-Key> | |||
servers = turn:turn.meinedomain.de:5349?transport=udp,turn:turn.meinedomain.de:5349?transport=tcp | |||
'''Hinweis: ''' | |||
Die Variable ''allowall'' sollte aus Gründen der Sicherheit in dieser Konfoguration immer auf ''false'' gesetzt werden. | |||
Die einzige Ausnahme besteht zum Testen des Signaling Servers mittels des mitgelieferten Clients (siehe unten). | |||
Bevor wir den Signaling Server nun starten können, müssen die restlichen Programme installiert werden. | |||
=== Janus === | |||
Die Installation erfolgt hier über einen Befehl: | |||
apt install janus | |||
Anschließend müssen hier ebenfalls die Konfigurations-Dateien bearbeitet werden: | |||
vi /etc/janus/janus.jcfg | |||
Hier konfigurieren wir den STUN-Server (coturn), aktivieren die Option „Full Trickle“ und tragen den API-Key ein: | |||
# ... | |||
stun_server = "turn.meinedomain.de" | |||
stun_port = 5349 | |||
# ... | |||
full_trickle = true | |||
# ... | |||
turn_rest_api_key = "<Janus API-Key>" | |||
# ... | |||
Anschließend wird Janus so konfiguriert, dass es nur lokal (das heißt nicht über das Netzwerk) angesprochen werden kann: | |||
vi /etc/janus/janus.transport.http.jcfg | |||
Das Interface wird dabei auf „lo“ gesetzt: | |||
# ... | |||
interface = "lo" | |||
# .. | |||
Das gleiche wird auch für den Websocket gemacht: | |||
vi /etc/janus/janus.transport.websockets.jcfg | |||
# ... | |||
ws_interface = "lo" | |||
# ... | |||
=== NATS === | |||
<!-- | |||
Ebenfalls benötigt wird ein NATS-Server. Diesen Installieren wir der Einfachheit halber mittels Docker: | |||
docker pull nats:latest | |||
docker run --name=NATSSERVER -d -p 4222:4222 -ti --restart=always nats:latest | |||
Hier muss weiter nichts konfiguriert werden, der Docker-Cointainer wird nur so angelegt, dass dieser beim Systemstart automatisch mit gestartet wird. | |||
--> | |||
== Starten des Signaling Servers == | |||
Nun kommt der spannende Teil: Wir starten zum ersten mal den Signaling Server!Dazu wird erst einmal der Janus-Dienst neu gestartet: | |||
service janus restart | |||
Anschließend wird das Programm für einen ersten Test im Vordergrund aufgerufen: | |||
cd /etc/nextcloud-spreed-signaling | |||
./bin/signaling --config server.conf | |||
Hier wird sehr viel Output erzeugt, aber es sollten keine Fehler darunter zu finden sein. | |||
== Signaling Server als Systemdienst == | |||
* Damit der Signaling Server nicht jedes Mal über die Konsole im Vordergrund gestartet werden muss, sollte dieser als Systemdienst installiert werden. | |||
* Dazu stoppen wir erst einmal die Konsolen-Instanz. | |||
* Zunächst legen wir uns einen speziellen User für den Signaling Server an: | |||
groupadd signaling | |||
useradd --system --gid signaling --shell /usr/sbin/nologin --comment "Standalone signaling server for Nextcloud Talk." signaling | |||
* Anschließend wird die Konfigurationsdatei des Servers noch an einen anderen Ort kopiert (damit diese zum Beispiel bei Update nicht überschrieben wird). | |||
* Ebenso werden die entsprechenden Berechtigungen gesetzt: | |||
mkdir -p /etc/signaling | |||
cp server.conf /etc/signaling/server.conf | |||
chmod 600 /etc/signaling/server.conf | |||
chown signaling: /etc/signaling/server.conf | |||
* Nun editieren wir noch die Datei für den Systemdienst: | |||
vi dist/init/systemd/signaling.service | |||
[Unit] | |||
Description=Nextcloud Talk signaling server | |||
| |||
[Service] | |||
ExecStart=/etc/nextcloud-spreed-signaling/bin/signaling --config /etc/signaling/server.conf | |||
User=signaling | |||
Group=signaling | |||
Restart=on-failure | |||
[Install] | |||
WantedBy=multi-user.target | |||
Der Dienst wird im System registriert und aktiviert: | |||
cp dist/init/systemd/signaling.service /etc/systemd/system/signaling.service | |||
systemctl enable signaling.service systemctl start signaling.service | |||
Anschließend wird der Signaling Server immer beim Systemstart mit geladen. | |||
== 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. | |||
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). | |||
= Signalisierungsserver für Nextcloud = | |||
Vor kurzem wurde die Software zum Betrieb von Nextcloud Talk in größeren Nextcloudumgebungen als Open Source veröffentlicht: man braucht einen eigenen Signalisierungsserver, um mit mehreren parallel Leuten effektiv über Nextcloud Talk arbeiten zu können. | |||
* Per Default wird der interne verwendet. | |||
* Wie wird dieser [https://github.com/strukturag/nextcloud-spreed-signaling Signalisierungsserver] nun aufgesetzt? | |||
== Voraussetzungen == | |||
Ich würde sowohl einen STUN Server als auch den Signalisierungsserver auf eigenen VMs betreiben. | |||
* Ich würde hier direkt die [https://www.hetzner.de/cloud Hetzner Cloud] empfehlen: preiswert, performant und sehr einfach zum Hochskalieren. | |||
* Zwei kleine Maschinen reichen für den Anfang. | |||
* Den STUN Server solltest du bereits auf einer anderen Maschine gesondert [https://help.nextcloud.com/t/howto-setup-nextcloud-talk-with-turn-server/30794 fertig installiert haben]. | |||
Bitte beachte, dass ich bisher auch nur einen laufenden Signalisierungsserver hinbekommen habe, aber noch nicht tiefer getestet und Security Hardening betrieben habe. | |||
* Es sind die ersten Gehversuche, die ich hier zeigen möchte. | |||
== Installation der Services == | |||
Ich gehe hier von Debian 10 aus. | |||
* Als erstes solltest du Docker, nginx und sonstige Grundprogramme wie git, unzip etc. | |||
* installiert haben. | |||
Den Signaling Server direkt von Github selbst kompilieren: | |||
apt install git automake golang build-essential certbot nginx apt-transport-https ca-certificates curl gnupg-agent software-properties-common | |||
git clone https://github.com/strukturag/nextcloud-spreed-signaling.git | |||
cd nextcloud-spreed-signaling/ | |||
make build | |||
cp bin/signaling /usr/bin/ | |||
Nun die Konfigurationsdatei aus dem Repo an die richtige Stelle kopieren.: | |||
mkdir /etc/signaling/ | |||
cp server.conf.in /etc/signaling/server.conf | |||
useradd --system --shell /usr/sbin/nologin --comment "Standalone signaling server for Nextcloud Talk." signaling | |||
chown signaling: /etc/signaling/server.conf | |||
chmod 600 /etc/signaling/server.conf | |||
Anschließend den Service für den Signaling Server einrichten und vorher natürlich die Systemd Datei entsprechend eurer Pfade anpassen, wenn abweichend: | |||
cp dist/init/systemd/signaling.service /etc/systemd/system/signaling.service | |||
systemctl daemon-reload | |||
systemctl enable signaling | |||
Nun müssen wir die einzelnen Services für den Signaling Server aufsetzen. | |||
* Zunächst den NATS Server, den ich der Einfachheit halber mit Docker installiert habe, da es kein Repo gibt: | |||
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add - | |||
add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian \ | |||
$(lsb_release -cs) \ | |||
stable" | |||
apt-get update | |||
apt-get install docker-ce docker-ce-cli containerd.io | |||
docker run --restart=always --name='natsserver' -d -p 4222:4222 -ti nats:latest | |||
Außerdem brauchen wir einen Janus Server: | |||
apt install janus | |||
Nun muss der Service konfiguriert werden: ''nano /etc/janus/janus.jcfg''Hier habe ich mich an [https://morph027.gitlab.io/blog/nextcloud-spreed-signaling/ diese Anleitung] gehalten und folgende Werte gesetzt: '''turn_rest_api_key''' (mittels ''openssl rand -base64 16'' erstellen, ist derselbe String wie bei apikey in der signaling conf!), '''full_trickle = true''' und die ssl Zeilen auskommentieren. | |||
general: { | |||
configs_folder = "/etc/janus" # Configuration files folder | |||
plugins_folder = "/usr/lib/x86_64-linux-gnu/janus/plugins" # Plugins folder | |||
transports_folder = "/usr/lib/x86_64-linux-gnu/janus/transports" # Transports folder | |||
events_folder = "/usr/lib/x86_64-linux-gnu/janus/events" # Event handlers folder | |||
debug_level = 4 # Debug/logging level, valid values are 0-7 | |||
server_name = "Janus Speibox"# Public name of this Janus instance | |||
} | |||
# Certificate and key to use for DTLS (and passphrase if needed). | |||
#certificates: { | |||
# cert_pem = "/etc/ssl/certs/ssl-cert-snakeoil.pem" | |||
# cert_key = "/etc/ssl/certs/ssl-cert-snakeoil.key" | |||
#cert_pwd = "secretpassphrase" | |||
#} | |||
nat: { | |||
nice_debug = false | |||
full_trickle = true | |||
turn_rest_api_key = "apikey from server.conf" | |||
} | |||
Damit kann der Dienst gestartet werden. | |||
Es braucht natürlich noch einen coturn Server. | |||
* Dieser wird ganz simpel mit ''apt install coturn'' installiert und sollte wie bereits erwähnt nach [https://help.nextcloud.com/t/howto-setup-nextcloud-talk-with-turn-server/30794 dieser Anleitung] schon installiert sein. | |||
=== Konfiguration des Signaling Servers === | |||
Abschließend müssen wir den Signaling Server noch konfigurieren: nano ''/etc/signaling/server.conf'':* '''hashkey''' mit ''openssl rand -hex 16'' generieren | |||
* '''blockkey''' mit ''openssl rand -hex 16'' generieren | |||
* '''internalsecret''' ebenfalls mit einem String Generator setzen | |||
* unter '''allowed''' alle Hostnamen eintragen, die dieses Backend verwenden dürfen | |||
* direkt darunter bei '''secret''' ein Secret generieren. | |||
* Das wird später bei Nextcloud in den Settings eingetragen | |||
* '''connectionsperhost''' sollte adaptiert werden | |||
* unter nats wird die '''url''' so gesetzt: url = nats://localhost:4222 | |||
* bei mcu wird die '''url''' so gesetzt: url = ws://0.0.0.0:8188 (Janus läuft nicht localhost, ist noch ein offenes Security Thema) | |||
* unter turn wird '''apikey''' mit dem gleichen Wert vom Janus Server (turn_rest_api_key) gesetzt | |||
* das '''secret''' in der Rubrik turn bekommt den gleichen Wert wie ''static-auth-secret'' des Turnserver gesetzt | |||
* bei '''servers''' werden alle Turnserver kommasepariert so gesetzt: ''turn:116.202.113.XXX:5349?transport=tcp'' | |||
Nun sollte ''service signaling start'' erfolgreich sein. | |||
== Nextcloud Integration == | |||
Installiert die Beta Version von Nextcloud Talk – am besten zum Testen mal in einer eigenen Installation auf dem Beta Release Channel für Nextcloud 19 (für Nextcloud 18 habe ich das nicht probiert). | |||
* In den Einstellungen von Nextcloud im Reiter Talk nun folgende Konfiguration setzen: | |||
STUN und Signaling Server laufen bei mir auf getrennten Maschinen. | |||
* Das Gemeinsame Geheimnis ist das '''secret''' aus der Signaling Server conf. | |||
Quelle: https://nichteinschalten.de/signalisierungsserver-fuer-nextcloud-aufsetzen-how-to/ | |||
= Install Nextcloud Talk High Performance Backend with Stun/Turnserver = | |||
* Nextcloud has released the [https://www.heise.de/ix/meldung/Nextcloud-stellt-High-Performance-Back-End-unter-Open-Source-Lizenz-4727074.html High Performance Backend as OpenSource under AGPL License] | |||
== Anforderungen == | |||
** shell access | |||
** appropriate rights– One DNS A and possibly AAAA record for our nginx vhost and stun/turn-server | |||
** I use signaling.example.com for all three services in this guide | |||
* Optional | |||
** a second DNS A and possibly AAAA record for stun/turnserver | |||
=== Hardware Anforderungen === | |||
* 4 CPU | |||
* 8 GB RAM | |||
* 32 GB Disk-Space | |||
You can also test a smaller server if you don’t have that many users | |||
; See also | |||
# https://portal.nextcloud.com/article/nextcloud-talk-high-performance-back-end-requirements-46.html | |||
== Arbeitsschritte == | |||
=== Install Firewall and other packages === | |||
First of all, you should install a firewall to secure your VPS (if not installed) and allow incoming traffic to port 80/443 and 22 (ssh) only. | |||
* For Securing ssh-access you can use fail2ban and passwordless authentication. | |||
* Many guides for this are out there. | |||
apt install ufw -y | |||
ufw allow http | |||
ufw allow https | |||
ufw allow ssh | |||
ufw allow 5349/tcp | |||
ufw allow 5349/udp | |||
ufw enable | |||
Accept with „y“ | |||
=== Install and config stun/turnserver === | |||
you have to install the package coturn: | |||
apt install coturn | |||
enable daemonizing for your turnserver: | |||
sed -i '/TURNSERVER_ENABLED/c\TURNSERVER_ENABLED=1' /etc/default/coturn | |||
create a random hex key for your nextcloud talk app and signaling server with: | |||
openssl rand -hex 32 | |||
and copy it for later use, then edit /etc/turnserver.conf: | |||
mv /etc/turnserver.conf /etc/turnserver.conf.bak && nano /etc/turnserver.conf | |||
copy, paste and adjust the following code: | |||
listening-port=5349 | |||
fingerprint | |||
lt-cred-mech | |||
use-auth-secret | |||
static-auth-secret=output_of_openssl rand -hex 32 | |||
realm=signaling.example.com | |||
total-quota=100 | |||
bps-capacity=0 | |||
stale-nonce | |||
no-loopback-peers | |||
no-multicast-peers | |||
and last, restart and enable coturn: | |||
systemctl restart coturn && systemctl enable coturn | |||
=== Install and config janus === | |||
The Version of janus in official repository of Ubuntu 18.04 is 0.2.6-1build2, so if you use 18.04 try [https://gitlab.com/packaging/janus/ Gitlab Repository]. | |||
* of morph27 instead. | |||
* If you use 20.04 the version is suitable. | |||
'''Ubuntu 18.04'''add repo key: | |||
curl -sL -o /etc/apt/trusted.gpg.d/morph027-janus.asc https://packaging.gitlab.io/janus/gpg.key | |||
add repo: | |||
. /etc/lsb-release; echo "deb [arch=amd64] https://packaging.gitlab.io/janus/$DISTRIB_CODENAME $DISTRIB_CODENAME main" | tee /etc/apt/sources.list.d/morph027-janus.list | |||
apt update | |||
'''Ubuntu 20.04 and 18.04:''' | |||
apt install janus | |||
Now generate a random api key for turnserver: | |||
openssl rand -base64 16 | |||
and copy the output for later use. | |||
vi /etc/janus/janus.jcfg | |||
go to section nat and enter your stunserver and port, uncomment full_trickle = true, turn_server with port and type and the generated api key. | |||
You can copy, paste and adjust the following: | |||
stun_server = "signaling.example.com" | |||
stun_port = 5349 | |||
full_trickle = true | |||
turn_server = "signaling.example.com" | |||
turn_port = 5349 | |||
turn_type = "udp" | |||
turn_rest_api_key = "output_from_openssl rand -base64 16" | |||
then comment the following lines: | |||
#certificates: {# cert_pem = „/etc/ssl/certs/ssl-cert-snakeoil.pem“# cert_key = „/etc/ssl/private/ssl-cert-snakeoil.key“#cert_pwd = „secretpassphrase“#} | |||
next edit /etc/janus/janus.transport.http.jcfg: | |||
vi /etc/janus/janus.transport.http.jcfg | |||
and set in section general the interface to lo: | |||
interface = "lo" | |||
same in /etc/janus/janus.transport.websockets.jcfg: | |||
vi /etc/janus/janus.transport.websockets.jcfg | |||
interface = "lo" | |||
* janus will now only listen on lo-interface (127.0.0.1) | |||
enable and restart janus: | |||
systemctl restart janus && systemctl enable janus | |||
=== Running or Install NATS Server === | |||
If your VPS support docker, then you can use docker to run NATS Server: | |||
Install docker if not installed: | |||
curl -sSL https://get.docker.com/ | CHANNEL=stable sh | |||
systemctl enable docker.service | |||
systemctl start docker.service | |||
then run NATS Server: | |||
docker run --restart=always --name=NATSSERVER -d -p 4222:4222 -ti --restart=always nats:latest | |||
when you want to run NATS Server without docker, there is another [https://gitlab.com/packaging/nats-server Repository] of morph27. | |||
you have to add its key and its repo: | |||
curl -sL -o /etc/apt/trusted.gpg.d/morph027-nats-server.asc https://packaging.gitlab.io/nats-server/gpg.key | |||
echo "deb [arch=amd64] https://packaging.gitlab.io/nats-server nats main" | tee /etc/apt/sources.list.d/morph027-nats-server.list | |||
install NATS Server: | |||
apt update | |||
apt install nats-server | |||
generate config under /etc/nats/nats.conf | |||
install -d -o nats -g nats /etc/nats | |||
sudo -u nats echo "listen: 127.0.0.1:4222" > /etc/nats/nats.conf | |||
start and enable NATS-Server: | |||
systemctl start nats-server && systemctl enable nats-server | |||
=== Install nextcloud-spreed-signaling Server === | |||
now we can install the nextcloud-spreed-signaling server, first of all, we have to install the packages we need to built: | |||
apt install git automake golang build-essential python3 -y | |||
then we clone the git repository and start the build process: | |||
cd /opt | |||
git clone https://github.com/strukturag/nextcloud-spreed-signaling.git | |||
cd nextcloud-spreed-signaling/ | |||
make build | |||
then copy the binary to /usr/bin | |||
cp bin/signaling /usr/bin/ | |||
now create a dedicated user: | |||
useradd --system --shell /usr/sbin/nologin --comment "Standalone signaling server for Nextcloud Talk." signaling | |||
create the server.conf in /etc/signaling/ | |||
mkdir /etc/signaling/ | |||
touch /etc/signaling/server.conf | |||
chown signaling: /etc/signaling/server.conf | |||
chmod 600 /etc/signaling/server.conf | |||
and copy the systemd file: | |||
cp dist/init/systemd/signaling.service /etc/systemd/system/signaling.service | |||
systemctl daemon-reload | |||
systemctl enable signaling | |||
* create keys for config: | |||
Nextcloud Secret Key | |||
openssl rand -hex 16 | |||
Block-Key | |||
openssl rand -hex 16 | |||
Hash-Key | |||
openssl rand -hex 16 | |||
Now we have five keys at all, as example (do not use these keys) | |||
Turn-Key from Step 2 | |||
api-key from Step 3:Nextcloud-Secret-Key | |||
Block-Key | |||
Hash-Key | |||
vi /etc/signaling/server.conf | |||
then copy, paste and adjust (change keys to yours) the following config | |||
[http] | |||
listen = 127.0.0.1:8080 | |||
[app] | |||
debug = false | |||
[sessions] | |||
hashkey = db61d5a8c6bd2b47a3cb0abce3545040 | |||
blockkey = f702adbf248ab0e752fa76cb46bcba12 | |||
[backend] | |||
allowed = nextcloud.example.com | |||
allowall = false | |||
secret = 692cdc99256135bcb7849ca1886e2ed6 | |||
timeout = 10 | |||
connectionsperhost = 8 | |||
[nats] | |||
url = nats://localhost:4222 | |||
[mcu] | |||
type = janus | |||
url = ws://127.0.0.1:8188 | |||
[turn] | |||
apikey = Z6ZkKhjwCFa6RMpFU854Fw== | |||
secret = 2309a206fc4de0f511ce9da52c088171f69193d1f701323d5ab4f733c9853445 | |||
servers = turn:signaling.example.com:5349?transport=udp,turn:signaling.example.com:5349?transport=tcp | |||
then start signaling: | |||
systemctl start signaling | |||
and check staus of the service: | |||
systemctl status signaling | |||
and if it listens on port 8080: | |||
netstat -tulpen | grep 8080 | |||
=== Install nginx and create vHost for signaling server === | |||
Now we will install nginx as reverse proxy for our high performance backend: | |||
apt install nginx python3-certbot-nginx -y | |||
and create the vHost: | |||
vi /etc/nginx/sites-available/signaling | |||
copy, paste and adjust: | |||
server { | |||
listen 80; | |||
server_name signaling.example.com; | |||
} | |||
and activate vhost: | |||
ln -s /etc/nginx/sites-available/signaling /etc/nginx/sites-enabled/signaling | |||
then check with: | |||
nginx -t | |||
and reload | |||
systemctl reload nginx | |||
now use certbot to obtain a certificate: | |||
certbot --authenticator standalone --installer nginx -d signaling.example.com --pre-hook "service nginx stop" --post-hook "service nginx start" | |||
then paste the following config in the vHost-conf: | |||
mv /etc/nginx/sites-available/signaling /tmp/signaling.bak && nano /etc/nginx/sites-available/signaling | |||
upstream signaling { | |||
server 127.0.0.1:8080; | |||
} | |||
server { server_name signaling.example.com; | |||
listen 443 ssl; # managed by Certbot | |||
ssl_certificate /etc/letsencrypt/live/signaling.example.com/fullchain.pem; # managed by Certbot | |||
ssl_certificate_key /etc/letsencrypt/live/signaling.example.com/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 add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"; | |||
location /standalone-signaling/ { | |||
proxy_pass http://signaling/; | |||
proxy_http_version 1.1; | |||
proxy_set_header Host $host; | |||
proxy_set_header X-Real-IP $remote_addr; | |||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } | |||
location /standalone-signaling/spreed { | |||
proxy_pass http://signaling/spreed; | |||
proxy_http_version 1.1; | |||
proxy_set_header Upgrade $http_upgrade; | |||
proxy_set_header Connection "Upgrade"; | |||
proxy_set_header Host $host; | |||
proxy_set_header X-Real-IP $remote_addr; | |||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } | |||
} | |||
server { | |||
if ($host = signaling.example.com) { | |||
return 301 https://$host$request_uri; } # managed by Certbot | |||
listen 80; | |||
server_name signaling.example.com; return 404; # managed by Certbot | |||
} | |||
and check an reload nginx: | |||
nginx -t | |||
if ok | |||
systemctl reload nginx | |||
=== Configure nextcloud to use stun/turn and signaling server === | |||
Go to Settings, Talk and enter the following: | |||
= Spreed standalone signaling server = | |||
This repository contains the standalone signaling server which can be used for Nextcloud Talk ([https://apps.nextcloud.com/apps/spreed https://apps.nextcloud.com/apps/spreed]). | |||
See [https://nextcloud-talk.readthedocs.io/en/latest/standalone-signaling-api-v1/ https://nextcloud-talk.readthedocs.io/en/latest/standalone-signaling-api-v1/] for further information on the API of the signaling server. | |||
== Building == | |||
The following tools are required for building the signaling server.* git | |||
* go >= 1.10 | |||
* make | |||
All other dependencies are fetched automatically while building. | |||
$ make build | |||
or on FreeBSD | |||
$ gmake build | |||
Afterwards the binary is created as <tt>bin/signaling</tt>. | |||
== Configuration == | |||
A default configuration file is included as <tt>server.conf.in</tt>. Copy this to <tt>server.conf</tt> and adjust as necessary for the local setup. See the file for comments about the different parameters that can be changed. | |||
== Running == | |||
The signaling server connects to a NATS server ([https://nats.io/ https://nats.io/]) to distribute messages between different instances. See the NATS documentation on how to set up a server and run it. | |||
Once the NATS server is running (and the URL to it is configured for the signaling server), you can start the signaling server. | |||
$ ./bin/signaling | |||
By default, the configuration is loaded from <tt>server.conf</tt> in the current directory, but a different path can be passed through the <tt>--config</tt> option. | |||
$ ./bin/signaling --config /etc/signaling/server.conf | |||
=== Running as daemon === | |||
==== systemd ==== | |||
Create a dedicated user: | |||
sudo useradd --system \ | |||
--gid signaling \ | |||
--shell /usr/sbin/nologin \ | |||
--comment "Standalone signaling server for Nextcloud Talk." \ | |||
signaling | |||
Copy <tt>server.conf.in</tt> to <tt>/etc/signaling/server.conf</tt> and fix permissions: | |||
sudo chmod 600 /etc/signaling/server.conf | |||
sudo chown signaling: /etc/signaling/server.conf | |||
Copy <tt>dist/init/systemd/signaling.service</tt> to <tt>/etc/systemd/system/signaling.service</tt> (adjust abs. path in <tt>ExecStart</tt> to match your binary location!) | |||
Enable and start service: | |||
systemctl enable signaling.service | |||
systemctl start signaling.service | |||
== Setup of NATS server == | |||
There is a detailed description on how to install and run the NATS server available at [http://nats.io/documentation/tutorials/gnatsd-install/ http://nats.io/documentation/tutorials/gnatsd-install/] | |||
You can use the <tt>gnatsd.conf</tt> file as base for the configuration of the NATS server. | |||
== Setup of Janus == | |||
A Janus server (from [https://github.com/meetecho/janus-gateway 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 <tt>VideoRoom</tt> plugin and the websocket transport of Janus must be enabled. | |||
The signaling server uses the <tt>VideoRoom</tt> 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 <tt>server.conf</tt> and enter the URL to the websocket endpoint of Janus in the section <tt>[mcu]</tt> and key <tt>url</tt>. 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 <tt>[mcu]</tt>, see properties <tt>maxstreambitrate</tt> and <tt>maxscreenbitrate</tt>. | |||
=== Use multiple Janus servers === | |||
To scale the setup and add high availability, a signaling server can connect to one or multiple proxy servers that each provide access to a single Janus server. | |||
For that, set the <tt>type</tt> key in section <tt>[mcu]</tt> to <tt>proxy</tt> and set <tt>url</tt> to a space-separated list of URLs where a proxy server is running. | |||
Each signaling server that connects to a proxy needs a unique token id and a public / private RSA keypair. The token id must be configured as <tt>token_id</tt> in section <tt>[mcu]</tt>, the path to the private key file as <tt>token_key</tt>. | |||
=== Setup of proxy server === | |||
The proxy server is built with the standard make command <tt>make build</tt> as <tt>bin/proxy</tt> binary. Copy the <tt>proxy.conf.in</tt> as <tt>proxy.conf</tt> and edit section <tt>[tokens]</tt> to the list of allowed token ids and filenames of the public keys for each token id. See the comments in <tt>proxy.conf.in</tt> for other configuration options. | |||
When the proxy process receives a <tt>SIGHUP</tt> signal, the list of allowed token ids / public keys is reloaded. A <tt>SIGUSR1</tt> signal can be used to shutdown a proxy process gracefully after all clients have been disconnected. No new publishers will be accepted in this case. | |||
== Setup of frontend webserver == | |||
Usually the standalone signaling server is running behind a webserver that does the SSL protocol or acts as a load balancer for multiple signaling servers. | |||
The configuration examples below assume a pre-configured webserver (nginx or Apache) with a working HTTPS setup, that is listening on the external interface of the server hosting the standalone signaling server. | |||
After everything has been set up, the configuration can be tested using <tt>curl</tt>: | |||
$ curl -i https://myserver.domain.invalid/standalone-signaling/api/v1/welcome | |||
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"} | |||
=== nginx === | |||
Nginx can be used as frontend for the standalone signaling server without any additional requirements. | |||
The backend should be configured separately so it can be changed in a single location and also to allow using multiple backends from a single frontend server. | |||
Assuming the standalone signaling server is running on the local interface on port <tt>8080</tt> below, add the following block to the nginx server definition in <tt>/etc/nginx/sites-enabled</tt> (just before the <tt>server</tt> definition): | |||
upstream signaling { | |||
server 127.0.0.1:8080; | |||
} | |||
To proxy all requests for the standalone signaling to the correct backend, the following <tt>location</tt> block must be added inside the <tt>server</tt> definition of the same file: | |||
location /standalone-signaling/ { | |||
proxy_pass http://signaling/; | |||
proxy_http_version 1.1; | |||
proxy_set_header Host $host; | |||
proxy_set_header X-Real-IP $remote_addr; | |||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | |||
} | |||
location /standalone-signaling/spreed { | |||
proxy_pass http://signaling/spreed; | |||
proxy_http_version 1.1; | |||
proxy_set_header Upgrade $http_upgrade; | |||
proxy_set_header Connection "Upgrade"; | |||
proxy_set_header Host $host; | |||
proxy_set_header X-Real-IP $remote_addr; | |||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | |||
} | |||
Example (e.g. <tt>/etc/nginx/sites-enabled/default</tt>): | |||
upstream signaling { | |||
server 127.0.0.1:8080; | |||
} | |||
server { | |||
listen 443 ssl http2; | |||
server_name myserver.domain.invalid; | |||
<nowiki># ... other existing configuration ...</nowiki> | |||
location /standalone-signaling/ { | |||
proxy_pass http://signaling/; | |||
proxy_http_version 1.1; | |||
proxy_set_header Host $host; | |||
proxy_set_header X-Real-IP $remote_addr; | |||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | |||
} | |||
location /standalone-signaling/spreed { | |||
proxy_pass http://signaling/spreed; | |||
proxy_http_version 1.1; | |||
proxy_set_header Upgrade $http_upgrade; | |||
proxy_set_header Connection "Upgrade"; | |||
proxy_set_header Host $host; | |||
proxy_set_header X-Real-IP $remote_addr; | |||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | |||
} | |||
} | |||
=== Apache === | |||
To configure the Apache webservice as frontend for the standalone signaling server, the modules <tt>mod_proxy_http</tt> and <tt>mod_proxy_wstunnel</tt> must be enabled so WebSocket and API backend requests can be proxied: | |||
# a2enmod proxy | |||
# a2enmod proxy_http | |||
# a2enmod proxy_wstunnel | |||
Now the Apache <tt>VirtualHost</tt> configuration can be extended to forward requests to the standalone signaling server (assuming the server is running on the local interface on port <tt>8080</tt> below): | |||
<VirtualHost *:443> | |||
<nowiki># ... existing configuration ...</nowiki> | |||
<nowiki># Enable proxying Websocket requests to the standalone signaling server.</nowiki> | |||
ProxyPass "/standalone-signaling/" "ws://127.0.0.1:8080/" | |||
RewriteEngine On | |||
<nowiki># Websocket connections from the clients.</nowiki> | |||
RewriteRule ^/standalone-signaling/spreed$ - [L] | |||
<nowiki># Backend connections from Nextcloud.</nowiki> | |||
RewriteRule ^/standalone-signaling/api/(.*) http://127.0.0.1:8080/api/$1 [L,P] | |||
<nowiki># ... existing configuration ...</nowiki> | |||
</VirtualHost> | |||
=== Caddy === | |||
==== v1 ==== | |||
[https://caddyserver.com/v1/ Caddy (v1)] configuration: | |||
myserver.domain.invalid { | |||
proxy /standalone-signaling/ http://127.0.0.1:8080 { | |||
without /standalone-signaling | |||
transparent | |||
websocket | |||
} | |||
} | |||
==== v2 ==== | |||
[https://caddyserver.com/ Caddy (v2)] configuration: | |||
myserver.domain.invalid { | |||
route /standalone-signaling/* { | |||
uri strip_prefix /standalone-signaling | |||
reverse_proxy /standalone-signaling/* http://127.0.0.1:8080 | |||
} | |||
} | |||
== Setup of Nextcloud Talk == | |||
* Login to your Nextcloud as admin and open the additional settings page. | |||
* Scroll down to the "Talk" section and enter the base URL of your standalone signaling server in the field "External signaling server". | |||
* Please note that you have to use <tt>https</tt> if your Nextcloud is also running on <tt>https</tt>. | |||
* Usually you should enter <tt>https://myhostname/standalone-signaling</tt> as URL. | |||
* The value "Shared secret for external signaling server" must be the same as the property <tt>secret</tt> in section <tt>backend</tt> of your <tt>server.conf</tt>. | |||
* If you are using a self-signed certificate for development, you need to uncheck the box <tt>Validate SSL certificate</tt> so backend requests from Nextcloud to the signaling server can be performed. | |||
== 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 <tt>src/client</tt> 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 <tt>hello</tt> request. Therefore the signaling server should be configured to allow all backend hosts (option <tt>allowall</tt> in section <tt>backend</tt>). | |||
The client is not compiled by default, but can be using the <tt>client</tt> 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) | |||
== Running multiple signaling servers == | |||
'''IMPORTANT''' | |||
This is considered experimental and might not work with all functionality of the signaling server, especially when using the Janus integration. | |||
* The signaling server uses the NATS server to send messages to peers that are not connected locally. | |||
* Therefore multiple signaling servers running on different hosts can use the same NATS server to build a simple cluster, allowing more simultaneous connections and distribute the load. | |||
* To set this up, make sure all signaling servers are using the same settings for their <tt>session</tt> keys and the <tt>secret</tt> in the <tt>backend</tt> section. | |||
* Also the URL to the NATS server (option <tt>url</tt> in section <tt>nats</tt>) must point to the same NATS server. | |||
* If all this is setup correctly, clients can connect to either of the signaling servers and exchange messages between them. | |||
[[Kategorie:Nextcloud/Talk]] |
Aktuelle Version vom 6. November 2024, 12:52 Uhr
topic - Kurzbeschreibung
Beschreibung
- Der Signaling-Server (https://github.com/strukturag/nextcloud-spreed-signaling) 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.
Vor kurzem wurde die Software zum Betrieb von Nextcloud Talk in größeren Nextcloudumgebungen als Open Source veröffentlicht: man braucht einen eigenen Signalisierungsserver, um mit mehreren Leuten parallel effektiv über Nextcloud Talk arbeiten zu können.
- Per Default wird der interne verwendet.
- Aufsetzen des Signalisierungsservers: https://github.com/strukturag/nextcloud-spreed-signaling
Installation
Voraussetzungen
Server
- 4 CPU Cores
- 16 GB RAM
- 1 GBit/s Netzwerk (Up und Down)
Darunter ist mit Einbußen bei Geschwindigkeit und Teilnehmerzahl zu rechnen.
Software/Webserver/Domain
- Nextcloud Talk Installation mit coturn
- DNS-Subdomain für den Signaling Server
- Webserver-Konfiguration, die diese Domain bereits mit einem validen SSL-Zertifikat bedient.
Einen STUN Server als auch den Signalisierungsserver auf eigenen VMs betreiben.
- Den STUN Server sollte man bereits auf einer anderen Maschine gesondert betreiben:
Szenario
Nextcloud-Server
nextcloud.meinedomain.de
TURN-Server (coturn)
turn.meinedomain.de
Signaling Server
signaling.meinedomain.de
Zur Installation des Servers wird das Paket golang-go benötigt, welches über die Paketverwaltung installiert werden kann:
# apt install golang-go protobuf-compiler
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
Der anschließende Befehl make build erstellt das Programm bin/signaling
# cd /usr/src/nextcloud-spreed-signaling # make build
Konfiguration
# mkdir -p /etc/signaling # cp /usr/src/nextcloud-spreed-signaling/server.conf.in /etc/signaling/server.conf
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
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
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 ...
Starten des Signaling-Servers
Ist Janus-Server bereits gestartet, kann der Signaling-Server für einen Test direkt aufgerufen werden:
# 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:
# 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 und 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
Test und Benchmarking
Benchmark client
Installation
Zum Testen des Signaling-Servers wird ein einfaches Client-Programm zur Verfügung gestellt, welches jedoch zuvor kompiliert werden muß:
$ cd /usr/src/nextcloud-spreed-signaling/ $ make client
Konfiguration
Das Programm befindet sich im Anschluß im Verzeichnis /usr/src/nextcloud-spreed-signaling/bin/ und kann mit folgenden Optionen ausgeführt werden:
- -addr <http-Service-Adresse> (Standard ist localhost:28080)
- -config <Konfigurationsdatei>
- -maxClients <Anzahl der Client-Verbindungen> (Standardwert ist 100)
Anwendung
- Vor dem Ausführen des Programms muss die Konfigurationsdatei des Signaling-Servers dahin gehend editiert werden, dass nicht nur das eigentliche Backend zugelassen wird, sondern alle. Dazu muss in der Datei /etc/signaling/server.conf der Eintrag "allowall = true" vorhanden sein.
Nachdem Neustart des Signaling-Servers kann der Test-Client gestartet werden:
# systemctl restart signaling # client -addr localhost:8080 -config /etc/signaling/server.conf
Bewertung der Ergebinisse
Bei der derzeitigen Implementierung des (laufenden) Signaling-Servers werden jedoch Fehler erzeugt:
2021-02-01 12:53:51.717590 I | Using a maximum of 1 CPUs 2021-02-01 12:53:51.717978 I | Backend server running on http://95.217.178.11:33031 2021-02-01 12:53:51.718066 I | Connecting to [ws://localhost:8080/spreed] 2021-02-01 12:53:51.718130 I | Starting 100 clients 2021-02-01 12:53:51.720849 I | Unsupported message type: {Id: Type:error Error:Incomplete OCS response Hello:<nil> Bye:<nil> Room:<nil> Message:<nil> Control:<nil> Event:<nil>} ... 2021-02-01 12:53:51.856629 I | Unsupported message type: {Id: Type:error Error:Incomplete OCS response Hello:<nil> Bye:<nil> Room:<nil> Message:<nil> Control:<nil> Event:<nil>} 2021-02-01 12:53:51.857998 I | Clients created 2021-02-01 12:53:51.859424 I | Unsupported message type: {Id: Type:error Error:Incomplete OCS response Hello:<nil> Bye:<nil> Room:<nil> Message:<nil> Control:<nil> Event:<nil>} 2021-02-01 12:53:54.072980 I | Received bye: &{Reason:hello_timeout} ... 2021-02-01 12:53:54.090515 I | Received bye: &{Reason:hello_timeout}
Die Ausgabe einer erfolgreichen Programmausführung ist folgend gezeigt (die user-ID's der sample-user wurden stark verkürzt):
$ ./client -addr localhost:8081 -config /etc/signaling/server.conf 2021-02-01 13:02:45.432124 I | Using a maximum of 2 CPUs 2021-02-01 13:02:45.433055 I | Backend server running on http://192.168.178.63:40305 2021-02-01 13:02:45.433136 I | Connecting to [ws://localhost:8081/spreed] 2021-02-01 13:02:45.433157 I | Starting 100 clients 2021-02-01 13:02:45.448228 I | Registered as MTYxMjE4MDk2NXxaUXQxVEVydXVxLXEwZm1zRZUdHQmyVW (userid sample-user) 2021-02-01 13:02:45.450357 I | Registered as MTYxMjE4MDk2NXw1aHRKWU14TWxoWWwyaM2ZhQTy88IIDt (userid sample-user) ... 2021-02-01 13:02:45.584143 I | Registered as MTYxMjE4MDk2NXxsUXVtblgyM0stanRGWDBDVlU1CaFRYO (userid sample-user) 2021-02-01 13:02:45.585374 I | Clients created 2021-02-01 13:02:45.585884 I | Registered as MTYxMjE4MDk2NXxMOTJzNkV1UkJMNGlueGR5OjOcJwcQiv (userid sample-user) 2021-02-01 13:02:45.586546 I | Registered as MTYxMjE4MDk2NXxkMmNLaHZVamY5OWpsWEJmDYeRaCx7L0 (userid sample-user) 2021-02-01 13:02:45.586572 I | All connections established 2021-02-01 13:02:55.589250 I | Stats: sent=386158 (38615/sec), recv=386154 (38615/sec), delta=4 2021-02-01 13:03:05.587561 I | Stats: sent=766105 (42216/sec), recv=765975 (42202/sec), delta=130 ... 2021-02-01 13:04:15.586929 I | Stats: sent=3377364 (40248/sec), recv=3376924 (40219/sec), delta=440 2021-02-01 13:04:25.589070 I | Stats: sent=3754158 (37679/sec), recv=3754115 (37719/sec), delta=43 ^C2021-02-01 13:04:31.612013 I | Interrupted 2021-02-01 13:04:31.612031 I | Waiting for clients to terminate ...
Signaling Server als Systemdienst
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
- Damit der Signaling Server nicht jedesmal über die Konsole im Vordergrund gestartet werden muss, sollte dieser als Systemdienst installiert werden.
- Dazu stoppen wir erst einmal die Konsolen-Instanz.
- Zunächst legen wir uns einen speziellen User für den Signaling Server an:
groupadd signaling useradd --system --gid signaling --shell /usr/sbin/nologin --comment "Standalone signaling server for Nextcloud Talk." signaling
- Anschließend wird die Konfigurationsdatei des Servers noch an einen anderen Ort kopiert (damit diese zum Beispiel bei einem Update nicht überschrieben wird).
- Ebenso werden die entsprechenden Berechtigungen gesetzt:
mkdir -p /etc/signaling cp server.conf /etc/signaling/server.conf chmod 600 /etc/signaling/server.conf chown signaling: /etc/signaling/server.conf
- Nun editieren wir noch die Datei für den Systemdienst:
vi dist/init/systemd/signaling.service [Unit] Description=Nextcloud Talk signaling server [Service] ExecStart=/etc/nextcloud-spreed-signaling/bin/signaling --config /etc/signaling/server.conf User=signaling Group=signaling Restart=on-failure [Install] WantedBy=multi-user.target
Der Dienst wird im System registriert und aktiviert:
cp dist/init/systemd/signaling.service /etc/systemd/system/signaling.service systemctl enable signaling.service systemctl start signaling.service
Anschließend wird der Signaling Server bei jedem Systemstart gestartet.
Anwendung
Sicherheit
Dokumentation
RFC
Man-Page
Info-Pages
Projekt
Links
Siehe auch
Weblinks
TMP
Installation der Services
Den Signaling Server direkt von Github selbst kompilieren:
# apt install git automake golang build-essential certbot nginx apt-transport-https ca-certificates curl gnupg-agent software-properties-common # cd /usr/src # git clone https://github.com/strukturag/nextcloud-spreed-signaling.git # cd nextcloud-spreed-signaling # make build # cp bin/signaling /usr/bin/
Nun die Konfigurationsdatei aus dem Repo an die richtige Stelle kopieren.:
mkdir /etc/signaling/ cp server.conf.in /etc/signaling/server.conf
Anlegen eines users:
useradd --system --shell /usr/sbin/nologin --comment "Standalone signaling server for Nextcloud Talk." signaling chown signaling: /etc/signaling/server.conf chmod 600 /etc/signaling/server.conf
Anschließend den Service für den Signaling Server einrichten und vorher natürlich die Systemd Datei entsprechend eurer Pfade anpassen, wenn abweichend:
cp dist/init/systemd/signaling.service /etc/systemd/system/signaling.service systemctl daemon-reload systemctl enable signaling
Konfiguration des Signaling Servers
Abschließend müssen wir den Signaling Server noch konfigurieren:
vi /etc/signaling/server.conf
- hashkey mit openssl rand -hex 16 generieren
- blockkey mit openssl rand -hex 16 generieren
- internalsecret ebenfalls mit einem String Generator setzen
- unter allowed alle Hostnamen eintragen, die dieses Backend verwenden dürfen
- direkt darunter bei secret ein Secret generieren:
Das wird später bei Nextcloud in den Settings eingetragen
- connectionsperhost sollte adaptiert werden
- unter nats wird die url so gesetzt: url = nats://localhost:4222
- bei mcu wird die url so gesetzt: url = ws://0.0.0.0:8188 (Janus läuft nicht localhost, ist noch ein offenes Security Thema)
- unter turn wird apikey mit dem gleichen Wert vom Janus Server (turn_rest_api_key) gesetzt
- das secret in der Rubrik turn bekommt den gleichen Wert wie static-auth-secret des Turnserver gesetzt
- bei servers werden alle Turnserver kommasepariert so gesetzt: turn:116.202.113.XXX:5349?transport=tcp
Nun sollte
# systemctl status signaling
erfolgreich sein.
Nextcloud Integration
Installiert die Beta Version von Nextcloud Talk – am besten zum Testen mal in einer eigenen Installation auf dem Beta Release Channel für Nextcloud 19.
- In den Einstellungen von Nextcloud im Reiter Talk nun folgende Konfiguration setzen:
STUN und Signaling Server
- Das gemeinsame Geheimnis ist das secret aus der Signaling Server conf
Apache
Um den Apache-Webservice als Frontend für den eigenständigen 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
Jetzt kann die Apache VirtualHost -Konfiguration erweitert werden, um Anforderungen an den eigenständigen Signalisierungsserver weiterzuleiten (vorausgesetzt, der Server wird auf der lokalen Schnittstelle an Port 8080 unten ausgeführt):
<VirtualHost *:443> # ... existing configuration ... # Enable proxying Websocket requests to the standalone signaling server. ProxyPass "/standalone-signaling/" "ws://127.0.0.1:8080/" RewriteEngine On # Websocket connections from the clients. RewriteRule ^/standalone-signaling/spreed$ - [L] # Backend connections from Nextcloud. RewriteRule ^/standalone-signaling/api/(.*) http://127.0.0.1:8080/api/$1 [L,P] # ... existing configuration ... </VirtualHost>
Einrichtung des Frontend-Webservers
Normalerweise wird der eigenständige Signalisierungsserver hinter einem Webserver ausgeführt, der das SSL-Protokoll ausführt oder als Load Balancer für mehrere Signalisierungsserver fungiert.
In den folgenden Konfigurationsbeispielen wird von einem vorkonfigurierten Webserver (Nginx oder Apache) mit einem funktionierenden HTTPS-Setup ausgegangen, der die externe Schnittstelle des Servers überwacht, auf dem sich der eigenständige Signalisierungsserver befindet.
Nachdem alles eingerichtet wurde, kann die Konfiguration mit curl getestet werden:
$ curl -i https: //myserver.domain.invalid/standalone-signaling/api/v1/welcome HTTP / 1.1 200 OK Datum: Do, 05. Juli 2018 09:28:08 GMT Server: nextcloud-spreed-signalisierung / 1.0 .0 Inhaltstyp: application / json; Zeichensatz = utf-8 Inhaltslänge: 59
{"nextcloud-spreed-signalisierung": "Willkommen", "Version": "1.0.0"}
Einrichtung von Nextcloud Talk
Melden Sie sich bei Ihrer Nextcloud als Administrator an und öffnen Sie die Seite mit den zusätzlichen Einstellungen. Scrollen Sie zum Abschnitt "Talk" und geben Sie die Basis-URL Ihres eigenständigen Signalisierungsservers in das Feld "Externer Signalisierungsserver" ein. Bitte beachten Sie, dass Sie https verwenden müssen, wenn Ihre Nextcloud auch unter https ausgeführt wird. Normalerweise sollten Sie https: // myhostname / Standalone-Signaling als URL eingeben. Der Wert "Shared Secret für externen Signalisierungsserver" muss mit dem Eigenschaftsgeheimnis im Abschnitt "Backend" Ihrer server.conf übereinstimmen. Wenn Sie ein selbstsigniertes Zertifikat für die Entwicklung verwenden, müssen Sie das Kontrollkästchen SSL-Zertifikat validieren deaktivieren, damit Backend-Anforderungen von Nextcloud an den Signalisierungsserver ausgeführt werden können.
Benchmarking des Servers
Es gibt einen einfachen Client zum Benchmarking des Servers. Beachten Sie, dass die Benchmarking-Funktionen möglicherweise nicht die gesamte Funktionalität abdecken. Überprüfen Sie die Implementierung in src / client auf Details zum Client.
Um neue Clientverbindungen zum Signalisierungsserver zu authentifizieren, startet der Client einen Dummy-Authentifizierungshandler auf einer lokalen Schnittstelle und übergibt die URL in der Hallo-Anforderung. Daher sollte der Signalisierungsserver so konfiguriert sein, dass alle Backend-Hosts zulässig sind (Option allowall im Abschnitt backend).
Der Client wird nicht standardmäßig kompiliert, kann jedoch das Clientziel verwenden:
$ Client machen Verwendung:
$ ./bin/client Verwendung von ./bin/client:
-addr string http-Dienstadresse (Standard "localhost: 28080") -config string Zu verwendende Konfigurationsdatei (Standard "server.conf") -maxClients int Anzahl der Clientverbindungen (Standard 100)
TMP 2
Nextcloud Signaling Server (High Performance Backend)
Signaling Server installieren
Der Signaling Server (das High Performance Backend für Nextcloud) besteht aus mehreren Komponenten:
- Signaling Server
- Janus (WebRTC Server)
- NATS-Server
Notwendigen Keys
Erzeugen
- Janus API-Key:
openssl rand -base64 16
- Hash-Key:
openssl rand -hex 16
- Block-Key:
openssl rand -hex 16
- Nextcloud Secret Key:
openssl rand -hex 16
Bereitstellen
- Turn-Server-Key
static-auth-secret aus /etc/turnserver.conf
Im Weiteren wird auf diese Keys verwiesen (zum Beispiel: <Janus API-Key>)
Signaling Server
apt install golang-go
cd /usr/src git clone https://github.com/strukturag/nextcloud-spreed-signaling.git cd /usr/src/nextcloud-spreed-signaling make build
Konfigurations-Datei angepassen
cd /usr/src/nextcloud-spreed-signaling cp server.conf.in server.conf
- server.conf
listen = 127.0.0.1:8080 hashkey = <Hash-Key> blockkey = <Block-Key> backends = backend1 [backend1] # URL of the Nextcloud instance url = https://cloud.meinedomain.de # Shared secret for requests from and to the backend servers. # This must be the same value as configured in the Nextcloud admin ui. secret = <Nextcloud Secret Key> # Verbindung zum Websocket von Janus url = ws://127.0.0.1:8188 apikey = <Janus API-Key> secret = <Turn-Server-Key> servers = turn:turn.meinedomain.de:5349?transport=udp,turn:turn.meinedomain.de:5349?transport=tcp
Hinweis: Die Variable allowall sollte aus Gründen der Sicherheit in dieser Konfoguration immer auf false gesetzt werden. Die einzige Ausnahme besteht zum Testen des Signaling Servers mittels des mitgelieferten Clients (siehe unten).
Bevor wir den Signaling Server nun starten können, müssen die restlichen Programme installiert werden.
Janus
Die Installation erfolgt hier über einen Befehl:
apt install janus
Anschließend müssen hier ebenfalls die Konfigurations-Dateien bearbeitet werden:
vi /etc/janus/janus.jcfg
Hier konfigurieren wir den STUN-Server (coturn), aktivieren die Option „Full Trickle“ und tragen den API-Key ein:
# ... stun_server = "turn.meinedomain.de" stun_port = 5349 # ... full_trickle = true # ... turn_rest_api_key = "<Janus API-Key>" # ...
Anschließend wird Janus so konfiguriert, dass es nur lokal (das heißt nicht über das Netzwerk) angesprochen werden kann:
vi /etc/janus/janus.transport.http.jcfg
Das Interface wird dabei auf „lo“ gesetzt:
# ... interface = "lo" # ..
Das gleiche wird auch für den Websocket gemacht:
vi /etc/janus/janus.transport.websockets.jcfg # ... ws_interface = "lo" # ...
NATS
Starten des Signaling Servers
Nun kommt der spannende Teil: Wir starten zum ersten mal den Signaling Server!Dazu wird erst einmal der Janus-Dienst neu gestartet:
service janus restart
Anschließend wird das Programm für einen ersten Test im Vordergrund aufgerufen:
cd /etc/nextcloud-spreed-signaling ./bin/signaling --config server.conf
Hier wird sehr viel Output erzeugt, aber es sollten keine Fehler darunter zu finden sein.
Signaling Server als Systemdienst
- Damit der Signaling Server nicht jedes Mal über die Konsole im Vordergrund gestartet werden muss, sollte dieser als Systemdienst installiert werden.
- Dazu stoppen wir erst einmal die Konsolen-Instanz.
- Zunächst legen wir uns einen speziellen User für den Signaling Server an:
groupadd signaling useradd --system --gid signaling --shell /usr/sbin/nologin --comment "Standalone signaling server for Nextcloud Talk." signaling
- Anschließend wird die Konfigurationsdatei des Servers noch an einen anderen Ort kopiert (damit diese zum Beispiel bei Update nicht überschrieben wird).
- Ebenso werden die entsprechenden Berechtigungen gesetzt:
mkdir -p /etc/signaling cp server.conf /etc/signaling/server.conf chmod 600 /etc/signaling/server.conf chown signaling: /etc/signaling/server.conf
- Nun editieren wir noch die Datei für den Systemdienst:
vi dist/init/systemd/signaling.service [Unit] Description=Nextcloud Talk signaling server [Service] ExecStart=/etc/nextcloud-spreed-signaling/bin/signaling --config /etc/signaling/server.conf User=signaling Group=signaling Restart=on-failure [Install] WantedBy=multi-user.target
Der Dienst wird im System registriert und aktiviert:
cp dist/init/systemd/signaling.service /etc/systemd/system/signaling.service systemctl enable signaling.service systemctl start signaling.service
Anschließend wird der Signaling Server immer beim Systemstart mit geladen.
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.
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).
Signalisierungsserver für Nextcloud
Vor kurzem wurde die Software zum Betrieb von Nextcloud Talk in größeren Nextcloudumgebungen als Open Source veröffentlicht: man braucht einen eigenen Signalisierungsserver, um mit mehreren parallel Leuten effektiv über Nextcloud Talk arbeiten zu können.
- Per Default wird der interne verwendet.
- Wie wird dieser Signalisierungsserver nun aufgesetzt?
Voraussetzungen
Ich würde sowohl einen STUN Server als auch den Signalisierungsserver auf eigenen VMs betreiben.
- Ich würde hier direkt die Hetzner Cloud empfehlen: preiswert, performant und sehr einfach zum Hochskalieren.
- Zwei kleine Maschinen reichen für den Anfang.
- Den STUN Server solltest du bereits auf einer anderen Maschine gesondert fertig installiert haben.
Bitte beachte, dass ich bisher auch nur einen laufenden Signalisierungsserver hinbekommen habe, aber noch nicht tiefer getestet und Security Hardening betrieben habe.
- Es sind die ersten Gehversuche, die ich hier zeigen möchte.
Installation der Services
Ich gehe hier von Debian 10 aus.
- Als erstes solltest du Docker, nginx und sonstige Grundprogramme wie git, unzip etc.
- installiert haben.
Den Signaling Server direkt von Github selbst kompilieren:
apt install git automake golang build-essential certbot nginx apt-transport-https ca-certificates curl gnupg-agent software-properties-common git clone https://github.com/strukturag/nextcloud-spreed-signaling.git cd nextcloud-spreed-signaling/ make build cp bin/signaling /usr/bin/
Nun die Konfigurationsdatei aus dem Repo an die richtige Stelle kopieren.:
mkdir /etc/signaling/ cp server.conf.in /etc/signaling/server.conf useradd --system --shell /usr/sbin/nologin --comment "Standalone signaling server for Nextcloud Talk." signaling
chown signaling: /etc/signaling/server.conf chmod 600 /etc/signaling/server.conf
Anschließend den Service für den Signaling Server einrichten und vorher natürlich die Systemd Datei entsprechend eurer Pfade anpassen, wenn abweichend:
cp dist/init/systemd/signaling.service /etc/systemd/system/signaling.service systemctl daemon-reload systemctl enable signaling
Nun müssen wir die einzelnen Services für den Signaling Server aufsetzen.
- Zunächst den NATS Server, den ich der Einfachheit halber mit Docker installiert habe, da es kein Repo gibt:
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add - add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian \ $(lsb_release -cs) \ stable" apt-get update apt-get install docker-ce docker-ce-cli containerd.io docker run --restart=always --name='natsserver' -d -p 4222:4222 -ti nats:latest
Außerdem brauchen wir einen Janus Server:
apt install janus
Nun muss der Service konfiguriert werden: nano /etc/janus/janus.jcfgHier habe ich mich an diese Anleitung gehalten und folgende Werte gesetzt: turn_rest_api_key (mittels openssl rand -base64 16 erstellen, ist derselbe String wie bei apikey in der signaling conf!), full_trickle = true und die ssl Zeilen auskommentieren.
general: { configs_folder = "/etc/janus" # Configuration files folder plugins_folder = "/usr/lib/x86_64-linux-gnu/janus/plugins" # Plugins folder transports_folder = "/usr/lib/x86_64-linux-gnu/janus/transports" # Transports folder events_folder = "/usr/lib/x86_64-linux-gnu/janus/events" # Event handlers folder debug_level = 4 # Debug/logging level, valid values are 0-7 server_name = "Janus Speibox"# Public name of this Janus instance } # Certificate and key to use for DTLS (and passphrase if needed). #certificates: { # cert_pem = "/etc/ssl/certs/ssl-cert-snakeoil.pem" # cert_key = "/etc/ssl/certs/ssl-cert-snakeoil.key" #cert_pwd = "secretpassphrase" #} nat: { nice_debug = false full_trickle = true turn_rest_api_key = "apikey from server.conf" }
Damit kann der Dienst gestartet werden.
Es braucht natürlich noch einen coturn Server.
- Dieser wird ganz simpel mit apt install coturn installiert und sollte wie bereits erwähnt nach dieser Anleitung schon installiert sein.
Konfiguration des Signaling Servers
Abschließend müssen wir den Signaling Server noch konfigurieren: nano /etc/signaling/server.conf:* hashkey mit openssl rand -hex 16 generieren
- blockkey mit openssl rand -hex 16 generieren
- internalsecret ebenfalls mit einem String Generator setzen
- unter allowed alle Hostnamen eintragen, die dieses Backend verwenden dürfen
- direkt darunter bei secret ein Secret generieren.
- Das wird später bei Nextcloud in den Settings eingetragen
- connectionsperhost sollte adaptiert werden
- unter nats wird die url so gesetzt: url = nats://localhost:4222
- bei mcu wird die url so gesetzt: url = ws://0.0.0.0:8188 (Janus läuft nicht localhost, ist noch ein offenes Security Thema)
- unter turn wird apikey mit dem gleichen Wert vom Janus Server (turn_rest_api_key) gesetzt
- das secret in der Rubrik turn bekommt den gleichen Wert wie static-auth-secret des Turnserver gesetzt
- bei servers werden alle Turnserver kommasepariert so gesetzt: turn:116.202.113.XXX:5349?transport=tcp
Nun sollte service signaling start erfolgreich sein.
Nextcloud Integration
Installiert die Beta Version von Nextcloud Talk – am besten zum Testen mal in einer eigenen Installation auf dem Beta Release Channel für Nextcloud 19 (für Nextcloud 18 habe ich das nicht probiert).
- In den Einstellungen von Nextcloud im Reiter Talk nun folgende Konfiguration setzen:
STUN und Signaling Server laufen bei mir auf getrennten Maschinen.
- Das Gemeinsame Geheimnis ist das secret aus der Signaling Server conf.
Quelle: https://nichteinschalten.de/signalisierungsserver-fuer-nextcloud-aufsetzen-how-to/
Install Nextcloud Talk High Performance Backend with Stun/Turnserver
- Nextcloud has released the High Performance Backend as OpenSource under AGPL License
Anforderungen
- shell access
- appropriate rights– One DNS A and possibly AAAA record for our nginx vhost and stun/turn-server
- I use signaling.example.com for all three services in this guide
- Optional
- a second DNS A and possibly AAAA record for stun/turnserver
Hardware Anforderungen
- 4 CPU
- 8 GB RAM
- 32 GB Disk-Space
You can also test a smaller server if you don’t have that many users
- See also
Arbeitsschritte
Install Firewall and other packages
First of all, you should install a firewall to secure your VPS (if not installed) and allow incoming traffic to port 80/443 and 22 (ssh) only.
- For Securing ssh-access you can use fail2ban and passwordless authentication.
- Many guides for this are out there.
apt install ufw -y ufw allow http ufw allow https ufw allow ssh ufw allow 5349/tcp ufw allow 5349/udp ufw enable
Accept with „y“
Install and config stun/turnserver
you have to install the package coturn:
apt install coturn
enable daemonizing for your turnserver:
sed -i '/TURNSERVER_ENABLED/c\TURNSERVER_ENABLED=1' /etc/default/coturn
create a random hex key for your nextcloud talk app and signaling server with:
openssl rand -hex 32
and copy it for later use, then edit /etc/turnserver.conf:
mv /etc/turnserver.conf /etc/turnserver.conf.bak && nano /etc/turnserver.conf
copy, paste and adjust the following code:
listening-port=5349 fingerprint lt-cred-mech use-auth-secret static-auth-secret=output_of_openssl rand -hex 32 realm=signaling.example.com total-quota=100 bps-capacity=0 stale-nonce no-loopback-peers no-multicast-peers
and last, restart and enable coturn:
systemctl restart coturn && systemctl enable coturn
Install and config janus
The Version of janus in official repository of Ubuntu 18.04 is 0.2.6-1build2, so if you use 18.04 try Gitlab Repository.
- of morph27 instead.
- If you use 20.04 the version is suitable.
Ubuntu 18.04add repo key:
curl -sL -o /etc/apt/trusted.gpg.d/morph027-janus.asc https://packaging.gitlab.io/janus/gpg.key
add repo:
. /etc/lsb-release; echo "deb [arch=amd64] https://packaging.gitlab.io/janus/$DISTRIB_CODENAME $DISTRIB_CODENAME main" | tee /etc/apt/sources.list.d/morph027-janus.list apt update
Ubuntu 20.04 and 18.04:
apt install janus
Now generate a random api key for turnserver:
openssl rand -base64 16
and copy the output for later use.
vi /etc/janus/janus.jcfg
go to section nat and enter your stunserver and port, uncomment full_trickle = true, turn_server with port and type and the generated api key.
You can copy, paste and adjust the following:
stun_server = "signaling.example.com" stun_port = 5349 full_trickle = true turn_server = "signaling.example.com" turn_port = 5349 turn_type = "udp" turn_rest_api_key = "output_from_openssl rand -base64 16"
then comment the following lines:
- certificates: {# cert_pem = „/etc/ssl/certs/ssl-cert-snakeoil.pem“# cert_key = „/etc/ssl/private/ssl-cert-snakeoil.key“#cert_pwd = „secretpassphrase“#}
next edit /etc/janus/janus.transport.http.jcfg:
vi /etc/janus/janus.transport.http.jcfg
and set in section general the interface to lo:
interface = "lo"
same in /etc/janus/janus.transport.websockets.jcfg:
vi /etc/janus/janus.transport.websockets.jcfg interface = "lo"
- janus will now only listen on lo-interface (127.0.0.1)
enable and restart janus:
systemctl restart janus && systemctl enable janus
Running or Install NATS Server
If your VPS support docker, then you can use docker to run NATS Server:
Install docker if not installed: curl -sSL https://get.docker.com/ | CHANNEL=stable sh systemctl enable docker.service systemctl start docker.service
then run NATS Server:
docker run --restart=always --name=NATSSERVER -d -p 4222:4222 -ti --restart=always nats:latest
when you want to run NATS Server without docker, there is another Repository of morph27.
you have to add its key and its repo:
curl -sL -o /etc/apt/trusted.gpg.d/morph027-nats-server.asc https://packaging.gitlab.io/nats-server/gpg.key echo "deb [arch=amd64] https://packaging.gitlab.io/nats-server nats main" | tee /etc/apt/sources.list.d/morph027-nats-server.list
install NATS Server:
apt update apt install nats-server
generate config under /etc/nats/nats.conf
install -d -o nats -g nats /etc/nats sudo -u nats echo "listen: 127.0.0.1:4222" > /etc/nats/nats.conf start and enable NATS-Server: systemctl start nats-server && systemctl enable nats-server
Install nextcloud-spreed-signaling Server
now we can install the nextcloud-spreed-signaling server, first of all, we have to install the packages we need to built:
apt install git automake golang build-essential python3 -y
then we clone the git repository and start the build process:
cd /opt git clone https://github.com/strukturag/nextcloud-spreed-signaling.git cd nextcloud-spreed-signaling/ make build
then copy the binary to /usr/bin
cp bin/signaling /usr/bin/
now create a dedicated user:
useradd --system --shell /usr/sbin/nologin --comment "Standalone signaling server for Nextcloud Talk." signaling create the server.conf in /etc/signaling/ mkdir /etc/signaling/ touch /etc/signaling/server.conf chown signaling: /etc/signaling/server.conf chmod 600 /etc/signaling/server.conf
and copy the systemd file:
cp dist/init/systemd/signaling.service /etc/systemd/system/signaling.service systemctl daemon-reload systemctl enable signaling
- create keys for config:
Nextcloud Secret Key
openssl rand -hex 16 Block-Key openssl rand -hex 16 Hash-Key openssl rand -hex 16
Now we have five keys at all, as example (do not use these keys)
Turn-Key from Step 2
api-key from Step 3:Nextcloud-Secret-Key Block-Key Hash-Key
vi /etc/signaling/server.conf
then copy, paste and adjust (change keys to yours) the following config
[http] listen = 127.0.0.1:8080 [app] debug = false [sessions] hashkey = db61d5a8c6bd2b47a3cb0abce3545040 blockkey = f702adbf248ab0e752fa76cb46bcba12 [backend] allowed = nextcloud.example.com allowall = false secret = 692cdc99256135bcb7849ca1886e2ed6 timeout = 10 connectionsperhost = 8 [nats] url = nats://localhost:4222 [mcu] type = janus url = ws://127.0.0.1:8188 [turn] apikey = Z6ZkKhjwCFa6RMpFU854Fw== secret = 2309a206fc4de0f511ce9da52c088171f69193d1f701323d5ab4f733c9853445 servers = turn:signaling.example.com:5349?transport=udp,turn:signaling.example.com:5349?transport=tcp
then start signaling:
systemctl start signaling
and check staus of the service:
systemctl status signaling
and if it listens on port 8080:
netstat -tulpen | grep 8080
Install nginx and create vHost for signaling server
Now we will install nginx as reverse proxy for our high performance backend:
apt install nginx python3-certbot-nginx -y
and create the vHost:
vi /etc/nginx/sites-available/signaling
copy, paste and adjust:
server { listen 80; server_name signaling.example.com; }
and activate vhost:
ln -s /etc/nginx/sites-available/signaling /etc/nginx/sites-enabled/signaling
then check with:
nginx -t
and reload
systemctl reload nginx
now use certbot to obtain a certificate:
certbot --authenticator standalone --installer nginx -d signaling.example.com --pre-hook "service nginx stop" --post-hook "service nginx start"
then paste the following config in the vHost-conf:
mv /etc/nginx/sites-available/signaling /tmp/signaling.bak && nano /etc/nginx/sites-available/signaling
upstream signaling { server 127.0.0.1:8080; } server { server_name signaling.example.com; listen 443 ssl; # managed by Certbot ssl_certificate /etc/letsencrypt/live/signaling.example.com/fullchain.pem; # managed by Certbot ssl_certificate_key /etc/letsencrypt/live/signaling.example.com/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 add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"; location /standalone-signaling/ { proxy_pass http://signaling/; proxy_http_version 1.1; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } location /standalone-signaling/spreed { proxy_pass http://signaling/spreed; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "Upgrade"; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } server { if ($host = signaling.example.com) { return 301 https://$host$request_uri; } # managed by Certbot listen 80; server_name signaling.example.com; return 404; # managed by Certbot }
and check an reload nginx:
nginx -t if ok
systemctl reload nginx
Configure nextcloud to use stun/turn and signaling server
Go to Settings, Talk and enter the following:
Spreed standalone signaling server
This repository contains the standalone signaling server which can be used for Nextcloud Talk (https://apps.nextcloud.com/apps/spreed).
See https://nextcloud-talk.readthedocs.io/en/latest/standalone-signaling-api-v1/ for further information on the API of the signaling server.
Building
The following tools are required for building the signaling server.* git
- go >= 1.10
- make
All other dependencies are fetched automatically while building.
$ make build
or on FreeBSD
$ gmake build
Afterwards the binary is created as bin/signaling.
Configuration
A default configuration file is included as server.conf.in. Copy this to server.conf and adjust as necessary for the local setup. See the file for comments about the different parameters that can be changed.
Running
The signaling server connects to a NATS server (https://nats.io/) to distribute messages between different instances. See the NATS documentation on how to set up a server and run it.
Once the NATS server is running (and the URL to it is configured for the signaling server), you can start the signaling server.
$ ./bin/signaling
By default, the configuration is loaded from server.conf in the current directory, but a different path can be passed through the --config option.
$ ./bin/signaling --config /etc/signaling/server.conf
Running as daemon
systemd
Create a dedicated user:
sudo useradd --system \
--gid signaling \ --shell /usr/sbin/nologin \ --comment "Standalone signaling server for Nextcloud Talk." \ signaling
Copy server.conf.in to /etc/signaling/server.conf and fix permissions:
sudo chmod 600 /etc/signaling/server.conf sudo chown signaling: /etc/signaling/server.conf
Copy dist/init/systemd/signaling.service to /etc/systemd/system/signaling.service (adjust abs. path in ExecStart to match your binary location!)
Enable and start service:
systemctl enable signaling.service systemctl start signaling.service
Setup of NATS server
There is a detailed description on how to install and run the NATS server available at http://nats.io/documentation/tutorials/gnatsd-install/
You can use the gnatsd.conf file as base for the configuration of the NATS server.
Setup of Janus
A Janus server (from 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.
Use multiple Janus servers
To scale the setup and add high availability, a signaling server can connect to one or multiple proxy servers that each provide access to a single Janus server.
For that, set the type key in section [mcu] to proxy and set url to a space-separated list of URLs where a proxy server is running.
Each signaling server that connects to a proxy needs a unique token id and a public / private RSA keypair. The token id must be configured as token_id in section [mcu], the path to the private key file as token_key.
Setup of proxy server
The proxy server is built with the standard make command make build as bin/proxy binary. Copy the proxy.conf.in as proxy.conf and edit section [tokens] to the list of allowed token ids and filenames of the public keys for each token id. See the comments in proxy.conf.in for other configuration options.
When the proxy process receives a SIGHUP signal, the list of allowed token ids / public keys is reloaded. A SIGUSR1 signal can be used to shutdown a proxy process gracefully after all clients have been disconnected. No new publishers will be accepted in this case.
Setup of frontend webserver
Usually the standalone signaling server is running behind a webserver that does the SSL protocol or acts as a load balancer for multiple signaling servers.
The configuration examples below assume a pre-configured webserver (nginx or Apache) with a working HTTPS setup, that is listening on the external interface of the server hosting the standalone signaling server.
After everything has been set up, the configuration can be tested using curl:
$ curl -i https://myserver.domain.invalid/standalone-signaling/api/v1/welcome 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"}
nginx
Nginx can be used as frontend for the standalone signaling server without any additional requirements.
The backend should be configured separately so it can be changed in a single location and also to allow using multiple backends from a single frontend server.
Assuming the standalone signaling server is running on the local interface on port 8080 below, add the following block to the nginx server definition in /etc/nginx/sites-enabled (just before the server definition):
upstream signaling {
server 127.0.0.1:8080;
}
To proxy all requests for the standalone signaling to the correct backend, the following location block must be added inside the server definition of the same file:
location /standalone-signaling/ {
proxy_pass http://signaling/; proxy_http_version 1.1; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location /standalone-signaling/spreed {
proxy_pass http://signaling/spreed; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "Upgrade"; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
Example (e.g. /etc/nginx/sites-enabled/default):
upstream signaling {
server 127.0.0.1:8080;
}
server {
listen 443 ssl http2; server_name myserver.domain.invalid;
# ... other existing configuration ...
location /standalone-signaling/ { proxy_pass http://signaling/; proxy_http_version 1.1; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }
location /standalone-signaling/spreed { proxy_pass http://signaling/spreed; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "Upgrade"; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }
}
Apache
To configure the Apache webservice as frontend for the standalone signaling server, the modules mod_proxy_http and mod_proxy_wstunnel must be enabled so WebSocket and API backend requests can be proxied:
# a2enmod proxy # a2enmod proxy_http # a2enmod proxy_wstunnel
Now the Apache VirtualHost configuration can be extended to forward requests to the standalone signaling server (assuming the server is running on the local interface on port 8080 below):
<VirtualHost *:443> # ... existing configuration ... # Enable proxying Websocket requests to the standalone signaling server. ProxyPass "/standalone-signaling/" "ws://127.0.0.1:8080/" RewriteEngine On # Websocket connections from the clients. RewriteRule ^/standalone-signaling/spreed$ - [L] # Backend connections from Nextcloud. RewriteRule ^/standalone-signaling/api/(.*) http://127.0.0.1:8080/api/$1 [L,P] # ... existing configuration ... </VirtualHost>
Caddy
v1
Caddy (v1) configuration:
myserver.domain.invalid { proxy /standalone-signaling/ http://127.0.0.1:8080 { without /standalone-signaling transparent websocket } }
v2
Caddy (v2) configuration:
myserver.domain.invalid { route /standalone-signaling/* { uri strip_prefix /standalone-signaling reverse_proxy /standalone-signaling/* http://127.0.0.1:8080 } }
Setup of Nextcloud Talk
- Login to your Nextcloud as admin and open the additional settings page.
- Scroll down to the "Talk" section and enter the base URL of your standalone signaling server in the field "External signaling server".
- Please note that you have to use https if your Nextcloud is also running on https.
- Usually you should enter https://myhostname/standalone-signaling as URL.
- The value "Shared secret for external signaling server" must be the same as the property secret in section backend of your server.conf.
- If you are using a self-signed certificate for development, you need to uncheck the box Validate SSL certificate so backend requests from Nextcloud to the signaling server can be performed.
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)
Running multiple signaling servers
IMPORTANT This is considered experimental and might not work with all functionality of the signaling server, especially when using the Janus integration.
- The signaling server uses the NATS server to send messages to peers that are not connected locally.
- Therefore multiple signaling servers running on different hosts can use the same NATS server to build a simple cluster, allowing more simultaneous connections and distribute the load.
- To set this up, make sure all signaling servers are using the same settings for their session keys and the secret in the backend section.
- Also the URL to the NATS server (option url in section nats) must point to the same NATS server.
- If all this is setup correctly, clients can connect to either of the signaling servers and exchange messages between them.