How to Install Nextcloud Talk High Performance Backend with Stun/Turnserver on Ubuntu

Picture from Alexandra_Koch on Pixabay

Changes 18.11.2020:
– Adjust server.conf because typo has changed
– Adjust signaling.service and janus.service because they does not start after reboot
Changes 22.11.2020:
– Adjust janus.jcfg
– change repositoty of janus

Since Nextcloud has released the High Performance Backend as OpenSource under AGPL License, i tried my luck to install it on Ubuntu.

Now I want to share how to do it.


– a VPS with Ubuntu 18.04 or 20.04 LTS minimal Image installed (you can get one here @netcup with 5€ Discount or start at Hetzner Cloud with 20€ start credits)
– shell access and appropriate rights
– One DNS A and possibly AAAA record for our nginx vhost and stun/turn-server (I use for all three services in this guide)
– Optional – a second DNS A and possibly AAAA record for stun/turnserver

Hardware Requirements:

32 GB Disk-Space

See also: Nextcloud Portal

You can also test a smaller server if you don’t have that many users

Step 1: 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“

Step 2: 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:

static-auth-secret=output_of_openssl rand -hex 32

and last, restart and enable coturn:

systemctl restart coturn && systemctl enable coturn

Step 3: Install and config janus

You have to add janus Repository of morph027

Ubuntu 18.04 and 20.04
add repo key:

curl -sL -o /etc/apt/trusted.gpg.d/morph027-janus.asc

add repo:

. /etc/lsb-release; echo "deb [arch=amd64]$DISTRIB_CODENAME $DISTRIB_CODENAME main" | tee /etc/apt/sources.list.d/morph027-janus.list
apt update
apt install janus

Now generate a random api key for turnserver:

openssl rand -base64 16

and copy the output for later use.

Edit /etc/janus/janus.jcfg

nano /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 = ""
stun_port = 5349
full_trickle = true
turn_server = ""
turn_port = 5349
turn_type = "udp"
turn_rest_api_key = "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“

adjust janus.service, so that it will start after coturn.service:

nano /lib/systemd/system/janus.service

adjust under Unit-Section:

Description=Janus WebRTC gateway

save, enable and restart janus:

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

Step 4: 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 | 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
echo "deb [arch=amd64] 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:" > /etc/nats/nats.conf

start and enable NATS-Server:

systemctl start nats-server && systemctl enable nats-server

Step 5: 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
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

and adjust, so that signaling.service start after janus.service:

nano /etc/systemd/system/signaling.service

and change under Unit-Section:

Description=Nextcloud Talk signaling server

save and then:

systemctl daemon-reload
systemctl enable signaling

create keys for config:

Nextcloud Secret Key

openssl rand -hex 16


openssl rand -hex 16


openssl rand -hex 16

Now we have five keys at all, as example (do not use these keys)

Turn-Key from Step 2: 2309a206fc4de0f511ce9da52c088171f69193d1f701323d5ab4f733c9853445
api-key from Step 3: Z6ZkKhjwCFa6RMpFU854Fw==
Nextcloud-Secret-Key: 692cdc99256135bcb7849ca1886e2ed6
Block-Key: f702adbf248ab0e752fa76cb46bcba12
Hash-Key: db61d5a8c6bd2b47a3cb0abce3545040

open /etc/signaling/server.conf with your editor

nano /etc/signaling/server.conf

then copy, paste and adjust (change keys to yours) the following config

listen =
debug = false

hashkey = db61d5a8c6bd2b47a3cb0abce3545040
blockkey = f702adbf248ab0e752fa76cb46bcba12

backends = backend-1 #here you can add more backends commaseparated backend-1, backend-2, backend-3
allowall = false
timeout = 10
connectionsperhost = 8

url =
secret = 692cdc99256135bcb7849ca1886e2ed6

#url =
#secret = openssl rand -hex 16

#url =
#secret = openssl rand -hex 16

url = nats://localhost:4222

type = janus
url = ws://

apikey = Z6ZkKhjwCFa6RMpFU854Fw==
secret = 2309a206fc4de0f511ce9da52c088171f69193d1f701323d5ab4f733c9853445
servers =,

then start signaling:

systemctl start signaling

and check status of the service:

systemctl status signaling

and if it listens on port 8080:

netstat -tulpen | grep 8080

go to next step.

Step 6: 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:

nano /etc/nginx/sites-available/signaling

copy, paste and adjust:

server {
    listen :80;
    listen [::]:80;

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 --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 {

    listen :443 ssl http2; # managed by Certbot
    listen [::]:443 ssl http2;
    ssl_certificate /etc/letsencrypt/live/; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/; # 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 = {
        return 301 https://$host$request_uri;
    } # managed by Certbot

    listen :80;
    listen [::]:80;
    return 404; # managed by Certbot


and check an reload nginx:

nginx -t

if ok

systemctl reload nginx

Step 7: Configure nextcloud to use stun/turn and signaling server

Now we are ready to add turn/stun- and signaling-server to our Nextcloud

Go to Settings, Talk and enter the following:

And then enjoy your High Performance Backend.

Problems with the tutorial? Then comment below or contact me per Mail or Mastodon.

If you want a managed nextcloud, then look here.

I will be happy if you would support my work here.

Happy nextclouding and do not forget to share ?

Struktur AG
Picture from Alexandra_Koch on Pixabay

This Guide was tested on:
Hetzner Cloud

89 Gedanken zu „How to Install Nextcloud Talk High Performance Backend with Stun/Turnserver on Ubuntu

  1. Hallo Markus,

    danke für die ausführlichen Beschreibungen in Deinem Blog.

    Zuvor eine Anmerkung zu Deinem Blog. Es ist schön und gut, dass hier so viel Wissen vermittelt wird. Dass die Möglichkeit besteht, Kommentare zu schreiben ist prima, aber was nützt das, wenn diese gar nicht auf der Seite erscheinen, da wohl der zuständige Administrator entweder keine Zeit hat oder aus irgend welchen Gründen nicht mitbekommt, dass ein neuer Kommentar oder Frage zu einem Beitrag in der Warteschlage steht. Dies ist seit dem 13.7.20221 der dritte Versuch meinen Kommentar und Frage veröffentlicht bzw. beantwortet zu bekommen. Hier noch einmal meinen Kommentar.

    Ich habe bei IONOS einen Dedicated Server (AMD 6 (12) Cores, 32 GiB RAM, SSD, 1000Mb/s) mit Ubuntu 20.04 und Plesk Obsidian.

    Nginx läuft als Reverse Proxy und Apache als Webserver für einige Webseiten. Nextcloud mit Talk habe ich als Subdomain eingerichtet mit Coturn und Redis im Hintergrund. Videokonferenzen bis 8 Teilnehmer ist machbar, es gibt aber manchmal Aussetzer in Bild und/oder Ton. Soweit der kurze Systemüberblick.

    Ich möchte nun nach Deiner Anleitung das High Performance Backend aufsetzen. Nach der guten Beschreibung sollte das keine Probleme bereiten. Wo ich bedenken habe ist Plesk. In manchen Dingen hat Plesk so seine eigenen Vorstellungen und ich befürchte, dass ich mir vielleicht irgendwo Probleme einhandle, die den Betrieb der vorhandenen Webseiten beeinflussen könnten. Die Webseiten müssen verfügbar sein.

    Meine Frage: hast Du da Erfahrung oder Tipps worauch ich achten sollte?

    Danke für Deine Hilfe.


    1. Hallo Werner,

      danke für Dein Feedback. Zu Deiner Kritik verweise ich auf meine Seite „Unterstützung“ und dem folgenden Satz: es gilt immer diese Reihenfolge: Familie, Freunde, Arbeit dann Hobby…
      Der Blog ist mein Hobby und steht ganz hinten an, daher kann es auch sein, dass ich eine gewisse Zeit nicht reagiere oder einfach die Zeit fehlt 😉

      Zu Deiner Frage: Bei Plesk empfehle ich auf die Anleitung mit Docker auszuweichen. Dein dedizierter Server ist hervorragend dafür geeignet.

      Die Ports musst Du dann in Deiner Plesk-Firewall freigeben und die nginx-Direktiven anpassen.


      1. Hallo Markus,

        danke für Deine Anwort und der Satz ist verstanden.

        Von Docker bin ich nicht begeistert. Als ich den Server gebucht hatte war Docker installiert. Beim Einrichten des Servers auf meine Wünsche hatte ich jedoch massive Netzwerkprobleme die teils durch Docker verursacht waren. Da ich einige Webseiten hoste und die funktionieren müssen, werde ich Deinem Vorschlag nicht folge Leisten.


        1. Hallo Werner,

          danke für die Info. Ich hatte dort mal einen dedizierten Server, der mit Docker und Plesk keinerlei Probleme hatte, eventuell hätte Dir der Support weiterhelfen können? Aus meiner Sicht erstmal nicht normal, das Docker Probleme verursacht hat.

          Du kannst natürlich auch diese Anleitung verwenden, um das High Performance Backend zu nutzen, aber das müsste man halt testen.

          Viele Grüß

  2. Having an error here:

    # make build
    PATH=/usr/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin GOPATH=“/opt/nextcloud-spreed-signaling/vendor:/opt/nextcloud-spreed-signaling“ ./vendor/bin/easyjson -all api_signaling.go
    Error parsing api_signaling.go: file ‚/opt/nextcloud-spreed-signaling/api_signaling.go‘ is not in GOPATH
    make: *** [Makefile:82: api_signaling_easyjson.go] Error 1

    1. Hi, I am having the exact same error:

      root@talk:/opt/nextcloud-spreed-signaling# make build
      GOPATH=“/opt/nextcloud-spreed-signaling/vendor:/opt/nextcloud-spreed-signaling“ /usr/bin/go get -u…
      PATH=/usr/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin GOPATH=“/opt/nextcloud-spreed-signaling/vendor:/opt/nextcloud-spreed-signaling“ „/opt/nextcloud-spreed-signaling/vendor/bin/easyjson“ -all api_signaling.go
      Error parsing api_signaling.go: file ‚/opt/nextcloud-spreed-signaling/api_signaling.go‘ is not in GOPATH ‚/opt/nextcloud-spreed-signaling/vendor:/opt/nextcloud-spreed-signaling‘
      Makefile:88: recipe for target ‚api_signaling_easyjson.go‘ failed
      make: *** [api_signaling_easyjson.go] Error 1

  3. Hi Markus,

    das ist echt die ordentlichste Anleitung die ich dazu bisher gesehen habe… DANKE dafür.
    Eine Frage, die weiter oben schon auftauchte, aber bisher unbeantwortet blieb – den vhost könnte man doch auch über Apache aufsetzen, oder muss es nginx sein?

    Danke schonmal vorab!

    1. Hi Lars,

      Apache2 sieht so aus:


      DocumentRoot /var/www/html

      # Enable proxying Websocket requests to the standalone signaling server.
      ProxyPass „/standalone-signaling/“ „ws://“

      RewriteEngine On
      # Websocket connections from the clients.
      RewriteRule ^/standalone-signaling/spreed$ – [L]
      # Backend connections from Nextcloud.
      RewriteRule ^/standalone-signaling/api/(.*)$1 [L,P]

      SSLCertificateFile /etc/letsencrypt/live/
      SSLCertificateKeyFile /etc/letsencrypt/live/
      Include /etc/letsencrypt/options-ssl-apache.conf


  4. Super Anleitung. Erstmal vielen Dank dafür, aber bekomme immer folgenden Fehler beim start vo Signaling Server

    main.go:305: Could not start listening: listen tcp bind: permission denied

    Hab den port 944 ausgewählt, weil Port 8080 belegt ist. An was liegt das? Hatte es per sudo user probiert und per Root

        1. Thank you for this amazing guide. Please include ipv6 in your Nginx conf as this bite me also. Also do you think http2 will improve performance?

  5. Hello ?
    thx for sharing your experiences

    is it possible to install the HPB on the same server than NextCloud ?
    is it usefull ?

    if yes, how to proceed ? my nextcloud server is under nginx php-fpm mariadb
    what would be the url target ? 127.0.01 or other
    it should be better than using the external url ?

    thank you ? Flom

      1. Hi Markus
        Thank You

        Why is it not recommended ? for the hardware charge and performances ?

        From that i have understood,
        My nextcloud has few users… and the actual charge used is low
        As i would like to increase the number of possible simultaneous Talk users
        so i think that in my case it could be possible to put the HPB on the same server


  6. Hi Markus,
    vielen Dank für die Super Anleitung. Ich habe mich da genau dran gehalten. Aber Ich habe da iaber einen Fehler in meiner Konfig, den ich einfach nicht raus bekomme. Der Trickle Test liefert mir „returned an error with code=701:
    STUN host lookup received error.“
    In meiner Nextcloud kann ich den Turn-Server ansprechen. Beim Signaling Eintrag liefert er mir „Fehler: Der Server antwortete mit: 404“. An was kann dies liegen? Der Signaling Server ist ein VPS bei Netcup, die Nextcloud selbst liegt im lokalen Netz.

      1. Hi, lag tatsächlich am Chromium. Egal ob Edge, Chrome oder Brave. Da fkt der Trickle Test nicht. Mit Firefox hat es geklappt.

        Der Signalingaufruf fkt nun auch, Das war eher ein Layer-8 Problem. Habe die URL falsch geschrieben :|.

        Vielen Dank, manchmal reicht es einfach kurz über das Problem zu kommunizieren

  7. Hallo Markus,
    Ich habe nun einen neuen, zweiten Rootserver und habe alles genau Schritt für Schritt nach deiner Anleitung gemacht. Die Dienste laufen alle, in Nextcloud sind die Einträge für TURN/STUN/Signaling auch alle ok. Aber es funktioniert keine Videokonferenz, man sieht überhaupt keinen Teilnehmer der sich in die Konferenz einwählt.
    Das einzige was mir auffällt ist wenn der erste sich einwählt im Syslog:
    janus[3191]: [WARN] Could not set TURN server, is the address correct? (
    (Ich habe die IP Adresse hier mit „xxx“ ersetzt.)
    Aber ein netstat -tulpen | grep 5349 liefert:
    tcp 0 0* LISTEN 107 52333 3147/turnserver

    Beim Starten von Janus sieht er aber wohl den STUN und TURN Server:
    janus[3191]: Testing STUN server: message is of 20 bytes
    janus[3191]: >> Our public address is
    janus[3191]: TURN server to use: (udp)
    janus[3191]: TURN REST API backend: (disabled)

    Und das signaling findet ihn auch:
    signaling[3194]: backend_server.go:97: Adding „“ as TURN server
    signaling[3194]: backend_server.go:104: No IPs configured for the stats endpoint, only allowing access from

    ALso der TUN Server läft und ich habe ihn auch mit getestet, alles perfekt – aber nichts geht…
    Hast du vielleicht eine Idee, woran das liegen kann. Ich habe echt ganz sorgfältig alles gemacht wie in deiner Anleitung.

    Viele Grüsse – Erwin

    1. Hallo Erwin, ich habe das Tutorial gerade noch mal mit einem root-server getestet. Lief ohne Probleme. Manchmal hakt der janus.service. Hier mal bitte in der config für Turn/stun angeben (ist angepasst) und die Services nacheinander durchstarten. Erst coturn, dann janus und zum Schluss signaling.
      Ansonsten ist das Tutorial für docker eventuell der workaround. Gruß Markus

  8. Hi Markus, Thank you so much for making this excellent tutorial and I will be very thankful to you if you can help me in following 2 things:
    1) For step 6, If you can send me some guideline how to create Apache vHost for Signaling server and how to create SSL certificate.
    2) I am using CSF firewall and for some reason port 8080 & 8188 are not replying, I have added both ports in allow list of CSF under TCP. I don’t get any reply when I enter this command: netstat -tulpen | grep 8080

  9. Hallo Markus,

    ich habe Deine Anleitung mit Interesse gelesen. Schade daß es diese noch nicht gab, als ich das High-Perfomance-Backend aufgesetzt habe. Ich habe das ganze Setup aber zum laufen gebracht und es ist produktiv im Einsatz. Jedoch gibt es immer wieder Probleme bei den Videokonferenzen, daß jemand kein Bild sieht, der Ton stottert usw. Es sind Konferenzen i.d.R. mit ca. 15…20 Teilnehmern, veilleicht noch eine zweite Konferenz mit 5 Teilnehmern.
    Meine Frage nun: Hast du Erfahrung, welche Hardware man benötigt, um z.B. 3 paralelle Konferenzen mit jeweils 15..20 Teilnehmern problemlos führen zu können? Braucht man dazu mehrere Server (und: geht das überhaupt?). Einmal war es auch so, daß es immer schlechter wurde. Erst nach einem Server Neustart ging alles wieder. Kann das sein, dass der Signalling Server sich so „festfährt“ daß es eines Neustarts bedarf?
    Wir haben folgenden Rootserver bei Hetzner gemietet:
    Intel® Core™ i9-9900K octa-core
    2 * 1 TB NVMe SSD
    128 GB DDR4 RAM
    Bandbreite: 1 GBit/s
    Darauf läuft nichts ausser Nextcloud mit Apache und der Signalling Server, auch mit Apache und ein STUN/TURN Server (coturn).
    Es wäre sehr hilfreich, wenn du uns sagen könntest, ob wir mit unserem Setup jemals an’s Ziel kommen 50 oder gar 100 Teilnehmer problemlos per Videokonferenz zu verbinden, oder was nötig wäre, um das zu erreichen.
    Viele Grüsse – Erwin

    1. Hallo Erwin, laut nextcloud soll ein Server mit 4 CPU, 8GB RAM und 1Gbit/s Bandbreite für 150 concurrent User ausreichen. Also mehrere Konferenzen. Was ich beobachte, ist dass RAM und Bandbreite gefordert ist. CPU ist jetzt nicht so auffällig. Hast Du ein Monitoring der Ressourcen im Einsatz? Wenn ja, da mal schauen wie die Auslastung aussieht. Bezüglich der Aussetzer etc. Schau mal im syslog, ob da auffällige Einträge sind. Manchmal ist da auch irgendwo ne „Schleife“.

      Gruß Markus

      1. Hallo Markus, Danke für die schnelle Antwort. Monitoring habe ich erst jetzt aufgesetzt und noch nicht lange im Einsatz. Es sieht so aus, als wäre der Server weit entfernt von seinen Limits, aber ich werde das noch weiter beobachten. Aber wie gesagt gibt es trotzdem immer wieder Ausfälle, daß jemand kein Bild vom anderen sieht. Das syslog, ja, es gobt ja vielerelei Logs – turn.log, signaling.log, nats-server.log, janus.log und natürlich das syslog – aber aus dem endlos vielen Zeilen werde ich auch nicht recht schlau, ob da nun was schief geht oder alles passt. Hast du denn einen Videokonferenz Server mit Nextcloud Talk im Einsatz und Erfahrungen mit grösseren Teilnehmerzahlen. Klappt da alles oder gibt es auch bei dir immer wieder Abbrüche bzw. Probleme? Viele Grüsse – Erwin

  10. Ich habe den signaling Server installiert ohne größere Probleme bekomme jetzt aber eine nginx Fehlermeldung „/usr/share/nginx/html/owa/auth/logon.aspx“ failed (2: No such file or directory), client: komische ip, server: signaling server, request: „GET /owa/auth/logon.aspx?url=https%3a%2f%2f1%2fecp%2f HTTP/1.1“, host: „signaling ip“

    1. Hi, das ist keine Fehlermeldung, die mit dem signaling-server zu tun hat. Da hat jemand Deinen Server gescannt und versucht auf das OWA (Exchange) zuzugreifen. Ganz normales Angriffsmuster, wenn man prüfen möchte, was so alles auf einem Webserver läuft.

      1. Danke für die schnell Antwort dann muss das Problem wohl woanders liegen. Das einrichten in der Nextcloud hat ohne Probleme geklappt aber ich keine Anrufe starten wenn ich auf starten drücke dann läde es einfach nur dauerhaft aber nichts passiert

  11. HI!
    I have used youre guide „How to Install Nextcloud Talk High Performance Backend with Stun/Turnserver on Ubuntu“

    Im running nextcloud 20.0.2 on a separate ubuntu server.

    I can send text messages.
    I can call but i cant hear anything and the call is unsable.
    Can you advise me what to do!

      1. Dec 9 19:17:43 uler janus[2041]: nice_agent_set_relay_info: assertion ‚username‘ failed
        Dec 9 19:17:43 uler janus[2041]: [WARN] Subscriber is using the legacy ‚listener‘ ptype
        Dec 9 19:17:43 uler janus[2041]: [3268241268602272] Creating ICE agent (ICE Full mode, controlling)
        Dec 9 19:17:43 uler janus[2041]: [WARN] Could not set TURN server, is the address correct? (xx.xx.xx.xx:5349) (our external ip)
        Dec 9 19:17:44 uler janus[2041]: Creating new handle in session 1312088582127499:

        Do you have any idea what to check!

        Kind regards

          1. Hi!

            I tried that but it dident solve my problem.
            is there a way to share the config files with you.

            Kind regards

          2. Hi Ulf,

            your Turnserver is behind NAT, he does not know his public-IP,

            Try to set in turnserver.conf:

            # If the server is behind NAT, you need to specify the external IP
            # If there is only one external address, specify it like this:


  12. edit /etc/janus/janus.transport.http.jcfg and set interface = „lo“ in the general section
    edit /etc/janus/janus.transport.websockets.jcfg and set interface = „lo“ in the general section
    restart janus service: systemctl restart janus (do not forget to enable on boot: systemctl enable janus)

    Damit ging es dann. Das es Lokal angesprochen wird, scheint ziemlich wichtig zu sein.

  13. Hey.
    Ich habe alles nach Anleitung gemacht und habe bei UFW auch die freigaben und im log steht signaling[1803]: client.go:252: Client from has RTT of 57 ms (57.5086ms)
    Aber ich kann keine Anrufe machen. Ich habe auf typos geaachtet und bin verzweifelt meine configs

  14. Hallo, ich habe folgende Fehlermeldung und finde keine Lösung
    bitte um einen Ratschlag was ich da versuchen kann

    Nov 20 09:42:17 hpb janus[8230]: [FATAL] [ice.c:janus_ice_set_stun_server:853] No response to our STUN BINDING test
    Nov 20 09:42:17 hpb janus[8230]: [FATAL] [janus.c:main:3820] Invalid STUN address

  15. Ich danke Dir. Thema Backend hatte ich schon auf dem Schirm, aber leider noch keine Zeit. Ist jetzt aber eingearbeitet.
    Mit der Nextcloud Talk App habe ich es gerade noch mal getestet, läuft auch. Hast Du mal nach dem Fehler gesucht. Vielleicht Debian spezifisch?

    Gruß Markus

  16. Hallo Markus,

    danke für die tolle Anleitung.

    Ich habe die Installation auf einem Debian 10 durchgeführt und soweit sieht auch alles gut aus. Alle Services laufen, die Ports sind aktiv und die Firewall ist eingerichtet. Alle notwendigen Einstellungen und Config-Dateien habe ich nun auch schon mehrfach überprüft.
    Meine Nextcloud kann ich unter „Einstellungen“ auch richtig verbinden.

    Wenn ich dann aber auf die Talk App in Nextcloud wechsle oder den Android-Client starte bekomme ich die Meldung
    “ Fehler beim Aufbau der Signaling-Verbindung. “
    Weiters sehe ich danach im Syslog des Server jedes Mal
    „signaling[20119]: client.go:271: Error reading from x.x.x.x: websocket: close 1006 (abnormal closure): unexpected EOF“

    Ein lokaler Test am Server mit dem client funktioniert problemlos.

    Janus habe ich in Version 0.9.2 installiert.

    Hast du dazu noch eine Idee was Probleme machen könnte?

    PS: die Backend Einstellungen in der Datei server.conf des Signaling Servers haben sich mittlerweile etwas verändert. Hier sollte man in einer generellen [bachend] Variable die einzelnen erlaubten Backends definieren: #backends = backend1, backend2
    und diese dann als einzelne Punkte in der Config hinzufügen.

  17. Hi Markus (und Christian),

    Sorry betreffen der „Verwechslung“, war ein klassischer Verschreiber. Natürlich meinte ich Markus. Also inzwischen funktioniert der Signaling Server perfekt. Habe mich noch in die BEschreibung der Konfig Datei eingelesen. Da ich inzwischen 3 verschiedene Nextclouds auf den SIgnaling Server „loslasse“ musste ich die irgendwie trennen und auch durch andere Secrets absichern. Das sieht dann so aus:

    backends = backend-1, backend-2, backend-3
    allowall = false
    timeout = 10
    connectionsperhost = 8

    url =
    secret = [secret für Nextcloud1]

    url =
    secret = [secret für Nexcloud 2]

    url =
    secret = [secret für Nextcloud 3]

    So funktioniert das einwandfrei und es kann auch nicht zu Konflikten kommen, wenn in den verschiedenen Nextclouds gleich bezeichnete Chaträume vorkommen.

    Einziger Schönheitsfehler im Moment: Wenn ich den Signaling Server reboote, dann startet Janus nicht. Den muss ich dann von Hand starten. Warum habe ich noch nicht herausgefunden.

    Betrieben wird der Signaling Server in einer vmware Umgebung mit 10Gbit/s Intranet und 1Gbit/s Internet Anschluss. Bis jetzt absolut störungsfrei auch längere Meetings bis bis zu 10 Teilnehmern haben wir geprobt. Ohne Ruckler oder Ausfall. Wirklich coole Sache.


    1. Moin Reto,

      super Sache, das freut mich und hilft sicherlich auch anderen 🙂

      Bezüglich janus.service:

      Versuche mal die services anzupassen:

      nano /etc/systemd/system/signaling.service

      dann unter [Unit]:
      Description=Nextcloud Talk signaling server


      nano /lib/systemd/system/janus.service

      wieder unter [Unit]

      Description=Janus WebRTC gateway


      systemctl daemon-reload

      dann sollte nach einem Reboot auch der janus.service starten.

      Ich baue das noch in den Artikel ein.


  18. Hallo Markus,

    erstmal ein großes Kompliment für deine ausführliche Anleitung. So detailliert findet man solche kaum im Netz, danke dafür!
    Bei meiner Installation bin ich komplett nach deiner Anleitung gegangangen. Auf dem Signaling Server scheinen die Dienste auch alle korrekt zu laufen. Auch die Welcome Seite wird angezeigt:
    Trotzdem lädt die Talk-App endlos und verbindet sich letztlich einfach nicht. Wenn in den Talk Einstellungen ausschließlich über Turn und CoTurn getalked wird, funktioniert alles. Sobald ich die signaling Server informationen hinzufüge, bekomme ich bei den Einstellungen nur Erfolgsmeldungen angezeigt, trotzdem lädt die Talk App dann endlos. Die einzige meldung, die im Log zu sehen ist, ist die folgende:

    POST` resulted in a `403 Forbidden` response:
    Authentication check failed

    Spricht aus meiner sicht für ein Berechtigungsfehler? Für Tipps und Hinweise wäre ich sehr dankbar.

    Viele Grüße!

    1. Hallo Andre,
      danke für Dein Feedback 🙂
      Das deutet darauf hin, dass das Secret für Signaling nicht korrekt eigetragen ist. Bitte noch mal prüfen.
      in der /etc/signaling/server.conf unter [Backend] das secret muss identisch mit dem „Shared Secret“ (ganz unten) in der Nextcloud-Weboberfläche sein.


      1. Hallo Markus,
        tatsächlich hab ich den falschen key dort eingetragen (copy-paste Fehler). Vielen Dank für deine Hilfe. Und nochmals ein riesen Lob an deinen Blog, der ist echt klasse!

        Viele Grüße!

  19. Hi,
    in the end of point nr 5, „netstat -tulpen | grep 8080“ – there are no service listening on port 8080.
    „systemctl status signaling“ gives
    ● signaling.service – Nextcloud Talk signaling server
    Loaded: loaded (/etc/systemd/system/signaling.service; enabled; vendor preset: enabled)
    Active: active (running) since Mon 2020-11-02 22:48:08 CET; 2s ago
    Main PID: 12226 (signaling)
    Tasks: 9 (limit: 4617)
    Memory: 2.0M
    CGroup: /system.slice/signaling.service
    └─12226 /usr/bin/signaling –config /etc/signaling/server.conf

    Nov 02 22:48:08 signaling[12226]: main.go:130: Starting up version 9206a56113064b8e44b0de12d5128f8e88617679/go1.13.8 as pid 12226
    Nov 02 22:48:08 signaling[12226]: main.go:139: Using a maximum of 3 CPUs
    Nov 02 22:48:08 signaling[12226]: natsclient.go:116: Connection established to nats://localhost:4222 (NAF5FB4EGD3GCFD4VFLA3ANLRMIGUYQ2XEHXFO26QHNNGZHLMDIX7JFA)
    Nov 02 22:48:08 signaling[12226]: hub.go:163: WARNING: No shared secret has been set for internal clients.
    Nov 02 22:48:08 signaling[12226]: backend_configuration.go:110: Allowed backend hostnames: []
    Nov 02 22:48:08 signaling[12226]: hub.go:175: Using a maximum of 8 concurrent backend connections per host
    Nov 02 22:48:08 signaling[12226]: hub.go:182: Using a timeout of 10s for backend connections
    Nov 02 22:48:08 signaling[12226]: hub.go:268: Not using GeoIP database
    Nov 02 22:48:08 signaling[12226]: main.go:191: Could not initialize janus MCU (dial tcp connect: connection refused) will retry in 1s
    Nov 02 22:48:09 signaling[12226]: main.go:191: Could not initialize janus MCU (dial tcp connect: connection refused) will retry in 2s

    What can be wrong?

  20. Hallo Markus,
    danke Dir für die super Anleitung. Bei mir hat sich der Janus Server aber erst starten lassen nachdem ich in der /etc/janus/janus.jcfg aus Deiner Anleitung den „turn_server und turn_port auskommentiert hatte.
    #turn_server = „“
    # turn_port = 5349
    Dank Dir und ich freue mich über weitere tolle Anleitungen.

      1. Hi Markus, thanks for the reply. I have installed and configured everything but I am stuck at the nginx(docker in plesk) for my signaling subdomain. If you have any ideas, it would be great.
        Thanks again.

        1. Hi,

          disable „proxy mode“ and then it should be:

          add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";

          location /standalone-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_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;


  21. Hallo Christian,
    Nach einigen Versuchen habe ich es doch noch geschafft. Der signaling Server funktioniert nun problemlos. Besten Dank für Deine Anleitung! Die einzige die funktioniert auch für Linux Benutzer die das nicht den ganzen Tag machen.

    Ich versuchte noch im /etc/signaling/server.conf eine 2. Nextcloud Instanz zu aktivieren und ergänzte eine weitere Zeile mit allowed = anzugeben. Das scheint aber so nicht zu funktionieren. Wie genau ist der Syntax um mehrere zusätzliche Instanzen an zu fügen ausser mit dem Eintrag allowall = true. Damit funktioniert es zwar, aber dafür kann auch jeder den Server benutzen, vorausgesetzt er kennt den Schlüssel. Müsste doch irgendwie möglich sein. Ich habe leider auch nach einiger suche nichts dazu gefunden. Falls Du mal zeit hast wäre ich dankbar.
    Gruss Reto

      1. Hi Markus,
        Port 5349 is open – this is the first point of your lesson, and the TURN server would not work.
        In the log I get the following error: `403 Forbidden` response:
        Authentication check failed
        I read your answer to Andre. I checked secret share – it matches the one from /etc/signaling/server.conf.
        I will be glad if you have other ideas

  22. Hallo Christian,
    Besten Dank mal für Dein HowTo zum Thema Signaling Server. Wie ich unten schon schrieb (war ein dummer Fehler), lief das Setup des Standalone TURN/SIGNALING Server nun mehr oder weniger wie erwartet durch. Es gab aber ein paar Ungereimtheiten, welche nun dafür sorgen, dass der Signaling Server nicht korrekt funktioniert.
    In Step6: nginx -t ergibt:
    nginx: [warn] conflicting server name „“ on, ignored
    nginx: [warn] conflicting server name „“ on, ignored
    nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
    nginx: configuration file /etc/nginx/nginx.conf test is successful

    In Step 5: netstat -tulpen | grep 8080 gibt nichts zurück. Auf dem Port scheint also nichts zu laufen. Andere Ports die ich checkte sind auf „LISTEN“.

    In Talk Config auf der Nextcod erhalte ich denn einen Fehler im Bereich „Signaling Server“. Wenn SSL aktiv ist erhalte ich:
    Fehler: Ein unbekannter Fehler ist aufgetreten
    Ohne SSL (Haken weg):
    Fehler: Der Server antwortete mit: 404

    beim TURN Server Eintrag erhalte ich beim Test einen Haken, also ok.

    Der Fehler muss irgendwie im Bereich Signalingserver Installation oder NGINX sein. Ich komme im Moment einfach nicht dahinter.


  23. Hallo Markus

    Sorry, problem gelöst…. Ich rutschte tatsächlich in die falsche Konsolen session.. Sprich war auf dem falschen Server…
    Gruss Reto

  24. Hallo Markus,
    Ich habe mal Deine Anleitung genommen und das ganze auf einem Ubuntu 20 LTS Schritt für Schritt ausprobiert. Lief alles bestens bis zur Installation des NATS Server.
    Da muss irgendwas am Repo nicht stimmen. Ich erhalte immer die Fehlermeldung:
    E: Unable to locate package nats-server

    Habe es nun auch auf andere Wege, mit anderen TIpps versucht. Kein Erfolg. Kannst Du mir auf die Sprünge helfen?
    Danke Dir.
    Gruss Reto

  25. Moin Markus,

    zunächst einmal möchte ich Dir zu Deiner tollen Arbeit gratulieren. Ich habe bis dato nirgendwo anders ein derart ausführliche Beschreibung gefunden. Ich selber würde gerne auch „endlich“ bei mir das Nextcloud Talk High Performance Backend with Stun/Turnserver ans laufen kriegen, jedoch stoße ich bei mir – wohl mangels umfangreicher Linuxkenntnisse – auf erhebliche Schwierigkeiten.

    Bei mir ist Grundlage jeweils ein OMV5 NAS (Linux Debian 10) mit Nextcloud als Docker Lösung. Gerne würde ich nunmehr auch das Nextcloud Talk High Performance Backend with Stun/Turnserver ans Laufen kriegen und benötige dafür eigentlich ein Docker Image. Ich habe bis dato noch keine step by step Lösung gefunden die mir hilft mein „Projekt“ umzusetzen. Vielleicht könntest Du mir hier ein paar Hilfestellungen oder Tipps geben.

    Vielen Dank im Voraus


      1. Moin Markus,

        ich war einige Tage beruflich unterwegs und komme erst jetzt dazu mich wieder bei Dir zu melden.

        Der OMV5 Server steht bei mir vor Ort. OMV5 läuft bei mir auf einem AMD 5 Ryzen 3600 mit 32 GB in einem RAID10 Umfeld (4 x 4 TB NAS Platten). Insoweit wäre von der Hardware für ein ausreichendes Umfeld gesorgt.

        Ich würde mich sehr freuen, wenn Du mir weitere Tipps geben könntest, damit ich doch noch das Nextcloud Talk High Performance Backend with Stun/Turnserver ans laufen kriegen könnte.

        Vielen Dank im Voraus


        1. Moin Markus,

          da es doch offensichtlich nicht ganz so einfach ist ein funktionierendes Docker Image zu erstellen habe ich noch eine andere Frage. Kann ich Deine Anleitung auch auf Debian 10 Buster umsetzen?

          Der Hintergrund ist, dass ich OMV5 unter Debian 10 laufen habe. Wenn ich – leider – schon nicht in der Lage bin Deine Anleitung unter Docker umzusetzen, wäe es vielleicht eine Möglichkeit es vielleicht einfach unmittelbar auf Debian 10 zu probieren.

          Über ein kurzes Feedback würde ich mich sehr freuen.

          @Reto Vielen Dank für die Blumen, jedoch stehen diese ausschließlich Markus zu.

          Vielen Dank im Voraus


          1. Hi Christian, unter Debian habe ich es noch nicht versucht. Gib mir mal ein paar Tage. Arbeite gerade an eine docker-Lösung. Eventuell könnte Deine Bandbreite noch ein Thema sein. NC empfiehlt 1Gbit/s.
            Gruß Markus

          2. Moin Markus,

            das wäre eine super Sache, wenn Du Dich doch noch an das Docker Image dranmachen würdest.

            Bandbreite in meinem Intranet ist derzeit 2,5 Gbit/s. Internet wird derzeit auf Glasfaser umgerüstet und kann noch angepasst werden. Trotzdem ist natürlich 1Gbit/s ein Wort.

            Viele Grüße


Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert