diff --git a/scripts/README.md b/scripts/README.md new file mode 100644 index 0000000..028b023 --- /dev/null +++ b/scripts/README.md @@ -0,0 +1,32 @@ +# IBKRTrader – DB-Provisioning + +Die App legt das DB-Schema **nicht** zur Laufzeit an (EF-Migrationen werden extern angewendet). +Einmalig beim Aufsetzen einer DB: + +## 1. (Nur falls nötig) Alt-Tabellen entfernen +Wenn frühere Läufe bereits `core_*`/`ct_*`-Tabellen im alten (snake_case) Schema angelegt haben, +kollidieren sie mit dem EF-Schema. Dann einmalig ausführen: + +```bash +mysql -h -u -p < scripts/drop-app-tables.sql +``` + +> ⚠️ Löscht Daten in diesen Tabellen. Bei frischem Aufsetzen unkritisch. + +## 2. Migrationen anwenden +Liest den Connection-String aus `appsettings.Local.json` und wendet beide Contexts an: + +```bash +powershell -ExecutionPolicy Bypass -File scripts/provision-db.ps1 +``` + +Voraussetzung: `dotnet-ef` (`dotnet tool install --global dotnet-ef`). + +Angelegt werden: `core_position`, `core_trade_history`, `core_budget`, `core_worker_log`, +`core_settings`, `core_ibkr_instruments`, `core_ibkr_market_data`, `core_ibkr_external_identifiers`, +`ct_congressMember`, `ct_trade` sowie `__EFMigrationsHistory`. + +## Sicherheit +- **DB-Passwort rotieren** – das ursprüngliche liegt in der Git-Historie (Commit `ebeb035`). +- Optional Master-Key setzen (`IBKRTRADER_MASTER_KEY` oder Datei `master.key`) für die + at-rest-Verschlüsselung künftiger Credentials. diff --git a/scripts/drop-app-tables.sql b/scripts/drop-app-tables.sql new file mode 100644 index 0000000..d579132 --- /dev/null +++ b/scripts/drop-app-tables.sql @@ -0,0 +1,34 @@ +-- IBKRTrader – Alt-Tabellen entfernen, damit die EF-Migrationen sauber angewendet werden können. +-- +-- Hintergrund: Frühere Läufe legten die Tabellen per Dapper (snake_case-Spalten) an. Das EF-Schema +-- nutzt dieselben Tabellennamen, aber PascalCase-Spalten – deshalb müssen die alten Tabellen weg, +-- bevor `dotnet ef database update` sie neu (EF-konform) anlegt. +-- +-- WARNUNG: Löscht alle Daten in diesen Tabellen. Nur ausführen, wenn kein produktiver Datenbestand +-- drin ist (bei einem frisch aufgesetzten IBKRTrader ist das der Fall). +-- +-- Anwenden gegen die Ziel-DB (bergisnu_db0), z. B.: +-- mysql -h -u -p < scripts/drop-app-tables.sql + +SET FOREIGN_KEY_CHECKS = 0; + +-- Core +DROP TABLE IF EXISTS `core_position`; +DROP TABLE IF EXISTS `core_trade_history`; +DROP TABLE IF EXISTS `core_budget`; +DROP TABLE IF EXISTS `core_worker_log`; +DROP TABLE IF EXISTS `core_settings`; + +-- Core / IBKR-Marktdaten +DROP TABLE IF EXISTS `core_ibkr_market_data`; +DROP TABLE IF EXISTS `core_ibkr_external_identifiers`; +DROP TABLE IF EXISTS `core_ibkr_instruments`; + +-- Modul CongressTrading +DROP TABLE IF EXISTS `ct_trade`; +DROP TABLE IF EXISTS `ct_congressMember`; + +-- EF-Migrationshistorie (beide Contexts teilen sich diese Tabelle) zurücksetzen +DROP TABLE IF EXISTS `__EFMigrationsHistory`; + +SET FOREIGN_KEY_CHECKS = 1; diff --git a/scripts/provision-db.ps1 b/scripts/provision-db.ps1 new file mode 100644 index 0000000..ebbedd7 --- /dev/null +++ b/scripts/provision-db.ps1 @@ -0,0 +1,48 @@ +<# + IBKRTrader – DB-Provisioning. + + Wendet die EF-Core-Migrationen beider Contexts (Core + CongressTrading) auf die Ziel-DB an. + Der Connection-String wird aus appsettings.Local.json gelesen und als Umgebungsvariable + IBKRTRADER_MYSQL an die Design-Time-Factories weitergereicht. + + WICHTIG: Falls von frueheren Laeufen noch alte (snake_case) Tabellen in der DB liegen, vorher + einmalig scripts/drop-app-tables.sql ausfuehren – sonst schlaegt 'database update' fehl + (Table already exists). + + Aufruf (aus dem Projekt-Root): + powershell -ExecutionPolicy Bypass -File scripts/provision-db.ps1 +#> + +$ErrorActionPreference = 'Stop' +$root = Split-Path -Parent $PSScriptRoot + +# 1. Connection-String aus appsettings.Local.json lesen. +$localPath = Join-Path $root 'appsettings.Local.json' +if (-not (Test-Path $localPath)) { + Write-Error "appsettings.Local.json nicht gefunden ($localPath). Datei mit Database:MySqlConnectionString anlegen." + exit 1 +} +$conn = (Get-Content $localPath -Raw | ConvertFrom-Json).Database.MySqlConnectionString +if ([string]::IsNullOrWhiteSpace($conn)) { + Write-Error "Database:MySqlConnectionString in appsettings.Local.json ist leer." + exit 1 +} +$env:IBKRTRADER_MYSQL = $conn +Write-Host "Connection aus appsettings.Local.json geladen." -ForegroundColor Green + +# 2. dotnet-ef vorhanden? +try { dotnet ef --version | Out-Null } catch { + Write-Error "dotnet-ef fehlt. Installieren mit: dotnet tool install --global dotnet-ef" + exit 1 +} + +# 3. Migrationen anwenden – Core, dann Modul. +Write-Host "Wende CoreDbContext-Migrationen an..." -ForegroundColor Cyan +dotnet ef database update --project src/IBKRTrader.Core --startup-project src/IBKRTrader.Core --context CoreDbContext +if ($LASTEXITCODE -ne 0) { Write-Error "CoreDbContext-Migration fehlgeschlagen."; exit 1 } + +Write-Host "Wende CongressTradingDbContext-Migrationen an..." -ForegroundColor Cyan +dotnet ef database update --project src/IBKRTrader.Modules.CongressTrading --startup-project src/IBKRTrader.Modules.CongressTrading --context CongressTradingDbContext +if ($LASTEXITCODE -ne 0) { Write-Error "CongressTradingDbContext-Migration fehlgeschlagen."; exit 1 } + +Write-Host "DB-Provisioning abgeschlossen." -ForegroundColor Green