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,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
|
||||
Reference in new issue
Block a user