Skip to content

Registry, Dashboard und Redis

Registry

src/server/registry/main.py ist FastAPI. models.py definiert ServerRegistration, HeartbeatRequest, UnregisterRequest. Endpunkte: POST /servers/register, /servers/heartbeat, /servers/unregister; GET /servers mit optional region/joinable und /servers/{hub_id}.

Keys heißen hubserver:{instanceId}. Heartbeat aktualisiert Spieler/Joinable/Time. Ein Hintergrundtask markiert nach 15 Sekunden ohne Heartbeat offline und nicht joinable; er löscht nicht. HubRegistryService auf dem Headless-Server sendet standardmäßig alle 10 Sekunden. Bei Änderungen beide Seiten und HubDiscoveryService prüfen.

Dashboard

src/server/dashboard/main.py rendert Jinja-Templates und pollt /servers im WebSocket /ws/servers alle zwei Sekunden. Status basiert auf Heartbeatalter. services/registry_client.py ist aktiv; redis_client.py und nakama_client.py sind leer. Dashboard ist Read-only, ungeschützt und keine Nakama-/Redis-Adminoberfläche.

Client und Headless

Game3D-Client: Core/Registry/HubRegistryClient.cs/HubDiscoveryService.cs. Headless: HubRegistryService.cs baut Registration aus RuntimeOptions. PublicHost/Port müssen vom Client erreichbar sein; Compose localhost ist aus Containern anders als vom Host.

Debugging und Tests

docker compose --env-file src/server/.env -f src/server/docker-compose.yaml logs -f registry
docker compose --env-file src/server/.env -f src/server/docker-compose.yaml logs -f dashboard

Prüfe /servers, instanceId, region, joinable, current/maxPlayers, host/port, version und last_heartbeat. Automatisierte Tests fehlen. Typische Fehler: Server startete vor Registry, falsche URL ohne erreichbaren Host, Heartbeat > TTL, Redis-Neustart, server-public-host zeigt auf Loopback für Remote-Clients.

Verwandt: Headless, Multiplayer, Konfiguration.