Native Windows-Auslieferung statt Container
Docker faellt weg. Das Projekt hat keine npm-Abhaengigkeiten und Node fuehrt TypeScript direkt aus - der Container schrieb nur noch drei Programme fest, und dafuer braucht es keine Virtualisierung, sondern einen Ordner. Der Anlass war, dass ADR-0004 zwar `docker compose pull` versprach, es aber nie ein veroeffentlichtes Image gab. Wer installieren wollte, musste whisper.cpp aus dem Quelltext uebersetzen. Plattformschicht (packages/core/src/platform.ts): - Programme werden neben der Anwendung gesucht, nicht im PATH - Daten unter %LOCALAPPDATA%, damit Installation und Update ohne Administratorrechte auskommen - Schriften mitgeliefert: ohne fontsdir setzt libass wortlos eine Ersatzschrift ein - gemessen 720 statt 826 Pixel Zeilenbreite Windows-Eigenheiten, an echtem ffmpeg 8.1 durchprobiert: - Pfade im Filtergraphen brauchen alle drei Schritte (Vorwaertsschraegstriche, escapter Doppelpunkt, Anfuehrungszeichen); je zwei davon reichen nicht - `nice` gibt es nicht, ersetzt durch os.setPriority Auslieferung: - scripts/build-package.ts baut das Paket, laeuft auch unter Linux - install.ps1 ohne Administratorrechte, Autostart ueber den Aufgabenplaner - update legt neue Fassungen bereit; eingespielt wird beim naechsten Start, nie mitten im Stream - ZIP lesen und schreiben ohne Abhaengigkeiten (packages/core/src/zip.ts) Kein `irm ... | iex`-Einzeiler: git.zeasy.dev antwortete instanzweit mit einer Umleitung auf /user/login, und `iex` fuehrte die Anmeldeseite als PowerShell aus. Der Updater verfolgt Umleitungen jetzt nicht und hat keine erfundene Vorgabeadresse mehr. Ausserdem: backup.ps1 war an zwei Stellen dokumentiert, aber nie geschrieben. ADR-0007 ersetzt ADR-0004. 84 Tests, Typpruefung sauber. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01AhVSfMFdWnXKCv5JfLnArZ
This commit is contained in:
1 parent
71dd660d01
commit
5f6301268a
41 files changed
+2254
-312
No files matched your search
@@ -0,0 +1,56 @@
|
||||
# Sichert die Datenbank.
|
||||
#
|
||||
# `VACUUM INTO` und nicht kopieren: die Datenbank laeuft im WAL-Modus und wird
|
||||
# waehrend des Streams beschrieben. Eine im Schreibvorgang kopierte Datei ist
|
||||
# unbrauchbar - VACUUM INTO schreibt dagegen einen in sich stimmigen Stand,
|
||||
# ohne den laufenden Betrieb anzuhalten.
|
||||
#
|
||||
# Die Sicherung enthaelt Chatverlaeufe und damit personenbezogene Daten. Sie
|
||||
# gehoert nicht ins Repo und nicht in eine Cloud ohne Absprache.
|
||||
|
||||
[CmdletBinding()]
|
||||
param(
|
||||
[string]$DatenOrdner = (Join-Path $env:LOCALAPPDATA 'abdulive'),
|
||||
[string]$Ziel = (Join-Path $env:LOCALAPPDATA 'abdulive\backup'),
|
||||
[int]$Generationen = 30
|
||||
)
|
||||
|
||||
$ErrorActionPreference = 'Stop'
|
||||
|
||||
$db = Join-Path $DatenOrdner 'db\abdulive.db'
|
||||
if (-not (Test-Path $db)) { throw "Keine Datenbank unter $db" }
|
||||
|
||||
$node = Join-Path $env:LOCALAPPDATA 'Programs\abdulive\node.exe'
|
||||
if (-not (Test-Path $node)) { $node = (Get-Command node -ErrorAction Stop).Source }
|
||||
|
||||
New-Item -ItemType Directory -Force -Path $Ziel | Out-Null
|
||||
$stand = Get-Date -Format 'yyyy-MM-dd_HHmm'
|
||||
$datei = Join-Path $Ziel "abdulive-$stand.db"
|
||||
|
||||
# node:sqlite kann VACUUM INTO direkt - dafuer braucht es kein sqlite3.exe.
|
||||
$skript = @'
|
||||
const { DatabaseSync } = require('node:sqlite');
|
||||
const [quelle, ziel] = process.argv.slice(2);
|
||||
const db = new DatabaseSync(quelle, { readOnly: true });
|
||||
db.exec(`VACUUM INTO '${ziel.replace(/'/g, "''")}'`);
|
||||
db.close();
|
||||
'@
|
||||
$tmp = Join-Path $env:TEMP "abdulive-backup-$PID.cjs"
|
||||
Set-Content -Path $tmp -Value $skript -Encoding utf8
|
||||
try {
|
||||
& $node $tmp $db $datei
|
||||
if ($LASTEXITCODE -ne 0) { throw "VACUUM INTO fehlgeschlagen (Code $LASTEXITCODE)" }
|
||||
} finally {
|
||||
Remove-Item $tmp -ErrorAction SilentlyContinue
|
||||
}
|
||||
|
||||
$mb = [math]::Round((Get-Item $datei).Length / 1MB, 1)
|
||||
Write-Host "Gesichert: $datei ($mb MB)"
|
||||
|
||||
# Aeltere Generationen abraeumen
|
||||
$alt = Get-ChildItem $Ziel -Filter 'abdulive-*.db' |
|
||||
Sort-Object LastWriteTime -Descending | Select-Object -Skip $Generationen
|
||||
foreach ($f in $alt) {
|
||||
Remove-Item $f.FullName
|
||||
Write-Host " entfernt: $($f.Name)"
|
||||
}
|
||||
Reference in new issue
Block a user