Zum Inhalt springen
← Zurück zum Einsatzprotokoll

v0.24.0

21. April 2026

Säule 5.1: Save-Boundary

130

Commits

249

Dateien

+26017 / -8301

Zeilen

Dispatcher, dieses MEGA-Update zieht eine harte Save-Grenze durch die gesamte Leitstelle: API, Rechte, Timer und Queries laufen jetzt tenant-sicher zusammen. Dazu kommen konkrete Live-Fixes für Admin-Login, Deploy-Reload, OOM und Overpass, damit heiße Schichten unter Last stabil bleiben.

🎨 DESIGN

Die Progress- und Discord-Embeds wurden auf data-first Render mit klaren CTAs und `/maintenance`-Linking umgestellt, weil Statuskommunikation nur hilft wenn sie sofort in die richtige Aktion führt.ShadowShadow

  • Beim Öffnen eines Embeds siehst du direkt belastbare Daten statt flackernder Placeholder.
  • Ein Klick aus Discord landet gezielt auf der Wartungsseite statt auf einer unpassenden Landing-Route.

PERFORMANCE

Build-ID-Watcher plus no-cache-HTML erzwingen nach Deploy einen sauberen Client-Reload, damit Frontend und Backend auf derselben Release-Basis laufen und du keine Schema-Mismatches spielst.ShadowShadow

  • Wenn der Patch während einer laufenden Session ausgerollt wird, zieht der Client automatisch auf die neue Build-ID.
  • Dispatcher müssen nicht manuell hard-reloaden, um wieder gültige API-Calls zu senden.

Die Runtime-Memory-Konfiguration wurde auf Heap 2 GB bei Container 3 GB stabilisiert, weil Cgroup-OOM den Prozess vorher hart beenden konnte und du dadurch keine stillen Server-Abbrüche mehr in Lastspitzen bekommst.ShadowShadow

  • Bei hoher Einsatzdichte bleibt der Prozess online, statt ohne klaren OOM-Flag zu verschwinden.
  • Das Verhältnis Heap:Container (≈1:1.5) verhindert, dass der Kernel Node vor Docker-Klassifizierung killt.

Prisma, Dispatcher und Projektionen werden beim Start eager gewärmt, damit die ersten Aktionen nach Boot ohne Kaltstart-Lag reagieren und Alarmierungen sofort durchgehen.ShadowShadow

  • Direkt nach Neustart feuert dein erster Einsatz ohne den typischen ersten schweren Request.
  • Warmup reduziert das Risiko, dass die Anfangsminute einer Schicht träge wirkt.

🔴 BUGFIX

Der Auth-Flow speichert im JWT wieder `email` und `name`, weil der Admin-Check sonst nicht greifen konnte und du dadurch nach dem Login direkt in der richtigen Rolle weiterarbeiten kannst.ShadowShadow

  • Wenn du als Admin einsteigst, bleibt `user.email` in der Session erhalten statt auf `user.id` zu schrumpfen.
  • Nach dem Sign-in landest du wieder im Leitstellenbetrieb statt in einem `/maintenance`-Redirect-Loop.

Overpass nutzt jetzt Mirror-Rotation, sauberen User-Agent und Stale-Cache-Fallback, weil externe Geodatenquellen schwanken und du dadurch trotzdem weiter auf realen Straßen disponieren kannst.ShadowShadow

  • Wenn ein Overpass-Mirror ausfällt, wechselt der Request automatisch auf einen anderen Endpoint.
  • Ist live nichts erreichbar, werden zuletzt valide Cache-Daten genutzt statt die Karte leer zu lassen.

⚠️ ACHTUNG

In Production sind `TENANCY_V2_ENABLED=true` und ein starkes `INTERNAL_API_SECRET` jetzt Pflicht, weil der Boot sonst blockiert wird und du dadurch keine unsichere Instanz versehentlich online bringst.ShadowShadow

  • Beim Deploy startet der Prisma-Client absichtlich nicht, wenn die ENV-Migration fehlt.
  • Das verhindert, dass ein Save ohne aktive Tenancy in den Live-Betrieb rutscht.

🛡️ INFRASTRUKTUR

Die Multi-Tenant-Basis erzwingt Save-Scope unter `/:saveId/...`, damit Daten strikt getrennt bleiben und du parallele Spielstände ohne Cross-Save-Effekte disponieren kannst.ShadowShadow+Christian Jahnke

  • Wenn du drei Einsätze parallel in unterschiedlichen Saves jonglierst, bleibt jede Aktion im richtigen Datenraum.
  • `scopedQuery()`, RLS, `SaveContext` und CASL greifen als vierfache Isolation, falls ein Layer ausfällt.

🟠 VERBESSERT

Neue ESLint-Regeln stoppen fehlende `saveId`-Envelopes, unscoped Tenant-Queries und Raw-SQL außerhalb Admin-Pfaden schon im CI, damit Fehler nicht erst als Runtime-500 bei Spielern auftauchen.ShadowShadow

  • Wenn ein Hotfix unter Zeitdruck `saveId` vergisst, scheitert der Build direkt statt mitten im Einsatz.
  • Bei einem großen Datenumbau (z. B. 50M-Row-Backfill) bleibt Raw-SQL auf freigegebene Admin-Routen begrenzt.

Security-, E2E- und Lasttests wurden für Multi-Tenant-Lifecycle und RLS-Overhead ausgebaut, damit Release-Entscheidungen auf gemessener Last statt auf Annahmen basieren und du im Live-Betrieb weniger Überraschungen hast.ShadowShadow+Christian Jahnke

  • 48 Security-Tests über 4 Files plus 8 E2E-Lifecycle-Szenarien validieren die Save-Isolation End-to-End.
  • k6- und Micro-Benchmark-Runs liefern vor Deploy belastbare RLS-Overhead-Werte.

🔒 SICHERHEIT

Kritische Pfade wurden gehärtet, indem `einsatz/generate`-Kontexte getrennt und Timer-Routen auf `INTERNAL_API_SECRET` geprüft werden, damit interne Funktionen nicht extern missbraucht werden und deine Schicht stabil bleibt.ShadowShadow

  • Server-Timer reagieren nur noch auf legitimierte interne Aufrufe statt auf zufällige externe Treffer.
  • Privilege-Escalation-Fälle wie C1/C2 wurden vor Merge geschlossen, bevor sie in Live-Runden landen konnten.
#MayDay Sim Update#Leitstellen Simulation#BOS Funk Simulation#Multi-Tenant Save-Scoping#AAO Einsatz Generator#Dispatcher Multiplayer#Overpass Fallback#Admin JWT Fix
v0.24.0 — Säule 5.1: Save-Boundary | MAYDAY SIM | MAYDAY SIM