Spreed - Videokonferenzserver für Nextcloud

Nextcloud hat Spreed - sein High Performance Backend für die Videotelefonie - unter der AGPL-Lizenz zur Verfügung gestellt. Damit ist es in Kombination mit der Nextcloud-Talk-App möglich, neben Chats unter bestimmten Voraussetzungen (Bandbreite, Server-Kapazität) auch parallel stattfindende Videokonferenzen mit über 150 Teilnehmern durchzuführen.

Erfüllte Anforderungen

Diese Anforderungen erfüllt das Schulnetzkonzept:

  • Chat und Videotelefonie mit vordefinierten Gruppen oder selbst zusammengestellten Gruppen
  • Berechtigung für die Initialisierung von Videotelefonaten
  • Bildschirmfreigabe
  • Hohe Kapazität

Voraussetzungen

Um die für Spreed notwendige Bandbreite (ca. 1 MBit/s je Teilnehmer) sicherstellen zu können, empfiehlt sich die datenschutzkonforme Installation der erforderlichen Komponenten auf einer virtuellen Maschine bei einem gut angebundenen deutschen Hoster und nicht im eigenen Schulnetz. Ich habe hier (nein, ich bekomme kein Geld für diese Aussage) mit Netcup (Produktreihe: VPS - virtuelle Server) sehr gute Erfahrungen gemacht.

Die Mindestanforderungen lassen sich bei Netcup mit ca. € 10.- monatlich abdecken:

  • 4 CPUs
  • 8 GB Arbeitsspeicher
  • 32 GB Festplattenspeicher

Selbstverständlich können bei entsprechender Bandbreite und Serverinfrastruktur die erforderlichen Komponenten auch im eigenen Schulnetz installiert werden. Hier müssten dann gem. der OPNSense-Beschreibung des Schulnetzkonzepts entsprechende Einstellungen im HAProxy und für die Zertifikatsvergabe getätigt werden.

Weitere Voraussetzungen:

  • Ubuntu-Server 20.04 mit SSH-Zugriff (kann bei Netcup mit einem Klick installiert werden). Ich habe mich hier an bereits vorhandenen Anleitungen orientiert und aus diesem Grund kein Debian verwendet. Die Installation von Ubuntu-Server verläuft fast identisch zu der beschriebenen Installation von Debian.
  • Eine Subdomain für die STUN-, TURN- und Spreed-Dienste, z. B. signaling.ihre-schule.de
  • Eine Weiterleitung der Subdomain (A- oder CNAME–Record) auf den Ubuntu-Server

Installation

Installation und Konfiguration der Firewall

Da der virtuelle Server direkt beim Anbieter im Internet läuft, empfiehlt sich die Installation einer Firewall.

# Installation der Firewall:
apt install ufw -y

# Konfiguration und Aktivierung der Firewall:
ufw allow http
ufw allow https
ufw allow ssh
ufw allow 5349/tcp
ufw allow 5349/udp
ufw enable

Generierung von Schlüsseln

Im weiteren Verlauf dieser Anleitung müssen mehrere Zufallsschlüssel eingesetzt werden. Diese werden nun generiert.
Bitte speichern Sie alle generierten Schlüssel in einem gesonderten Dokument für die weitere Verwendung!

Schlüssel 1

# TURN-Key
openssl rand -hex 32

Schlüssel 2

# API-Key
openssl rand -base64 16

Schlüssel 3

# Nextcloud Secret-Key
openssl rand -hex 16

Schlüssel 4

# Block-Key
openssl rand -hex 16

Schlüssel 5

# Hash-Key
openssl rand -hex 16

Installation und Konfiguration des STUN-/TURN-Servers

Coturn ist eine Open-Source-Implementation eines STUN- und TURN-Servers.

  • Ein STUN-Server ermöglicht hinter einer Firewall befindlichen Clients die Kommunikation mit einem VoIP-Anbieter außerhalb des lokalen Netzwerks.
  • Sollte STUN in einem Netzwerk nicht genutzt werden können, übernimmt der TURN-Server die Aufgabe der Kommunikation über NAT- bzw. Firewallgrenzen hinweg.

Coturn installieren, aktivieren und Backup der Default-Konfiguration

apt install coturn
sed -i '/TURNSERVER_ENABLED/c\TURNSERVER_ENABLED=1' /etc/default/coturn
mv /etc/turnserver.conf /etc/turnserver.conf.bak

Konfiguration des Coturn-Servers erzeugen

Ersetzen Sie in der nachfolgenden Konfiguration <Schlüssel 1> mit dem oben erzeugten Schlüssel.

nano /etc/turnserver.conf
Datei /etc/turnserver.conf
# Folgenden Inhalt in die Datei einfügen,
# <Schlüssel 1> durch den oben erzeugten Schlüssel ersetzen
# und die Domäne anpassen:

listening-port=5349
fingerprint
use-auth-secret
static-auth-secret=<Schlüssel 1>
realm=signaling.ihre-schule.de
total-quota=100
bps-capacity=0
stale-nonce
no-multicast-peers

Coturn-Server neu starten und als Dienst aktivieren

systemctl restart coturn && systemctl enable coturn

Installation und Konfiguration des Janus-Servers

Janus ist ein WebRTC-Server, welcher für die Spreed-Komponente benötigt wird.

# Repo-Key und Repo hinzufügen
curl -sL -o /etc/apt/trusted.gpg.d/morph027-janus.asc https://packaging.gitlab.io/janus/gpg.key

. /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

# Paketquellen aktualisieren
apt update

# Installation:
apt install janus

# Öffnen der Konfiguration:
nano /etc/janus/janus.jcfg
Datei /etc/janus/janus.jcfg
# Begeben Sie sich in der Konfigurationsdatei zum Bereich "NAT".
# Suchen Sie nach den nachfolgenden Zeilen, geben Sie dort die entsprechenden
# Daten an und achten Sie darauf, dass jene Zeilen nicht auskommentiert sind.
# Ersetzen Sie <Schlüssel 2> durch den oben generierten Schlüssel.

stun_server = "signaling.ihre-schule.de"
stun_port = 5349
full_trickle = true
turn_server = "signaling.ihre-schule.de"
turn_port = 5349
turn_type = "udp"
turn_rest_api_key = "<Schlüssel 2>"

# Suchen sie in der Konfiguartion die nachfolgenden Zeilen 
# und kommentieren sie dise aus:

# certificates: {
#   cert_pem = „/etc/ssl/certs/ssl-cert-snakeoil.pem“
#   cert_key = „/etc/ssl/private/ssl-cert-snakeoil.key“
#   cert_pwd = „secretpassphrase“
# }

Startreihenfolge des Janus-Dienstes anpassen

nano /lib/systemd/system/janus.service
Datei /lib/systemd/system/janus.service
# Ändern Sie im Bereich [Unit] die Zeile After=... wie folgt ab:
[Unit]
Description=Janus WebRTC gateway
After=coturn.service

Janus-Server neu starten und als Dienst aktivieren

systemctl daemon-reload && systemctl restart janus && systemctl enable janus

Installation des NATS-Servers

Auch der NATS-Server ist eine für Spreed benötigte Komponente.

Installation von Docker für den NATS-Server und Aktivierung als Dienst

curl -sSL https://get.docker.com/ | CHANNEL=stable sh
systemctl enable docker.service
systemctl start docker.service

NATS als Docker-Image starten

docker run --restart=always --name=NATSSERVER -d -p 4222:4222 -ti --restart=always nats:latest

Installation und Konfiguration des Spreed-Singaling-Servers

Notwendige Pakete installieren

apt install git automake golang build-essential python3 -y

Klonen des Git-Repositorys und Erstellen des Pakets mit build

cd /opt
git clone https://github.com/strukturag/nextcloud-spreed-signaling.git
cd nextcloud-spreed-signaling/
make build

Paket Kopieren

cp /opt/bin/signaling /usr/bin/

Dedizierten Benutzer mit Namen signaling anlegen

useradd --system --shell /usr/sbin/nologin --comment "Standalone signaling server for Nextcloud Talk." signaling

Konfiguration erzeugen und Berechtigungen setzen

Achten Sie bei der nachfolgenden Konfigurationsdatei darauf, alle vorher generierten Schlüssel an der richtigen Stelle einzufügen und alle Domänennamen anzupassen.

mkdir /etc/signaling/
touch /etc/signaling/server.conf
chown signaling: /etc/signaling/server.conf
chmod 600 /etc/signaling/server.conf
nano /etc/signaling/server.conf
Datei /etc/signaling/server.conf
[http]
listen = 127.0.0.1:8080
[app]
debug = false

[sessions]
hashkey = <Schlüssel 5>
blockkey = <Schlüssel 4>


[backend]
# Unter backends können mit Komma getrennt mehrere Backends angegeben werden:
# z. B. backends = backend-1, backend-2, backend-3
backends = backend-1
allowall = false
timeout = 10
connectionsperhost = 8

[backend-1]
url = https://nextcloud.ihre-schule.de
secret = <Schlüssel 3>

#[backend-2]
#url = ...
#secret = ...

[nats]
url = nats://localhost:4222

[mcu]
type = janus
url = ws://127.0.0.1:8188

[turn]
apikey = <Schlüssel 2>
secret = <Schlüssel 1>
servers = turn:signaling.ihre-schule.de:5349?transport=udp,turn:signaling.ihre-schule.de:5349?transport=tcp

Den Signal-Server als Dienst konfigurieren und die Startreihenfolge festlegen

cp dist/init/systemd/signaling.service /etc/systemd/system/signaling.service
nano /etc/systemd/system/signaling.service
Datei /etc/systemd/system/signaling.service
# Im Bereich Unit die Zeile After=... einfügen
[Unit]
Description=Nextcloud Talk signaling server
After=janus.service

Den Signal-Server-Dienst aktivieren

systemctl daemon-reload
systemctl enable signaling
systemctl start signaling

Installation und Konfiguration von NGINX

Der NGINX-Webserver dient als Reverse-Proxy für den Signaling-Server.

Notwendige Pakete installieren

apt install nginx python3-certbot-nginx -y

vHost-Eintrag erzeugen

nano /etc/nginx/sites-available/signaling
Datei /etc/nginx/sites-available/signaling
# Achtung: Domänennamen anpassen!
upstream signaling {
    server 127.0.0.1:8080;
}

server {
    listen 80;
    server_name signaling.ihre-schule.de;
    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;
    }

}

vHost aktivieren und NGINX neu starten

ln -s /etc/nginx/sites-available/signaling /etc/nginx/sites-enabled/signaling
systemctl reload nginx

Lets-Encrypt-Zertifikat mit certbot generieren

# Achtung: Domäne anpassen!
# Bei Durchlauf der Certbot-Routine die Frage nach der SSL-Verschlüsselung mit Ja beantworten!

certbot --authenticator standalone --installer nginx -d signaling.ihre-schule.de --pre-hook "service nginx stop" --post-hook "service nginx start"

NGINX neu starten

systemctl reload nginx

Nextcloud für die Verwendung von Spreed konfigurieren

Zunächst muss unter den Nextcloud-Apps die Talk-App installiert und aktiviert sein.

Unter Einstellungen / Talk sind dann folgende Informationen - angepasst an Ihre Daten - zu hinterlegen:

  • STUN-Server:
    • Server/Port: signaling.ihre-schule.de:5349
  • TURN-Server:
    • Server/Port: signaling-rsa.tmtec.eu:5349
    • Secret: <Schlüssel 1>
  • Hochleistungs-Backend
    • Server: https://signaling-ihre-schule.de/standalone-signaling
    • Haken bei: SSL-Zertifikat überprüfen
    • Geteiltes Geheimnis: <Schlüssel 3>

Letzte Aktualisierung der Seite: 2020-11-25 21:38