Mytho · Server-Verwaltung

Master-Control-Plane · lade …
Start/Stop/Neustart steuert die Container dieses Projekts über den Docker-Socket des Masters.
Realm-Verzeichnis (Live/Test/Entwicklung). Name, Status und Sichtbarkeit ändern und speichern – wirkt auf die Realmauswahl im Client. Quelle: dbservice.
Spieler-Konten dieses Realms als Liste. Rolle inline wählen (speichert sofort) – steuert, welche Realms (public/dev/gm) der Spieler sieht und betreten darf. „Bann…“ öffnet den Bann-Editor je Zeile; „Entsperren“ erscheint bei Konten mit Login-Sperre (5 Fehlversuche = 1 h) und hebt sie sofort auf. „Löschen“ (nur admin) entfernt ein Konto endgültig samt Spielfiguren – zur Bestätigung muss der Benutzername eingetippt werden; Admin-Konten lassen sich so nicht löschen. Filter oben. Quelle: dbservice (auth_db des Realms).
Mindestrolle je Spiel-Kommando (aufsteigend: player → vip → qa → dev → gm → admin). Wer mindestens diese Rolle hat, darf das Kommando ausführen. Änderungen wirken beim nächsten Katalog-Abgleich des Gameservers (max. 60 s) – laufende Sitzungen behalten die Rolle aus ihrem Launch-Ticket bis zum nächsten Login. Nur Konten mit der Rolle admin können hier ändern. Quelle: dbservice (auth_db.command_permissions), gilt für alle Realms dieses Stacks.
Anti-Cheat-Protokoll: eine Zeile je beendeter Spielsitzung, in der Verstöße aufgetreten sind (nicht je Verstoß – so kann ein manipulierter Client die Liste nicht fluten). Der laufende Server-Log ist auf eine Zeile alle 5 s gedrosselt und verliert die Verteilung; hier steht sie vollständig. Ab 50 Verstößen wird die Sitzung getrennt (Spalte „Ende“). Für Rollen ab qa greifen die Plausibilitäts-Prüfungen nicht – solche Sitzungen erscheinen normalerweise gar nicht. Aufbewahrung: 24 Stunden, danach wird automatisch gelöscht. Quelle: dbservice (auth_db.violation_log).
Ergebnisse der Testrunden. Die Tester tragen im eigenständigen Testprotokoll ein (eigener Dienst, eigener Host, Anmeldung mit dem Spielkonto) – hier steht, was dabei herauskam. Matrix: eine Zeile je Fall, eine Spalte je Tester. Befunde: nur die gemeldeten Fehler mit Notiz und Charakter-Kontext. Verbesserungsvorschläge: Fälle, die funktionieren, zu denen der Tester aber eine Idee eingetragen hat (Status „Vorschlag“), ebenfalls mit Notiz. Der Stand ist live, ihr müsst nicht auf die Abgabe warten. Quelle: dbservice (auth_db.test_results).
Testrunden anlegen und pflegen. Eine Runde besteht aus Blöcken (z. B. „Handel“) mit einzelnen Fällen. Der Plan liegt als Daten in der Datenbank – eine neue Runde braucht deshalb kein Deployment. Mindestrolle steuert, wer teilnehmen darf: qa für einen benannten Testerkreis, player für eine offene Runde. Nur offene Runden nehmen Antworten an; geschlossene bleiben lesbar. Die Reihenfolge der Runden in Auswahlliste und Testprotokoll legt die Karte „Reihenfolge der Runden“ unten fest (oder das Feld „Reihenfolge“ im Editor).
Ergebnisse des Systemchecks, eingesendet über die Seite /systemcheck im Testprotokoll-Dienst – ohne Anmeldung, die meisten Einsender haben noch kein Konto. Einstufung nach den aktuellen Schwellen des Clients (Ø FPS / 1 %-Tief): flüssig 60/40, gut 45/30, spielbar 30/20, knapp ab 20 FPS, darunter zu langsam; mehr als 20 Ausreißer je Minute kosten eine Stufe. Ändern sich die Schwellen, werden auch alte Einsendungen neu eingestuft. Standardmäßig zählen gestörte Messungen, Kurzläufe und ausgeblendete Einsendungen nicht mit. Ausblenden nimmt eine Einsendung aus der Auswertung, Löschen (ab gm) entfernt sie samt Discord-Name und E-Mail endgültig – der Weg für Löschwünsche. Quelle: dbservice (auth_db.systemcheck_submissions).

Überblick

Mytho ist ein modularer MMO-Backend-Stack in Rust. Er ist getrennt in eine Control-Plane (dieser Master) und mehrere Daten-Dienste (Auth, Chat, Game, Datenbank), alle in Docker. Je Umgebung (Live/Test/Dev) läuft ein eigener, vollständig getrennter Stack mit eigenen Datenbanken – dieses Dashboard verwaltet den Stack seines Realms (das Dev-Dashboard zusätzlich realmübergreifend Deployment und Nutzer). Diese Seite beschreibt die geplante Zielarchitektur, den aktuellen Stand und das Gameserver-Konzept.

Zielarchitektur v5 (geplant)

Leitprinzip: Ein Edge Load Balancer (Traefik) ist ab dem MVP der einzige öffentliche Eingang für die austauschbaren HTTP/WSS-Dienste (Status, Login/Auth, Realm-Gateway, Chat). Gameplay-Verbindungen werden dagegen gezielt vom Realm-Gateway zugewiesen (konkrete Zieladresse + Zone-Ticket) – kein zufälliges Round-Robin. Der Master bleibt interne Control Plane und liegt nicht im Gameplay-Datenpfad. Master, NATS, Redis und PostgreSQL bleiben privat. (Quelle: Mytho_*_v5 in Server/doku/.)

Launcher Login-UI · Patch · Start Patch-Service / CDN Signiertes Manifest Godot-Client Realm · Charaktere · Chat Client-Start (Launch-Ticket, stdin-Pipe) HTTPS Login/Status WSS (Realm/Chat) Edge Load Balancer (Traefik) · einziger öffentlicher Eingang TLS · Host/Path-Routing · Health-Checks · Rate-Limits Master Control Plane Registry · Health Routing · Last Zone-/Layer- Zuweisung Login / Auth ×N DB-Login (argon2id) Launch-Ticket · Realms Realm-Gateway ×N Realm-/Character-Flows stellt Zone-/Chat-Ticket aus Chat-Server ×N Channels · Gilde Whisper · Moderation Status · Routing Zone-Ticket Zone-/Game-Server ×N PlayerSession · Map · Movement autoritative Simulation Gameplay (direkt) Intern / privat – nie öffentlich erreichbar: Konten · Tickets Redis Tickets · Sessions · Presence NATS interne Events · Pub/Sub Persistence Service Accounts · Characters · World PostgreSQL dauerhafte Daten Spieler-/Datenverkehr Control-Plane / intern
v5-Zielarchitektur: Der Edge Load Balancer ist der einzige öffentliche Eingang; den Zone-Server weist das Realm-Gateway gezielt zu (Zone-Ticket), die Gameplay-Verbindung läuft direkt – nicht über den Edge. Master, NATS, Redis und PostgreSQL bleiben privat.

Ausfallsicherheit

  • Auth signiert Token mit Ed25519; andere Dienste prüfen sie lokal mit dem öffentlichen Schlüssel. Fällt Auth aus, bleiben eingeloggte Spieler aktiv – nur neue Logins sind blockiert.
  • Fällt der Master aus, laufen die Dienste weiter und melden sich danach selbst wieder an.
  • Mehrere Game-Server-Instanzen: fällt eine aus, sind nur deren Zonen betroffen.

Aktueller Stand vs. geplant

BereichHeuteGeplant
Dienst-KommunikationHTTP-Registry + Heartbeat (hinter RegistryClient-Trait)NATS-Bus (Pub/Sub, Request/Reply) als zweite Trait-Implementierung
Öffentlicher EingangDienste-Ports direkt (nur 127.0.0.1)Edge Load Balancer (Traefik): TLS, Routing, Health, Rate-Limit
Client-TransportHTTP/JSON (Login, Register, Launch-Ticket, Charaktere, Weltinhalte) + ENet/UDP für die SpielweltWSS über Edge (Realm/Chat) + direkte Zone-Verbindung
Realm-/Zone-ZugangRealm-Verzeichnis (realms in auth_db) + Zugangsrollen (player/dev/gm/admin); Realm-Auswahl im Client, Login im LauncherRealm-Gateway: Realm-/Character-Flows, Zone-/Chat-Tickets
Game-WeltENet-World-Entry + Movement/Chat, Map-Interest-Management, Live-Ausrüstung, Doppel-Login-Schutz, server-autoritative Autosave (Position, Stats, Inventar, Währungen, Quests, Bank, Skills, Taschen)Zonen/Layer, server-autoritative Simulation
Persistenzdbservice ↔ PostgreSQL mit drei Datenbanken je Realm: auth_db (Konten/Realms), character_db (Charaktere/Wirtschaft/Quest-Fortschritt), world_db (Weltinhalte)Persistence Service + Redis-Cache
AuthDB-Login (argon2id) + Registrierung, signierte Token, Launch-Ticket, IP-Rate-Limit + Konto-Lockout+ Refresh/Revocation, X-Forwarded-For hinter Proxy
DeploymentRealm-Promotion (Dev → Test → Live) und Rebuild aus dem Quellcode, beides aus dem Dashboard (Reiter „Steuerung", Dev-Overlay)CI-gestützte Pipelines

Dienste

DienstAufgabe
masterRegistry, Health, Web-Dashboard (Dienste, Steuerung, Realms, Nutzer, Doku), Container-Steuerung, Deployment (Promotion/Rebuild), Nutzer-/Realm-Verwaltung (auch realmübergreifend, Dev-Overlay)
authDB-Login (argon2id) + Registrierung, Launch-Ticket, signierte Session-Token, Public-Key; HTTP-Fassade für Realm-Liste, Charaktere und Weltinhalte (Lesen: Session-Token, Schreiben: Rollen ab dev)
chatPrototyp (Registrierung + Heartbeat); die Spiel-Chat-Kanäle (welt, flüstern) laufen derzeit über den Gameserver
gameserverENet-Welttransport: World-Entry (Ticket→DB-Charakter→Spawn), Movement-/Chat-Broadcast je Map, Live-Ausrüstung, Doppel-Login-Schutz, server-autoritative Autosave (Position/Stats/Inventar/Währungen/Quests/Bank/Skills/Taschen); pro Zone/Shard skalierbar
dbservicePostgreSQL-Anbindung mit drei Pools: Konten/Realms (auth_db), Charaktere inkl. Wirtschaft + Quest-Fortschritt (character_db), Weltinhalte (world_db); Health + Kennzahlen per Heartbeat
testerTestprotokoll für Testrunden: Tester melden sich mit ihrem Spielkonto an (eigener Token-Zweck test), haken einen Testplan ab und geben einen Statusbericht ab. Bewusst ein eigener Prozess und nicht Teil des Masters – dieser steuert Container und Deployments, jenes ist eine Anmeldemaske im offenen Netz. Hält keine DB-Zugangsdaten. Auswertung und Editor liegen hier im Dashboard (Reiter „Tests“). Zweite Aufgabe: die offene Seite /systemcheck für Systemcheck-Einsendungen ohne Anmeldung (Größen- und IP-Bremse, Auswertung unter „Tests → Systemcheck“)

Datenbanken (je Realm)

DatenbankInhalt
auth_dbKonten (argon2id-Hashes), Zugangsrollen, Login-Historie/Lockout, Bann-Status, Realm-Verzeichnis, Kommando-Berechtigungen (command_permissions), Anti-Cheat-Protokoll (violation_log, 24 h), Testprotokoll (test_plans/test_results/test_submissions)
character_dbCharaktere (Slot 0–3, Soft-Delete), Stats/Fortschritt, Inventar, Währungen, Item-Katalog, Quest-Fortschritt (character_quests), Bank (character_bank/account_bank), Skillbaum-Punkte (character_skills), Taschen
world_dbWeltinhalte, eine Tabelle je Art (world_quest, world_npc, Spawns, Dialoge, Vendor, Wegpunkte, Spells, Skilltrees): key + rohes Editor-JSON. Quelle der Wahrheit statt lokaler Dateien; Clients ziehen sie beim Login (mit lokalen Backups), Editor-Speichern pusht automatisch (Rollen ab dev), manuell per /worldsync push|pull

Jeder Realm (Live/Test/Dev) hat seine eigenen drei Datenbanken in einem eigenen Postgres-Container – Daten vermischen sich nie. Schema-Migrationen liegen in db/init/ und werden bei Promotion/Rebuild idempotent nachgezogen.

Dashboard-Funktionen

  • Dienste: Live-Status aller registrierten Dienste (Heartbeat, Kennzahlen wie Konten-/Charakter-/Quest-Zahlen der Datenbanken).
  • Steuerung: Container starten/stoppen/neustarten (nur mit ENABLE_DOCKER_CONTROL=true). Im Dev-Overlay zusätzlich Deployment: Promotion überträgt gebaute Images Dev → Test → Live, Rebuild baut einen Realm aus dem Quellcode neu – beides mit Migrations-Phase und Live-Protokoll.
  • Realms: Realm-Verzeichnis pflegen (Name, Status, Sichtbarkeit public/dev/gm) – wirkt direkt auf die Realmauswahl im Client.
  • Nutzer: Konten als filterbare Tabelle (Suche/Rolle/Status) mit Inline-Rollenwahl und Bann-Editor (temporär/permanent). Konto anlegen legt Konten auf einem wählbaren Realm an (Passwort-Hashing bleibt im Auth-Dienst des Ziel-Realms). Mit konfigurierten Sibling-Mastern (ADMIN_REALM_MASTER_URLS, Dev-Overlay) schaltet ein Realm-Umschalter die Kontenverwaltung auf Test/Live um.
  • Nutzer → Commands verwalten (nur Rolle admin): Mindestrolle je Spiel-Kommando – Admin-Kanal (admin.add_gold, admin.add_experience, admin.set_level, admin.add_item, admin.set_speed, admin.kill_npc), dieselben Kommandos auf andere Spieler (admin.set_level.other …, Standard gm: greift nur, wenn der GM im Spiel einen Mitspieler anvisiert hat; der Server nimmt immer das Maximum aus Grund- und .other-Schlüssel), Anzeige-Tags über dem Spielernamen (tag.adm …), Weltinhalte schreiben (world.push) und Chat-Nachrichten senden (chat.send, Standard player – höher stellen beschränkt den Chat z. B. im Wartungsfenster auf Team-Rollen). Die Spalte Chat-Befehl zeigt die auslösende Chat-Eingabe (z. B. /addgold <betrag>; Quelle: ChatCommandHandler.gd, DB-Spalte chat_commands, nicht editierbar). Quelle: auth_db.command_permissions. Der Gameserver übernimmt Änderungen binnen 60 s; laufende Sitzungen behalten die Rolle aus ihrem Launch-Ticket bis zum nächsten Login. Fehlt ein Eintrag, gilt der Standardwert aus dem Code (fail-safe).
  • Nutzer → Verstöße (ab Rolle gm): Anti-Cheat-Protokoll – eine Zeile je beendeter Spielsitzung, in der der Gameserver Client-Updates wegen fehlender Plausibilität verworfen hat, mit Verteilung je Art, Sitzungsdauer und der Angabe, ob die Sitzung wegen der Strike-Schwelle (50) getrennt wurde. Der laufende Server-Log ist auf eine Zeile alle 5 s je Sitzung gedrosselt und verliert die Verteilung; eine Zeile je Verstoß wäre umgekehrt selbst ein Flut-Vektor. Für Rollen ab qa greifen die Plausibilitäts-Prüfungen nicht (Speed-/Teleport-Tests sind Arbeitsmittel, Tester sollen keine Strikes sammeln) – solche Sitzungen erscheinen normalerweise nicht. Quelle: auth_db.violation_log, Aufbewahrung 24 Stunden (VIOLATION_LOG_RETENTION_HOURS), danach automatische Löschung. Fehlt die Tabelle, bleibt die Liste leer (fail-safe).
  • Tests → Systemcheck (ab Rolle dev, Löschen ab gm): Einsendungen des Client-Systemchecks, abgegeben über die Seite /systemcheck im Dienst testerohne Anmeldung. Der Browser des Einsenders liest den Bericht selbst, übertragen werden nur der Bericht als JSON und die Formularangaben (Eindruck, MMO-Erfahrung, Maestia-Kenntnis, Zeit für geschlossene Tests, Discord/E-Mail). Das Formular gibt es auf Deutsch und Englisch (/systemcheck?lang=en); die gewählte Sprache steht in der Einsendung, damit ihr in der richtigen Sprache anschreibt. Der Master stuft beim Lesen nach den Schwellen des Clients ein (flüssig 60/40, gut 45/30, spielbar 30/20, knapp ab 20 FPS; mehr als 20 Ausreißer je Minute kosten eine Stufe), die Einstufung steht also nicht in der Datenbank. Ansicht: Kennzahlen, Verteilung der Einstufung, Auswertung je Grafikkarte und je Prozessor, Bewerber für geschlossene Tests, alle Einsendungen mit Details und Rohbericht; Excel mit drei Blättern. „Formular ansehen“ (auch über die Nummer in der Bewerberliste) öffnet eine Einsendung komplett als Blatt: der Bericht aufbereitet wie auf der Formularseite (Urteil, Kennzahlen, Strecke, Hardware, alle Messwerte, Hinweise), darunter alle Antworten; mit Druckansicht, Schließen per Knopf, Escape oder Klick daneben. Standardmäßig ohne gestörte Messungen, Kurzläufe und ausgeblendete Einsendungen. Quelle: auth_db.systemcheck_submissions (Migration 45). Fehlt die Tabelle, bleibt die Liste leer und die Seite meldet „nicht eingerichtet“.

Autoritätsübersicht (Client vs. Server)

Wer bestimmt welchen Spielwert? Legende der Spalte Verwaltung:

  • Server-autoritativ – der Server rechnet/entscheidet, der Client kann es nicht fälschen.
  • Server-persistiert (client-gemeldet) – der Server speichert, die Werte kommen vom Client, aber mit Plausibilitätsgrenzen (Anti-Cheat verwirft Unmögliches).
  • Content (world_db) – vom Editor gepflegt, Schreiben nur ab Rolle dev.
  • Client/lokal – (noch) nicht server-abgesichert oder bewusst rein lokal.
BereichVerwaltungAnmerkung
Login, Session-/Launch-Ticket, Zugangsrolle, Realm-ZugangServer-autoritativargon2id; Ed25519-Token mit purpose + jti-Einmalverbrauch; Rolle im Ticket
Charakter-CRUD/Slots/Aussehen, Ownership, SpielzeitServer-autoritativaccount_id serverseitig aufgelöst; Playtime zählt der Server
Level, Attribute, XP, HP/MP, Position, BewegungServer-persistiert (client-gemeldet)Wertebereiche, Statpunkte-Budget, XP-/Level-Sprung-Caps, Move-Speed-Check (nicht tick-simuliert)
Gold-/Item-Zugänge: Vendor-Kauf/-Verkauf, Quest-Belohnung, GM-KommandosServer-autoritativPreise/Belohnungen aus dem Katalog (world_db + item_templates); Audit-Log character_transactions
Inventar-Bestand, Bank, Währungs-/Skill-/Taschen-SyncServer-persistiert (client-gemeldet)Voll-Sync mit Plausibilität (Slots/Menge/Enchant) + Währungs-Sprung-Cap
Quest-Abgabe & BelohnungServer-autoritativZiele serverseitig verifiziert, Belohnung einmalig je Annahme (turned_in-Schutz)
Quest-Annahme/Status, FortschrittszählerServer-persistiert (client-gemeldet)Zähler auf Zielwert geklemmt; fälschungssicher erst mit Kampf-Autorität
Welt-/Editor-Inhalte: Quests, NPCs, Spawns, Dialoge, Vendor, Wegpunkte, Spells, SkilltreesContent (world_db)Pull beim Login (mit Backups), Editor-Auto-Push, Schreiben ab dev
Mitspieler-Sichtbarkeit (Interest-Management), Map-/Portalwechsel, Remote-Ausrüstung, Chat-Routing/FloodServer-autoritativMap-Filter, Kanal-Routing und Flood-Schutz serverseitig
Anti-Cheat: Plausibilität, Rate-Limit, Strike-SystemServer-autoritativungültige Pakete verworfen; ab 50 Verstößen Kick
Audio/Grafik/Keybinds/HUD/Chat-OptikClient/lokalreine Präferenzen, kein Server-Bezug

Kurzfazit: Alles, was Werte erzeugt (Gold, Items, Belohnungen, Level per GM), ist server-autoritativ. Was der Client noch meldet (Bestände, Zähler, Position), ist server-persistiert mit Plausibilitätsgrenzen. Noch offen (an die NPC-/Kampf-Autorität gekoppelt): NPC-Bewegung/HP/Aggro, Kampf/Schaden/Loot, fälschungssicherer Quest-Zähler, dupe-sicherer Inventar-Voll-Sync sowie die ENet-Transport-Verschlüsselung.

Gameserver-Konzept

Sharding: eine Instanz je Zone

Die Spielwelt wird in Zonen (und Layer/Ebenen) aufgeteilt. Jede Zone/Ebene läuft als eigene Game-Server-Instanz. Reicht die Kapazität nicht, kommen weitere Instanzen hinzu (horizontale Skalierung). Im v5-Modell weist das Realm-Gateway dem Spieler die konkrete Instanz zu (Auswahl über den Master nach Health/Last).

Spielwelt in Zonen geteilt Zone A Zone B Zone C Game-Server-Instanz #1 · Zone A Game-Server-Instanz #2 · Zone B Game-Server-Instanz #3 · Zone C
Jede Zone = eine Game-Server-Instanz. Mehr Instanzen → mehr Zonen/Kapazität.

Verbindungsablauf (v5)

Wie ein Client in die Spielwelt kommt – vom Launcher-Login über den Edge bis zum gezielt zugewiesenen Zone-Server:

1 · Login über den Edge → Auth (DB-Prüfung, argon2id) Auth liefert Access-Token + Launch-Ticket; kein Passwort verlässt den Auth-Server 2 · Client-Start Launcher übergibt das Launch-Ticket per stdin-Pipe an den Godot-Client 3 · Realm-Gateway über den Edge (WSS) Ticket einlösen · Realm wählen · Charakter wählen/erstellen 4 · Zone-Zuweisung über das Realm-Gateway fragt Master (Health/Last) und stellt Zone- + Chat-Ticket aus 5 · Direkte Zone-Verbindung → Welt betreten Client verbindet den gezielt zugewiesenen Zone-Server; Chat läuft über den Edge
Login im Launcher über den Edge; danach arbeitet der Client nur mit kurzlebigen Tickets. Der Zone-Server wird gezielt zugewiesen – die Gameplay-Verbindung läuft direkt, nicht über den Edge.

Weitere Bausteine (geplant)

  • Server-autoritativ: der Game-Server ist die Wahrheit über Position/Zustand (Anti-Cheat).
  • Interest-Management: ein Client erhält nur Updates aus seinem Sichtbereich/seiner Zone.
  • Zonenwechsel/Handover: Übergabe zwischen Instanzen über ein neues Ziel-Ticket, koordiniert über Master/Bus.
  • Persistenz: kontrolliertes Speichern (u. a. Logout-Position) über den Persistence Service (API + Redis-Cache), nicht direkt aus dem Zone-Server.

Sicherheit

Zugriffszonen (Master)

  • Öffentlich: GET /healthz – ohne Authentifizierung.
  • Intern (Dienste): POST /api/register, /api/heartbeat – nur mit Bearer-Token MASTER_SERVICE_TOKEN.
  • Administrativ: Dashboard, /api/services, /api/realms*, /api/accounts*, /api/commands* (nur admin), /api/containers*, /api/promotions* – nur mit HTTP Basic (MASTER_ADMIN_USER/MASTER_ADMIN_PASSWORD).

Härtung

  • Secrets werden nur als SHA-256-Hash gehalten und in konstanter Zeit verglichen; in production verhindern fehlende oder schwache/Default-Secrets den Start.
  • Veröffentlichter Port nur an 127.0.0.1 gebunden; externer Zugriff ausschließlich hinter TLS-Reverse-Proxy oder VPN. CORS ist deaktiviert.
  • Rate-Limit für Registrierung und fehlgeschlagene Admin-Anmeldungen (Heartbeats nicht limitiert); Request-Timeout und globales Concurrency-Limit.
  • Container-Steuerung standardmäßig deaktiviert (ENABLE_DOCKER_CONTROL=true nötig); Deployment und realmübergreifende Nutzerverwaltung nur im Dev-Overlay.
  • Passwörter werden ausschließlich im Auth-Dienst mit argon2id gehasht – auch bei der Konto-Anlage aus dem Dashboard leitet der Master nur weiter und hasht nie selbst.
  • Dashboard rendert externe Werte nur als Text (kein HTML-Sink); strikte CSP (default-src 'self', ohne unsafe-inline) plus X-Content-Type-Options, Referrer-Policy, Permissions-Policy, Cache-Control: no-store; serverseitige Eingabe-Validierung + Body-Limit 16 KiB.
  • Private Schlüssel werden nie geloggt; in production startet Auth nur mit gültigem AUTH_SIGNING_KEY.

Bedienung

cd Server
docker compose up -d --build          # bauen + starten
docker compose logs -f master         # Logs
docker compose down                   # stoppen
docker compose up -d --scale gameserver=3   # skalieren

Mehr Details

Ausführliche Dokumentation liegt im Repo unter Server/doku/ (Architektur, Dienste, Konfiguration, API, Datenbank, Betrieb, Gameserver-Konzept).