Spectra
Ein nativer Desktop-Client für das Spectra-Panel unter Windows und Linux, geschrieben in C#/.NET. Eine echte Binärdatei mit Systemzugriff, kein verpacktes Chromium. Dieselbe Ansicht wie im Web, aber mit nativer Leistung und Desktop-Integration.
Ein nativer Administrationsclient für das Spectra-Gameserver-Hosting unter Windows und Linux, gebaut in C#/.NET auf Avalonia. Dieselbe Ansicht wie das Web-Panel, aber als echtes Binary, das direkt in den Plattformkern und dessen riesige frozcore/frozmod-API eingebunden ist - mit Systemzugriff, nativer Geschwindigkeit und Logik, die mit dem Rest von Spectra geteilt und nicht ein zweites Mal neu geschrieben wird.
Einleitung
Spectra ist eine Marke für Gameserver-Hosting, für die wir das komplette Panel-Backend gebaut haben. Diese Fallstudie behandelt ein einzelnes, aber entscheidendes Teil dieses Puzzles: den nativen Desktop-Client für Administratoren. Es ist keine separate App, die neben dem Panel lebt - es ist eine weitere Hülle über demselben Kern, die mit demselben Backend spricht wie die Web-Version. Um zu verstehen, warum das eine Herausforderung war, muss man zuerst sehen, wie groß das System darunter ist.
Der Desktop-Client rendert keine hübschen Bildschirme über der Leere. Er steht auf einer vollständigen Plattform: Server-Provisioning, Leistungsverwaltung, Dateien, Datenbanken, Telemetrie, Abrechnung und Berechtigungen. Unsere Aufgabe war es, dem Administrator ein natives Fenster auf all das zu geben - ohne einen verpackten Browser und ohne Logik zu duplizieren, die ohnehin schon im Web-Panel lebte.
Ein Panel, in dem man den ganzen Tag sitzt
Ein Administrator von Gameservern schaut nicht einmal pro Woche ins Panel. Er hat es acht Stunden lang offen, neben der Konsole, dem Spiel-Client und dem Messenger. In diesem Modus ist ein weiterer Browser-Tab keine Bequemlichkeit, sondern ein fünftes Rad am Wagen: Er geht im Gedränge der Tabs verloren, hat kein eigenes Symbol in der Taskleiste, reagiert nicht auf Systemkürzel und sieht keine lokalen Dateien.
Wir wollten dieselbe Ansicht wie im Web geben, aber als App, die sich wie der Rest der Programme auf dem Desktop verhält. Eine harte Bedingung: kein verpacktes Chromium. Ein Client, der beim Start 200 MB Speicher hinzufügt, nur um genau dasselbe anzuzeigen, verfehlt sein Ziel, bevor er überhaupt fertig gestartet ist. Wenn der Administrator hier den größten Teil des Tages verbringen soll, muss die App leicht, sofort da und auf seinem System "zu Hause" sein und nicht ein weiteres Browserfenster, das ein Programm vortäuscht.
In Zahlen
| Metrik | Wert |
|---|---|
| Systeme aus einer Codebasis | Windows und Linux |
| Typischer Speicher-Fußabdruck | ~40 MB |
| Gemeinsamer Kern mit dem Web-Panel | einer |
| An die API angebundene Ansichten | Dutzende |
Was Spectra darunter wirklich ist
Das größte Missverständnis bei einem solchen Projekt ist der Gedanke, "es ist nur ein Panel". In Wirklichkeit ist das Panel eine dünne Schicht über einem Backend, das die schwere Arbeit erledigt: Es startet und stoppt Gameserver, weist Ressourcen zu, hält Datenbanken, streamt Logs und die Konsole live und überwacht Limits und Abrechnung. Dieses Backend ist die umfangreiche frozcore/frozmod-API - Dutzende von Endpunkten, Echtzeit-Ereignisse und ein Berechtigungsmodell, das entscheidet, wer was sieht und was er tun darf.
Der Desktop-Client muss mit genau derselben API sprechen wie das Web-Panel. Es gibt hier keine "vereinfachte Desktop-Version": Wenn der Administrator ein Speicherlimit eines Servers ändert oder eine Instanz neu startet, tut er das über denselben Vertrag, über den es auch das Web tut. Deshalb mussten wir, bevor auch nur ein einziger Bildschirm existierte, den Umfang dieser API verstehen und beherrschen - und das war der eigentliche Teil der Herausforderung, nicht das Aussehen des Fensters.
Die Konsole und der Log-Stream laufen live. Das ist keine Aktualisierung alle paar Sekunden, sondern ein kontinuierlicher Ereignisstrom vom Backend - der Desktop-Client abonniert ihn genauso wie das Web, sodass der Administrator die Ausgabe eines Servers in dem Moment sieht, in dem sie entsteht.
Ein Kern, zwei Hüllen
Die Domänenlogik - Autorisierung, das Servermodell, Leistungsbefehle, der Log-Stream, das Abbilden von Berechtigungen auf diese API - lebt in einer einzigen .NET-Bibliothek. Das Web-Panel und der Desktop-Client sind zwei Hüllen über diesem einen Kern, sodass eine Korrektur in einer Berechtigungsregel oder in der Behandlung eines Endpunkts an beiden Stellen gleichzeitig landet. Eine ganze Klasse von "im Web funktioniert es, auf dem Desktop kaputt"-Fehlern verschwindet einfach.
Avalonia zeichnet die Ansichtsschicht. Es ist kein Webview - die Steuerelemente rendern direkt über Skia, denselben Weg unter Windows und Linux, sodass die App auf beiden identisch aussieht. Nebenbei erhält sie echten Zugriff auf das Dateisystem, die Zwischenablage und Benachrichtigungen, den eine verpackte Seite nie hatte.
Stack
| Schicht | Wahl | Wozu so |
|---|---|---|
| Sprache und Runtime | C# / .NET | eine Sprache für Logik und UI, gute Werkzeuge |
| Ansichtsschicht | Avalonia (Skia) | natives Rendering, identisch unter Windows und Linux |
| Domänenkern | gemeinsame .NET-Bibliothek | dieselbe Logik und derselbe API-Client wie das Web-Panel |
| Netzwerkschicht | typisierter frozcore/frozmod-Client | ein Vertrag, Web und Desktop sprechen dasselbe |
| Distribution | self-contained publish | ein Binary, keine Runtime-Installation beim Kunden |
Integration mit einer riesigen API
Das war der schwerste Teil. Das Spectra-Backend stellt Dutzende von Operationen bereit: Server-Lebenszyklus, Konsole, Dateien, Datenbanken, Aufgabenpläne, Backups, Benutzer und Berechtigungen, Ressourcentelemetrie. Damit der Desktop-Client nicht zu einem Gewirr von Aufrufen wird, haben wir die gesamte API in einen einzigen typisierten Client im Kern gehüllt - mit einer Stelle für Autorisierung, Wiederholungen und Fehlerbehandlung.
jeder frozcore/frozmod-Endpunkt hinter einer einzigen Schnittstelle, mit Autorisierung und Wiederholungen an einer Stelle, sodass weder Web noch Desktop diese Logik wiederholt.
Konsole, Logs und Telemetrie als Ereignisabonnements, kein Polling in einer Schleife; derselbe Mechanismus wie im Web-Panel.
was ein Administrator sehen und tun kann, ergibt sich aus denselben Regeln wie im Web, berechnet im Kern und nicht "nach Augenmaß" in der UI.
API-Antworten landen direkt in nativen Avalonia-Steuerelementen, ohne DOM als Vermittler.
Die gesamte API in einen Client im Kern zu hüllen, hat sich doppelt ausgezahlt: eine Vertragsänderung auf der Backend-Seite ist eine einzige Korrektur in der Bibliothek, die Web und Desktop im selben Commit erhalten. Kein Versionsauseinanderdriften, kein "bei mir funktioniert es".
Leistung und Nativität
Da die Randbedingung "kein verpacktes Chromium" lautete, war Leistung kein Zusatz, sondern das Ziel. Avalonia zeichnet die Oberfläche direkt, ohne Browser-Engine im Inneren, sodass ein Binary mit dem vollständigen Panel einen Bruchteil dessen wiegt, was dieselbe Ansicht in Electron wiegen würde, und in einem Bruchteil einer Sekunde startet.
Speicher-Fußabdruck beim Start (orientierend, MB)
Hinzu kommt das, was ein Browser nie gegeben hat: echter Zugriff auf das Dateisystem (Serverdateien zeigen Sie direkt von der Festplatte an, ohne sie zuerst in einen Browser hochzuladen), Systemkürzel, native Benachrichtigungen und ein Symbol in der Taskleiste. Für jemanden, der den ganzen Tag im Panel sitzt, ist das keine Kosmetik, sondern eine tägliche Zeitersparnis.
Wie wir das alles zusammengefügt haben
Mit einem Kern, der den API-Client enthält, und einer Hülle auf Avalonia fügte sich das Ganze auf wiederholbare Weise zusammen. Entscheidend war, dass eine Quelle zwei eigenständige Binaries liefert, die auf beiden Systemen wirklich getestet wurden und nicht nur für beide kompilieren.
Autorisierung, das Servermodell, Befehle und der API-Client wurden von der Web-Ansicht abgetrennt und in eine separate Bibliothek verlagert, die nichts darüber weiß, wer sie zeichnet.
dasselbe Bildschirmlayout wie im Web, aber in nativen Steuerelementen, über gewöhnliche Aufrufe an den Kern angebunden, nicht über HTTP zu sich selbst.
publish auf win-x64 und linux-x64 aus derselben Quelle, jedes als eigenständiges Binary.
dasselbe wird real unter Windows und unter Linux ausgeführt, mit Anbindung an das echte Backend, nicht nur für beide kompilierend.
Was die Zusammenarbeit letztlich gebracht hat
Der Administrator erhält ein Programm, das in einem Bruchteil einer Sekunde startet, sich wie jede andere App an die Taskleiste hält und genau die Daten zeigt, die das Web-Panel zeigt - denn darunter ist es derselbe Code und dieselbe API. Systemkürzel funktionieren, Dateien auf der Festplatte lassen sich auswählen, ohne sie zuerst in einen Browser hochzuladen, Konsole und Logs laufen live, und das Fenster geht nicht im Dickicht der Tabs verloren. Statt einer "Seite in einem Fenster" erhält der Administrator ein Werkzeug, das sich wie ein Teil seines Systems anfühlt.
Auf Spectras Seite ist der Gewinn ebenso konkret und langfristig. Eine Logik und ein API-Client statt zweier von Hand in Einklang gehaltener bedeuten, dass die Entwicklung der Plattform sich nicht mit der Anzahl der Hüllen multipliziert. Eine neue Berechtigungsregel, ein neuer Endpunkt im Backend oder eine Änderung im Servermodell landet im selben Commit im Web und auf dem Desktop. Eine ganze Klasse von Synchronisationsfehlern verschwindet, und der Desktop-Client hört auf, ein separates Projekt zur Pflege zu sein.
Am wichtigsten ist jedoch, dass der Desktop keine "Light-Version" ist. Er spricht mit derselben vollständigen frozcore/frozmod-API wie das Web-Panel, sodass der Administrator nie in den Browser zurückkehren muss, um eine Funktion zu erhalten, die der App gefehlt hat - denn es fehlte keine. Das ist der Unterschied zwischen einer verpackten Seite und einem echten, nativen Plattform-Client: Letzterer wächst mit dem Backend, anstatt hinterherzuhinken.
Weitere Projekte
Weitere Projekte aus derselben Kategorie - sehen Sie, wie wir ähnliche Herausforderungen angehen.
Haben Sie ein ähnliches Projekt?
Melden Sie sich - ein Angebot ist kostenlos und kommt innerhalb einer Stunde.



