feat(installer): der Windows-Installer holt die Freigabe jetzt selbst von Rippy

DER BLOCKER aus dem SAVEPOINT v3.16 ist zu. Beide Installer (Kommandozeile und
GUI) fragen GET /worker-setup/pfad-map, pruefen mit Test-Path, ob DIESER PC die
Freigabe wirklich erreicht, und schreiben `set RIPPY_PATH_MAP=...` in
start-tray.bat und start-worker.bat.

Der Commander muss dafuer nichts ueber Container-Pfade wissen - das Feld bleibt
leer, der Installer holt den Wert. Von Hand geht es trotzdem (Knopf "Von Rippy
holen" bzw. -PfadMap), falls dieser PC die Freigabe anders erreicht.

Ist nichts erreichbar, steht das als Klartext im Log samt dem haeufigsten Grund
(fehlende Zugangsdaten - Freigabe einmal im Explorer oeffnen). Die Installation
laeuft weiter: ein Worker, der sich meldet und ehrlich scheitert, ist besser als
einer, der nicht existiert. Ein LEERES RIPPY_PATH_MAP wird bewusst nicht
gesetzt - pfad_lokal() liest das als "kein Mapping", und die Fehlermeldung im
Worker unterscheidet genau diese beiden Faelle.

GUI: neues Feld samt Knopf, Fenster 560->648 px. Layout headless gerendert und
angesehen (nichts ueberlappt, Umlaute korrekt), beide Dateien mit echtem
PowerShell 5.1 auf Parser-Fehler geprueft, UTF-8-BOM erhalten. .exe neu gebaut.
install.ps1 hatte durch ein Werkzeug LF statt CRLF bekommen - zurueckgedreht.

remote-transcode-worker.yml richtiggestellt: Dort stand "mount -t nfs
<rippy-host>:/srv/rippy" - das geht NICHT, auf der Rippy-Maschine laeuft kein
NFS- und kein Samba-Server, sie ist selbst nur Client der NAS. Der Weg, der
funktioniert: dieselbe Freigabe einhaengen, die auch Rippy nutzt.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Hitonabi
2026-07-26 12:58:23 +02:00
parent 8b7bdfe798
commit aea26493db
4 changed files with 229 additions and 33 deletions
+137 -13
View File
@@ -47,7 +47,7 @@ $cPurple = [System.Drawing.Color]::FromArgb(126, 34, 206)
# --- Fenster ---------------------------------------------------------------
$form = New-Object System.Windows.Forms.Form
$form.Text = "Rippy Encoding-Worker - Installation"
$form.ClientSize = New-Object System.Drawing.Size(560, 560)
$form.ClientSize = New-Object System.Drawing.Size(560, 648)
$form.StartPosition = "CenterScreen"
$form.FormBorderStyle = "FixedDialog"
$form.MaximizeBox = $false
@@ -152,7 +152,7 @@ $form.Controls.Add($lblPfad)
$txtPfad = New-Object System.Windows.Forms.TextBox
$txtPfad.Location = New-Object System.Drawing.Point(24, 252)
$txtPfad.Size = New-Object System.Drawing.Size(390, 26)
$txtPfad.Size = New-Object System.Drawing.Size(374, 26)
$txtPfad.Text = $StandardZiel
$txtPfad.Font = New-Object System.Drawing.Font("Consolas", 9)
$txtPfad.BackColor = $cFeld
@@ -162,8 +162,8 @@ $form.Controls.Add($txtPfad)
$btnPfad = New-Object System.Windows.Forms.Button
$btnPfad.Text = "Ändern ..."
$btnPfad.Location = New-Object System.Drawing.Point(424, 251)
$btnPfad.Size = New-Object System.Drawing.Size(100, 28)
$btnPfad.Location = New-Object System.Drawing.Point(408, 251)
$btnPfad.Size = New-Object System.Drawing.Size(116, 28)
$btnPfad.FlatStyle = "Flat"
$btnPfad.BackColor = $cFeld
$btnPfad.ForeColor = $cText
@@ -180,10 +180,51 @@ $btnPfad.Add_Click({
}
})
# Netzwerk-Freigabe fuer die Rohdaten (RIPPY_PATH_MAP)
#
# DAS entscheidet, ob dieser Worker ueberhaupt etwas komprimieren kann
# (Befund 26.07.2026): Rippy schickt ihm Pfade wie /app/media/rippy/<job> -
# Pfade INNERHALB des Rippy-Containers. Ohne Uebersetzung auf eine Freigabe
# sieht dieser PC dort nichts, nimmt die Aufgabe an und lehnt sie 182 ms
# spaeter ab. Der Nutzer soll das nicht verstehen muessen: Rippy hat die
# Freigabe selbst eingehaengt und kennt sie, der Knopf holt sie.
$lblMap = New-Object System.Windows.Forms.Label
$lblMap.Text = "Netzwerk-Freigabe mit den Rohdaten (holt Rippy selbst):"
$lblMap.Location = New-Object System.Drawing.Point(24, 288)
$lblMap.Size = New-Object System.Drawing.Size(500, 18)
$lblMap.ForeColor = $cGedaempft
$form.Controls.Add($lblMap)
$txtMap = New-Object System.Windows.Forms.TextBox
$txtMap.Location = New-Object System.Drawing.Point(24, 308)
$txtMap.Size = New-Object System.Drawing.Size(374, 26)
$txtMap.Font = New-Object System.Drawing.Font("Consolas", 9)
$txtMap.BackColor = $cFeld
$txtMap.ForeColor = $cText
$txtMap.BorderStyle = "FixedSingle"
$form.Controls.Add($txtMap)
$btnMap = New-Object System.Windows.Forms.Button
$btnMap.Text = "Von Rippy holen"
$btnMap.Location = New-Object System.Drawing.Point(408, 307)
$btnMap.Size = New-Object System.Drawing.Size(116, 28)
$btnMap.FlatStyle = "Flat"
$btnMap.BackColor = $cFeld
$btnMap.ForeColor = $cText
$btnMap.FlatAppearance.BorderColor = $cGedaempft
$form.Controls.Add($btnMap)
$lblMapHilfe = New-Object System.Windows.Forms.Label
$lblMapHilfe.Text = "Leer lassen und installieren - der Installer holt und prüft den Wert selbst."
$lblMapHilfe.Location = New-Object System.Drawing.Point(24, 338)
$lblMapHilfe.Size = New-Object System.Drawing.Size(500, 18)
$lblMapHilfe.ForeColor = $cGedaempft
$form.Controls.Add($lblMapHilfe)
# Autostart
$chkAuto = New-Object System.Windows.Forms.CheckBox
$chkAuto.Text = "Beim Anmelden automatisch starten (Tray-Symbol)"
$chkAuto.Location = New-Object System.Drawing.Point(24, 290)
$chkAuto.Location = New-Object System.Drawing.Point(24, 364)
$chkAuto.Size = New-Object System.Drawing.Size(400, 22)
$chkAuto.Checked = $true
$chkAuto.ForeColor = $cText
@@ -191,8 +232,8 @@ $form.Controls.Add($chkAuto)
# Log-Bereich
$log = New-Object System.Windows.Forms.TextBox
$log.Location = New-Object System.Drawing.Point(24, 322)
$log.Size = New-Object System.Drawing.Size(500, 150)
$log.Location = New-Object System.Drawing.Point(24, 396)
$log.Size = New-Object System.Drawing.Size(500, 174)
$log.Multiline = $true
$log.ReadOnly = $true
$log.ScrollBars = "Vertical"
@@ -205,7 +246,7 @@ $form.Controls.Add($log)
# Knöpfe
$btnInstall = New-Object System.Windows.Forms.Button
$btnInstall.Text = "Installieren"
$btnInstall.Location = New-Object System.Drawing.Point(24, 486)
$btnInstall.Location = New-Object System.Drawing.Point(24, 584)
$btnInstall.Size = New-Object System.Drawing.Size(150, 40)
$btnInstall.BackColor = $cAmber
$btnInstall.ForeColor = $cBg
@@ -215,7 +256,7 @@ $form.Controls.Add($btnInstall)
$btnStart = New-Object System.Windows.Forms.Button
$btnStart.Text = "Worker starten"
$btnStart.Location = New-Object System.Drawing.Point(190, 486)
$btnStart.Location = New-Object System.Drawing.Point(190, 584)
$btnStart.Size = New-Object System.Drawing.Size(150, 40)
$btnStart.BackColor = $cEmerald
$btnStart.ForeColor = [System.Drawing.Color]::White
@@ -229,6 +270,46 @@ function Log($text) {
[System.Windows.Forms.Application]::DoEvents()
}
# --- RIPPY_PATH_MAP: holen und wirklich pruefen -----------------------------
# Rippy leitet den Wert aus seinen eigenen eingehaengten Freigaben ab
# (GET /worker-setup/pfad-map) - hier wird nichts geraten. Der Rueckgabewert
# ist der fertige Wert fuer die .bat-Dateien, oder "" wenn Rippy keine
# Freigabe hat (dann kann dieser Worker nichts komprimieren, und das muss
# im Log stehen statt still zu passieren).
function Hole-PfadMap($rippyHost) {
try {
$antwort = Invoke-RestMethod "http://$rippyHost/api/worker-setup/pfad-map" -TimeoutSec 15
} catch {
Log "HINWEIS: Rippy nach der Freigabe zu fragen schlug fehl ($($_.Exception.Message))."
return ""
}
if ($antwort.hinweis) { Log $antwort.hinweis }
if (-not $antwort.mapping) { return "" }
return [string]$antwort.mapping
}
# Erreicht DIESER PC die Freigaben wirklich? Ohne diese Probe merkt der Nutzer
# den Fehler erst, wenn ein Job Stunden spaeter scheitert.
function Pruefe-PfadMap($mapping) {
$alleDa = $true
foreach ($paar in ($mapping -split ";")) {
if ($paar -notmatch "=") { continue }
$ziel = ($paar -split "=", 2)[1]
if (Test-Path -LiteralPath $ziel -ErrorAction SilentlyContinue) {
Log " OK: $ziel ist von hier erreichbar."
} else {
$alleDa = $false
Log " NICHT erreichbar: $ziel"
}
}
if (-not $alleDa) {
Log " Meist fehlen nur die Zugangsdaten: die Freigabe einmal im Explorer"
Log " oeffnen und 'Anmeldedaten speichern' anhaken, dann erreicht der"
Log " Worker sie auch. Die Installation laeuft trotzdem durch."
}
return $alleDa
}
# --- Installations-Logik ---------------------------------------------------
function Do-Install {
$rHost = $txtHost.Text.Trim()
@@ -322,11 +403,40 @@ function Do-Install {
}
Log "HandBrake bereit."
# 5. Start-Skripte + Deinstaller erzeugen
$trayBat = "@echo off`r`ncd /d `"%~dp0`"`r`nset REDIS_URL=redis://${rHost}:6379/0`r`nset DATABASE_URL=postgresql://rippy:rippy@${rHost}:5432/rippy`r`nset API_URL=http://${rHost}:8000`r`nset WORKER_NAME=$wName`r`nset RIPPY_TRAY_HOST=$rHost`r`nset PATH=%~dp0;%PATH%`r`nstart `"`" venv\Scripts\pythonw.exe tray.py"
# 5. Netzwerk-Freigabe klaeren, BEVOR die Start-Skripte geschrieben werden.
# Ohne RIPPY_PATH_MAP kann dieser Worker grundsaetzlich nicht
# komprimieren - das war bis zum 26.07.2026 der stille Blocker.
$mapping = $txtMap.Text.Trim()
if ($mapping) {
Log "Freigabe (von Hand eingetragen): $mapping"
} else {
Log "Frage Rippy, ueber welche Freigabe die Rohdaten erreichbar sind ..."
$mapping = Hole-PfadMap $rHost
if ($mapping) {
$txtMap.Text = $mapping
Log "Freigabe von Rippy: $mapping"
}
}
if ($mapping) {
Log "Pruefe Erreichbarkeit ..."
[void](Pruefe-PfadMap $mapping)
} else {
Log "ACHTUNG: Ohne Freigabe kann dieser Worker NICHTS komprimieren."
Log " Der Worker wird trotzdem installiert und meldet sich in"
Log " Rippy - Jobs schlagen aber mit einer Klartext-Meldung fehl."
}
# 6. Start-Skripte + Deinstaller erzeugen
# RIPPY_PATH_MAP nur setzen, wenn es einen Wert gibt - eine leere
# Zuweisung in einer .bat ist harmlos, aber ein gesetztes leeres
# RIPPY_PATH_MAP liest pfad_lokal() als "kein Mapping", und die
# Fehlermeldung im Worker unterscheidet genau diese beiden Faelle.
$mapZeile = if ($mapping) { "set RIPPY_PATH_MAP=$mapping`r`n" } else { "" }
$trayBat = "@echo off`r`ncd /d `"%~dp0`"`r`nset REDIS_URL=redis://${rHost}:6379/0`r`nset DATABASE_URL=postgresql://rippy:rippy@${rHost}:5432/rippy`r`nset API_URL=http://${rHost}:8000`r`nset WORKER_NAME=$wName`r`nset RIPPY_TRAY_HOST=$rHost`r`n${mapZeile}set PATH=%~dp0;%PATH%`r`nstart `"`" venv\Scripts\pythonw.exe tray.py"
Set-Content -Path "start-tray.bat" -Value $trayBat -Encoding ASCII
$workBat = "@echo off`r`ncd /d `"%~dp0`"`r`nset REDIS_URL=redis://${rHost}:6379/0`r`nset DATABASE_URL=postgresql://rippy:rippy@${rHost}:5432/rippy`r`nset API_URL=http://${rHost}:8000`r`nset WORKER_NAME=$wName`r`nset PATH=%~dp0;%PATH%`r`nvenv\Scripts\celery.exe -A celery_app worker --loglevel=info -Q transcode --pool=solo -n ${wName}@%%h"
$workBat = "@echo off`r`ncd /d `"%~dp0`"`r`nset REDIS_URL=redis://${rHost}:6379/0`r`nset DATABASE_URL=postgresql://rippy:rippy@${rHost}:5432/rippy`r`nset API_URL=http://${rHost}:8000`r`nset WORKER_NAME=$wName`r`n${mapZeile}set PATH=%~dp0;%PATH%`r`nvenv\Scripts\celery.exe -A celery_app worker --loglevel=info -Q transcode --pool=solo -n ${wName}@%%h"
Set-Content -Path "start-worker.bat" -Value $workBat -Encoding ASCII
$uninstall = @"
@@ -349,7 +459,7 @@ Remove-Item -Recurse -Force `$PSScriptRoot
"@
Set-Content -Path "uninstall.ps1" -Value $uninstall -Encoding ASCII
# 6. Autostart über den Autostart-ORDNER, nicht über schtasks.
# 7. Autostart über den Autostart-ORDNER, nicht über schtasks.
#
# Befund 25.07.2026 (auf dem Commander-PC aufgetreten): schtasks /create
# mit /tn "RippyWorker" legt die Aufgabe im WURZELORDNER der
@@ -416,6 +526,20 @@ Remove-Item -Recurse -Force `$PSScriptRoot
}
}
$btnMap.Add_Click({
$rHost = $txtHost.Text.Trim()
if (-not $rHost) {
[System.Windows.Forms.MessageBox]::Show(
"Bitte zuerst oben die LAN-IP der Rippy-Maschine eintragen.", "Fehlt")
return
}
$m = Hole-PfadMap $rHost
if ($m) {
$txtMap.Text = $m
Log "Freigabe von Rippy: $m"
[void](Pruefe-PfadMap $m)
}
})
$btnInstall.Add_Click({ Do-Install })
$btnStart.Add_Click({
Start-Process -FilePath (Join-Path $InstallDir "start-tray.bat") -WindowStyle Hidden