Deploymentcenter-Integration (Schritte 0-8 des Konzepts)
Bindet Lizenz, Watchdog, Fehler-Stream, UpdateService und Erstinstallation an
das Deploymentcenter 2.5.1 an. Einbauort ist IBKRTrader.Hosting - den Host
teilen sich Shell und Daemon.
Projekt-Befunde aus dem Konzept vorab bereinigt:
P1 Echte DB-Zugangsdaten als Vorgabewerte in AppSettings -> Platzhalter.
Das alte Passwort steht weiterhin in der Git-Historie und ist als
kompromittiert zu behandeln (Rotation ist Nutzer-Aktion).
P2 AppPaths fiel unter Windows auf /etc/ibkrtrader zurueck, was .NET zu
C:\etc\ibkrtrader aufloest. Jetzt %ProgramData%\IBKRTrader.
P3 Globale Ausnahmebehandler (AppDomain / TaskScheduler) - vorher gab es
keinen Logeintrag, wenn der Prozess unbehandelt wegbrach.
P4 Version einmal zentral in Directory.Build.props statt zweimal hartkodiert.
Bewusste Abweichungen vom DC-Leitfaden, beide fuer ein handelndes System:
- Lizenz-Urteil fuehrt zum Sperrbetrieb (TradingEnabled=false) statt zu
Environment.Exit(1). Keine neuen Einstiege, aber Risiko-, Exit- und
Buchhaltungslogik laufen weiter.
- exitCurrentApp bleibt immer false; der Aufrufer beendet geordnet.
Das SDK haengt als Cross-Repo-ProjectReference am Schwester-Repo
Deploymentcenter (Interim, siehe Konzept 2.2). Damit ist P5 offen: die
Gitea-CI checkt das Schwester-Repo nicht aus und wird rot, bis der Bezug auf
ein NuGet-Paket umgestellt ist.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -11,7 +11,7 @@ public class DatabaseSettings
|
||||
[Category("Database")]
|
||||
[DisplayName("Host")]
|
||||
[Description("MySQL-Serveradresse (Hostname oder IP)")]
|
||||
public string Host { get; set; } = "larx.your-database.de";
|
||||
public string Host { get; set; } = "your-db-host";
|
||||
|
||||
[Category("Database")]
|
||||
[DisplayName("Port")]
|
||||
@@ -21,18 +21,18 @@ public class DatabaseSettings
|
||||
[Category("Database")]
|
||||
[DisplayName("Database")]
|
||||
[Description("Name der MySQL-Datenbank")]
|
||||
public string Database { get; set; } = "bergisnu_db0";
|
||||
public string Database { get; set; } = "your-db-name";
|
||||
|
||||
[Category("Database")]
|
||||
[DisplayName("User")]
|
||||
[Description("MySQL-Benutzername")]
|
||||
public string User { get; set; } = "bergisnu_0";
|
||||
public string User { get; set; } = "your-db-user";
|
||||
|
||||
[Category("Database")]
|
||||
[DisplayName("Password")]
|
||||
[Description("MySQL-Passwort")]
|
||||
[PasswordPropertyText(true)]
|
||||
public string Password { get; set; } = "o5/A49+f}:Da";
|
||||
public string Password { get; set; } = "CHANGE_ME";
|
||||
|
||||
public string BuildConnectionString() =>
|
||||
$"Server={Host};Port={Port};Database={Database};" +
|
||||
@@ -299,6 +299,61 @@ public class SupervisorSettings
|
||||
public override string ToString() => Model;
|
||||
}
|
||||
|
||||
// ─── Deploymentcenter ────────────────────────────────────────────────────────
|
||||
|
||||
[TypeConverter(typeof(ExpandableObjectConverter))]
|
||||
public class DeploymentcenterSettings
|
||||
{
|
||||
[Category("Deploymentcenter")]
|
||||
[DisplayName("API Token")]
|
||||
[Description("Authorization: Bearer <Token>. Ohne Token: keine Heartbeats, keine Fehlermeldungen.")]
|
||||
[PasswordPropertyText(true)]
|
||||
public string ApiToken { get; set; } = "";
|
||||
|
||||
[Category("Deploymentcenter")]
|
||||
[DisplayName("Heartbeat aktiv")]
|
||||
[Description("Dead-Man's-Switch an/aus")]
|
||||
public bool HeartbeatEnabled { get; set; } = true;
|
||||
|
||||
[Category("Deploymentcenter")]
|
||||
[DisplayName("Monitor Source")]
|
||||
[Description("Monitor-Name im Dashboard. Leer = Rechnername (Auto-Registrierung beim ersten Ping)")]
|
||||
public string MonitorSource { get; set; } = "";
|
||||
|
||||
[Category("Deploymentcenter")]
|
||||
[DisplayName("Monitor Instance")]
|
||||
[Description("Für mehrere Instanzen desselben Dienstes (z. B. EU/US)")]
|
||||
public string MonitorInstance { get; set; } = "default";
|
||||
|
||||
[Category("Deploymentcenter")]
|
||||
[DisplayName("Heartbeat-Intervall (Sekunden)")]
|
||||
[Description("warning nach 2×, down nach 4× dieses Intervalls")]
|
||||
public int HeartbeatIntervalSeconds { get; set; } = 60;
|
||||
|
||||
[Category("Deploymentcenter")]
|
||||
[DisplayName("Fehler melden")]
|
||||
[Description("Error/Fatal an den Fehler-Stream (/api/errors/v1/report)")]
|
||||
public bool ReportErrors { get; set; } = true;
|
||||
|
||||
[Category("Deploymentcenter")]
|
||||
[DisplayName("Update-Prüfung beim Start")]
|
||||
[Description("Prüft nur, installiert nichts von selbst")]
|
||||
public bool CheckUpdatesOnStart { get; set; } = true;
|
||||
|
||||
[Category("Deploymentcenter")]
|
||||
[DisplayName("Update-Kanal")]
|
||||
[Description("prod, beta oder dev")]
|
||||
public string UpdateChannel { get; set; } = "prod";
|
||||
|
||||
[Category("Deploymentcenter")]
|
||||
[DisplayName("Lizenzschlüssel")]
|
||||
[Description("Nur Rückfall, falls noch kein Schlüssel im verschlüsselten Cache liegt")]
|
||||
[PasswordPropertyText(true)]
|
||||
public string LicenseKey { get; set; } = "";
|
||||
|
||||
public override string ToString() => HeartbeatEnabled ? "Aktiv" : "Deaktiviert";
|
||||
}
|
||||
|
||||
// ─── Root ────────────────────────────────────────────────────────────────────
|
||||
|
||||
public class AppSettings
|
||||
@@ -347,4 +402,9 @@ public class AppSettings
|
||||
[DisplayName("Supervisor")]
|
||||
[Description("KI-Analyse/Forensik (OpenRouter, read-only)")]
|
||||
public SupervisorSettings Supervisor { get; set; } = new();
|
||||
|
||||
[Category("Deploymentcenter")]
|
||||
[DisplayName("Deploymentcenter")]
|
||||
[Description("Lizenz, Watchdog, UpdateService, Fehler-Stream (https://dc.mhdf.de)")]
|
||||
public DeploymentcenterSettings Deploymentcenter { get; set; } = new();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user