RomM Netplay: „Invalid session“-Fehler beheben (inkl. eigener TURN-Server)

RomM ist ein ROM-Manager, den man sehr gut selbst hosten kann. Seit Version 5.x gibt es außerdem Netplay: Man kann Retro-Spiele direkt im Browser gemeinsam spielen. Beim Einrichten bin ich allerdings über einen Fehler gestolpert, der mich einige Zeit gekostet hat: Invalid session. In diesem Beitrag zeige ich, woran es liegt und wie man es mit einer einzigen Umgebungsvariable löst. Außerdem beschreibe ich, wie du einen eigenen TURN-Server anbindest, damit Netplay auch hinter NAT zuverlässig funktioniert.
Das Problem
Getestet habe ich mit RomM 5.2.0 im Docker-Container. Sobald Netplay genutzt wurde (Raum erstellen bzw. beitreten), brach die Verbindung ab und in den Logs bzw. im Browser tauchte der Fehler „Invalid session“ auf.
Die Ursache
Netplay nutzt im Hintergrund Websockets (Socket.IO). Läuft der RomM-Backend-Prozess mit mehreren Workern, landen die einzelnen Requests eines Clients nicht zwingend beim selben Worker. Der Worker, der die Session nicht kennt, lehnt sie ab, und genau das äußert sich als „Invalid session“.
Die Lösung: WEB_CONCURRENCY=1
Die Anzahl der Worker lässt sich über die Umgebungsvariable WEB_CONCURRENCY steuern. Setzt man sie auf 1, gibt es nur noch einen Worker und alle Netplay-Verbindungen landen bei derselben Instanz.
In der docker-compose.yml sieht das so aus:
yaml
services:
romm:
image: rommapp/romm:latest
environment:
- WEB_CONCURRENCY=1
# ... deine übrigen Variablen (DB, Auth-Keys usw.)Anschließend den Container neu erstellen:
bash
docker compose up -d romm
Danach funktioniert Netplay ohne den Fehler. Für einen privaten Server mit überschaubarer Nutzerzahl ist ein einzelner Worker in der Regel völlig ausreichend.
Bonus: Eigener TURN-Server für stabiles Netplay
Netplay baut Verbindungen per WebRTC auf. Sind Spieler hinter unterschiedlichen NATs, reicht ein reiner STUN-Server oft nicht aus, dann braucht es einen TURN-Server als Relay. Ich betreibe dafür Coturn auf einem eigenen Host unter turn.domain.tld.
Coturn per Docker Compose
Wichtig: Coturn läuft bei mir mit network_mode: host. Das erspart das Mappen des großen Relay-Portbereichs.
yaml
services:
coturn:
image: coturn/coturn:latest
container_name: coturn
network_mode: host
restart: unless-stopped
volumes:
- ./turnserver.conf:/etc/coturn/turnserver.conf:roBeispiel turnserver.conf
conf
listening-port=3478 realm=turn.domain.tld fingerprint lt-cred-mech # Benutzer:Passwort - unbedingt ein starkes Passwort wählen! user=romm-domain:[DEIN_STARKES_PASSWORT] # Relay-Portbereich (in der Firewall freigeben) min-port=49160 max-port=49200 # Nur nötig, wenn der Server hinter NAT steht # external-ip=[ÖFFENTLICHE_IP] no-multicast-peers no-cli
Firewall nicht vergessen: 3478/UDP und TCP sowie der Relay-Portbereich (hier 49160-49200/UDP) müssen erreichbar sein.
TURN-Server in RomM eintragen
In RomM wird der Server als ICE-Server für Netplay hinterlegt [Menüpfad/Config-Stelle ggf. ergänzen]:
| Feld | Wert |
|---|---|
| URL | turn:turn.domain.tld:3478 |
| Benutzername | romm-domain |
| Passwort | [DEIN_STARKES_PASSWORT] |
Testen
- RomM aufrufen und ein Spiel mit Netplay-Unterstützung starten.
- Einen Netplay-Raum erstellen.
- Mit einem zweiten Gerät (am besten aus einem anderen Netz, z. B. Mobilfunk) beitreten.
Wenn beide Spieler im selben Raum landen und kein „Invalid session“ mehr erscheint, ist alles korrekt eingerichtet.
Fazit
Der Fehler wirkt zunächst kryptisch, die Lösung ist aber simpel: WEB_CONCURRENCY=1 setzen, Container neu erstellen, fertig. Mit einem eigenen TURN-Server wird Netplay zusätzlich unabhängig von fremden Diensten und läuft auch bei kniffligen NAT-Konstellationen stabil.