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:
ZeasyAlexandClaude Opus 5 committed 2026-09-09 17:39:26 +02:00
1 parent 71dd660d01
commit 5f6301268a
41 files changed
+2254 -312

No files matched your search

+67
View File
@@ -0,0 +1,67 @@
# Wird vom Aufgabenplaner bei der Anmeldung gestartet.
#
# Zwei Aufgaben, in dieser Reihenfolge:
# 1. Ein bereitgelegtes Update anwenden.
# 2. Die Anwendung starten.
#
# Warum getrennt: Windows sperrt laufende Programmdateien. Solange node.exe
# laeuft, laesst es sich nicht ersetzen. Der Updater legt das neue Paket
# deshalb nur unter `pending\` ab; ausgetauscht wird hier, bevor irgendetwas
# startet. So gibt es nie einen halb ausgetauschten Ordner. Siehe ADR-0007.
$ErrorActionPreference = 'Stop'
$root = Split-Path -Parent $MyInvocation.MyCommand.Path
$pending = Join-Path $root 'pending'
$log = Join-Path $env:LOCALAPPDATA 'abdulive\logs'
New-Item -ItemType Directory -Force -Path $log | Out-Null
function Write-Log($text) {
$line = "{0} {1}" -f (Get-Date -Format 'yyyy-MM-dd HH:mm:ss'), $text
Add-Content -Path (Join-Path $log 'starter.log') -Value $line -Encoding utf8
Write-Output $line
}
# ---------------------------------------------------------------- Update
if (Test-Path $pending) {
Write-Log 'Update liegt bereit - wende es an.'
try {
# Sicherheitshalber: laeuft noch etwas aus diesem Ordner?
Get-Process node -ErrorAction SilentlyContinue |
Where-Object { $_.Path -and $_.Path.StartsWith($root, 'OrdinalIgnoreCase') } |
ForEach-Object {
Write-Log " beende noch laufende node.exe (PID $($_.Id))"
Stop-Process -Id $_.Id -Force
}
Start-Sleep -Milliseconds 500
foreach ($item in @('app', 'bin', 'fonts', 'node.exe', 'version.json',
'abdulive.cmd', 'launcher.ps1', 'install.ps1', 'backup.ps1')) {
$new = Join-Path $pending $item
if (-not (Test-Path $new)) { continue }
$old = Join-Path $root $item
if (Test-Path $old) { Remove-Item -Recurse -Force $old }
Move-Item -Path $new -Destination $old
}
Remove-Item -Recurse -Force $pending
$v = (Get-Content (Join-Path $root 'version.json') -Raw | ConvertFrom-Json).version
Write-Log "Update angewendet, jetzt Version $v."
} catch {
# Ein misslungenes Update darf den Stream nicht kosten: der alte
# Stand ist noch da, also einfach damit weiterlaufen.
Write-Log "Update fehlgeschlagen, starte die vorhandene Version: $_"
}
}
# ---------------------------------------------------------------- Start
$node = Join-Path $root 'node.exe'
$main = Join-Path $root 'app\apps\cli\main.ts'
if (-not (Test-Path $node)) { Write-Log "node.exe fehlt in $root"; exit 1 }
Write-Log 'Starte den Daemon.'
& $node $main ingest 2>&1 | ForEach-Object {
Add-Content -Path (Join-Path $log 'abdulive.log') -Value $_ -Encoding utf8
}
Write-Log "Daemon beendet (Code $LASTEXITCODE)."
exit $LASTEXITCODE