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:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user