19. September 2026

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

000357-1024x355 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:ro

Beispiel 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]:

FeldWert
URLturn:turn.domain.tld:3478
Benutzernameromm-domain
Passwort[DEIN_STARKES_PASSWORT]

Testen

  1. RomM aufrufen und ein Spiel mit Netplay-Unterstützung starten.
  2. Einen Netplay-Raum erstellen.
  3. 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.