Coturn: TURN Server in Docker installieren

Ich brauchte kürzlich für ein Update einen funktionierenden TURN Server. Ohne den lief das neue Feature schlicht nicht. Meine erste Idee war bequem. Öffentlichen TURN Server nehmen, fertig. Kostenlose Basisversion, 20 GB Traffic im Monat, klang ausreichend.

War es nicht.

Ich hatte Verbindungsabbrüche, Timeouts und merkwürdige Reconnects. Mehrere Stunden Debugging später, inklusive Tests mit einem Server eines Freundes, stand fest: Die Ursache lag nicht in der Anwendung. Der externe Dienst war schlicht unzuverlässig. Also blieb nur die Variante, die ich eigentlich vermeiden wollte: selbst einen TURN Server betreiben.

🔁 Warum ich mich für einen eigenen TURN Server entschieden habe

Der Hauptvorteil war Stabilität und Kontrolle. Sobald WebRTC über Relay laufen muss, bist du komplett vom TURN abhängig.

Ich habe mich deshalb für coturn entschieden. Schlank, bewährt und vor allem ohne Datenbank nutzbar. Für viele Anwendungsfälle reicht das völlig.

Überraschung: Die Einrichtung war deutlich einfacher als erwartet.

🧩 Voraussetzungen

Bevor es losgeht, brauchst du natürlich eine funktionierende Docker-Umgebung.
Wenn du Docker noch nicht installiert hast, findest du hier eine Schritt-für-Schritt-Anleitung, wie du das auf Ubuntu mit einem Script erledigst:

Sobald Docker läuft, kann es direkt weitergehen.

🔥 Firewall vorbereiten

Da ich den Container im Host-Modus betreibe, müssen die Ports direkt auf dem Host offen sein:

sudo ufw allow 3478/tcp comment "Coturn STUN/TURN TCP"
sudo ufw allow 3478/udp comment "Coturn STUN/TURN UDP"
sudo ufw allow 49160:49200/udp comment "Coturn TURN UDP Media Range"

Damit ist der Relay-Portbereich für Medienstreams erreichbar. Ohne den Bereich funktioniert TURN zwar scheinbar, aber Medien kommen nie an.

🐳 Docker Compose für coturn

Im Projektordner habe ich einen Ordner erstellt und darin die docker-compose.yaml angelegt:

---
services:
  coturn-app:
    image: coturn/coturn:4.6
    container_name: coturn-app
    hostname: turn1.techniverse.net
    restart: unless-stopped
    network_mode: host
    volumes:
      - ./data/turnserver.conf:/etc/coturn/turnserver.conf:ro
    command: ["-c", "/etc/coturn/turnserver.conf", "--no-cli", "-v"]

Der Hostname sollte auf deine Domain zeigen. DNS-Eintrag nicht vergessen.

⚙️ Konfiguration des TURN Servers

Im Ordner data kommt die turnserver.conf:

realm=techniverse.net
server-name=turn1.techniverse.net

listening-ip=0.0.0.0
listening-ip=::

listening-port=3478

lt-cred-mech
user=appuser:ReplaceWithStrongPassword123

min-port=49160
max-port=49200

external-ip=203.0.113.5/2001:db8:dead:beef::5

no-tls
no-dtls

fingerprint

verbose

Wichtig:

  • Realm und Server-Name anpassen
  • Benutzer und Passwort anpassen
  • externe IP muss die öffentliche Serveradresse sein
  • IPv6 Zeilen löschen, wenn du keins nutzt

▶️ Start und Test

Starten:

docker compose up -d
docker compose logs -f

Nach Eintragen der Zugangsdaten in der Zielanwendung lief die Verbindung sofort stabil. Keine Abbrüche mehr. Kein Glücksspiel mit externen Relays.

🧠 Mein Fazit

Der selbst gehostete TURN Server war am Ende weniger Aufwand als das Debugging eines fremden Dienstes. Sobald deine Anwendung zuverlässig funktionieren muss, lohnt sich das selbst hosten praktisch immer.

Du brauchst keine große Infrastruktur. Ein kleiner VPS reicht völlig.

Und das Beste: Seitdem habe ich Ruhe.

👥 Techniverse Community

Lust auf Austausch rund um Matrix, Selfhosting und andere smarte IT-Lösungen?
In der Techniverse Community triffst du Gleichgesinnte, kannst Fragen stellen oder einfach nerdigen Talk genießen. 🚀

👉 Jetzt der Gruppe auf Matrix beitreten
~ Direkte Raumadresse: #community:techniverse.net

👉 Für lockere Gespräche abseits der Kernthemen komm in den Talkraum
~ Direkte Raumadresse: #talk:techniverse.net

Wir freuen uns, wenn du dabei bist!

Vielen Dank fürs Teilen!