PolyTrader laeuft auf Linux: Build 0 Fehler, 476 Tests gruen, Publish und Start funktionieren - bei Build und Tests kein einziger Unterschied zu Windows. Bestaetigt: --headless braucht keine nativen GUI-Bibliotheken (BuildAvaloniaApp wird nie aufgerufen, Skia nie geladen), master.key bekommt unter Linux korrekt 0600, Zeitzone und Lizenz-Gate verhalten sich wie dokumentiert. Drei Befunde festgehalten: B-1 (Absturz ohne Datenbank) ist behoben, B-2 (zwei Datumsformate in Logdateinamen) und B-3 (--smoke-ui verlangt jetzt eine Datenbank; war vorher genauso, nur unsichtbar) sind offen und beschrieben. Nicht geprueft und warum: systemd, Oberflaeche, SIGTERM und der T2-Nachweis brauchen eine Testdatenbank und sudo. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
6.7 KiB
Befundbericht: Erster Linux-Lauf
Datum: 26.08.2026 · Prüfplan: PRUEFPLAN-Linux-Betrieb.md · Roadmap: A4a
Testsystem: Ubuntu 26.04 LTS, Kernel 7.0.0-30, x86_64, 31 GB RAM, 5 CPUs,
Zeitzone Europe/Berlin. .NET SDK 10.0.111 mit Runtime 10.0.11 bereits vorhanden.
Zugriff über SSH (WireGuard, Schlüssel-Authentifizierung).
Kernaussage: PolyTrader läuft auf Linux. Build, Tests, Publish und Start funktionieren. Ein echter Fehler wurde gefunden und behoben. Der Durchgang ist nicht vollständig — für systemd-Betrieb, Oberfläche und Zeitzonen-Nachweis fehlen eine Datenbank und
sudo.
1. Was funktioniert
| Prüfpunkt | Ergebnis |
|---|---|
| Build | dotnet build -c Release: 0 Fehler, 15 Warnungen — exakt dieselben wie unter Windows. Keine plattformbedingte Abweichung |
| Tests | 476 von 476 grün, 3 s Laufzeit — identisch zu Windows |
| Publish | linux-x64, framework-abhängig: 121 Dateien, 41 MB. Ausführbare Datei trägt bereits das Ausführungsrecht |
| Start | Die Anwendung startet mit --headless und durchläuft die komplette Startsequenz |
| Native Abhängigkeiten | Keine nötig. Die Vermutung aus dem Prüfplan ist bestätigt: --headless ruft BuildAvaloniaApp() nie auf, Skia und HarfBuzz werden nie geladen. libfontconfig1 & Co. mussten nicht installiert werden |
| Master-Key | Wird beim ersten Start erzeugt und mit Rechten 0600 abgelegt — FilePermissions arbeitet unter Linux korrekt. AES-256-GCM meldet sich als aktiv |
| Zeitzone | Europe/Berlin wird korrekt erkannt und gemeldet |
| Lizenz-Gate | Verhält sich exakt wie dokumentiert: Warnung, „eingeschränkter Modus", kein Programmabbruch |
| Logging | Logs/ wird angelegt und beschrieben |
Bemerkenswert: Zwischen Windows und Linux gibt es bei Build und Tests keinen einzigen Unterschied — weder in der Fehler- noch in der Warnungszahl. Die Portierungsarbeit hat gehalten.
2. Befunde
B-1 · Absturz statt Fehlermeldung ohne Datenbank · behoben
Beobachtet: Ohne konfigurierten Connection-String lief die Anwendung an und starb tief im DI-Aufbau:
Unhandled exception. System.ArgumentException: The string argument 'connectionString' cannot be empty.
at Microsoft.EntityFrameworkCore.Utilities.Check.NullButNotEmpty(...)
… rund 50 weitere Zeilen …
EXITCODE: 134 (SIGABRT)
Warum das mehr ist als Kosmetik: Für einen Serverbetrieb ist das doppelt schlecht. Der
Betreiber sieht nicht, was fehlt, und systemd startet den Dienst wegen Restart=on-failure
alle zehn Sekunden neu — im Journal stehen dann endlose Startversuche statt der Ursache. Und
genau dieser Zustand ist bei einer Erstinstallation der wahrscheinlichste: Software liegt da,
Zugangsdaten sind noch nicht gesetzt. Das betrifft direkt Schnitt D-5 (setup.json).
Behoben (Commit Verstaendlicher Abbruch statt Absturz…):
Program.Mainprüft die Verbindung, bevor der Host gebaut wird, und nennt Schlüssel, Datei, Pfad und ein Beispiel — dazu den Hinweis, dass das Schema perdotnet ef database updateentsteht, weil die Anwendung nicht selbst migriert.- Rückgabewert 78 (
EX_CONFIGaus den BSD-sysexits) statt eines Absturzes. deploy/polytrader.servicebekamRestartPreventExitStatus=78— ein Konfigurationsfehler repariert sich durch Neustarts nicht, er wird dadurch nur unsichtbar.AddCorePersistencewirft als zweite Verteidigungslinie eineInvalidOperationExceptionmit derselben Aussage.
Gegengeprüft auf der VM: Verständliche Meldung, Exitcode 78, kein Stacktrace.
B-2 · Zwei verschiedene Datumsformate in Logdateinamen · offen, klein
Im selben Lauf entstanden nebeneinander:
2026-08-26.jsonl ← ISO, yyyy-MM-dd
26-08-2026-Info.log ← dd-MM-yyyy
26-08-2026-Warning.log
Zwei Logger-Pfade mit unterschiedlicher Namenskonvention. Praktische Folgen: Eine
Logrotate-Regel braucht zwei Muster, und beim Sortieren im Dateimanager landen die .log-Dateien
in willkürlicher Reihenfolge, weil der Tag vorn steht. Kein Fehler, aber ein Stolperstein im
Betrieb — sinnvollerweise mit T2 (TerminalLogger-Umbau) zusammen zu erledigen.
B-3 · --smoke-ui verlangt jetzt eine Datenbank · offen, entscheidungsbedürftig
Die neue Prüfung aus B-1 läuft vor dem Host-Aufbau und trifft damit auch die
Konstruktionsprüfung --smoke-ui. Die ist als CI-Werkzeug gedacht, und ein Build-Server hat
typischerweise keine Datenbank.
Wichtig: Das ist keine Verschlechterung. Vorher scheiterte --smoke-ui ohne Datenbank
genauso — nur mit dem Stacktrace aus B-1 statt mit einer Meldung. Der Befund war vorher bloß
unsichtbar.
Sauber lösen ließe sich das, indem --smoke-ui die Persistenzschicht überspringt oder gegen
EF-InMemory baut (wie die Tests). Das ist ein eigener Schnitt und hängt daran, ob die CI diesen
Modus überhaupt nutzen soll — deshalb hier nur vermerkt, nicht gebaut.
3. Nicht geprüft — und warum
| Prüfpunkt | Fehlt |
|---|---|
| Betrieb mit Datenbank, Migrationen | Auf der VM läuft keine MySQL; der Datenbankhost ist nicht bekannt |
systemd-Dienst, WorkingDirectory-Falle (D-11) |
Braucht sudo; Passwörter gebe ich nicht ein |
SIGTERM-Shutdown, Restart=on-failure |
Setzt den laufenden Dienst voraus |
| Zeitzonen-Nachweis (T2) | Die VM steht auf Europe/Berlin; der Effekt zeigt sich erst unter UTC. Umstellen braucht sudo |
| Logrotate | Braucht sudo |
| Oberfläche unter Linux | Braucht eine Datenbank (siehe B-3) — die VM hat aber einen Desktop, der Test ist also möglich |
Zum Weitermachen wird gebraucht:
- Eine Testdatenbank — entweder Adresse und Zugang zu einer bestehenden MySQL, oder
MariaDB lokal auf der VM installieren (
sudo). Nicht die Produktivdatenbank: DerMarketSyncServiceschreibt als Hintergrunddienst hinein. - Für die
sudo-Schritte: Entweder Richard führt sie aus, oder er richtet für die Dauer des Tests passwortlosessudofür sein Konto ein.
4. Nebenbefunde
- Rider-Konfiguration im Repo: Mit einem
git add -Awaren vier.idea/-Dateien in einen Commit gerutscht. Sie blockierten dengit pullauf der VM, wo Rider dieselben Dateien lokal anlegt. Entfernt,.idea/steht jetzt in.gitignore. - Verbindungs-Multiplexing (
ControlMaster) funktioniert nicht — Windows-OpenSSH unterstützt es nicht. Aus der SSH-Konfiguration entfernt; stattdessen werden mehrere Prüfschritte pro Aufruf gebündelt. - Speicher ist reichlich vorhanden (31 GB, davon 25 GB frei). Die Vermutung, der Claude-Desktop-Absturz auf der VM könnte an Speichermangel liegen, ist damit widerlegt.