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:
@@ -1,17 +1,36 @@
|
|||||||
# Optionaler Remote-Transcode-Worker — für eine GPU-Maschine im Netz.
|
# Optionaler Remote-Transcode-Worker — für eine GPU-Maschine im Netz (Linux).
|
||||||
# (EXPERIMENTELL, 23.07.2026: VAAPI/NVENC-Presets folgen; aktuell nutzt der
|
# Für Windows gibt es den nativen Weg: RippyWorkerSetup.exe (Einstellungen → Worker).
|
||||||
# Worker dieselben HandBrake-CPU-Presets, bringt also v.a. stärkere CPUs.)
|
#
|
||||||
|
# ══ DAS ENTSCHEIDENDE: der Worker muss die Dateien SEHEN ══════════════════════
|
||||||
|
# Rippy schickt ihm Pfade wie /app/media/rippy/<job>/title_t00.mkv — Pfade
|
||||||
|
# INNERHALB des Rippy-Containers. Dieser Container muss dieselben Daten unter
|
||||||
|
# GENAU DEMSELBEN Pfad haben, sonst nimmt er die Aufgabe an und lehnt sie
|
||||||
|
# Millisekunden später ab („Keine Roh-MKVs gefunden" — genau so passiert am
|
||||||
|
# 26.07.2026, Job 95afdc89).
|
||||||
|
#
|
||||||
|
# Richtigstellung 26.07.2026: Hier stand vorher „mount -t nfs
|
||||||
|
# <rippy-host>:/srv/rippy /mnt/rippy". Das geht NICHT — auf der Rippy-Maschine
|
||||||
|
# läuft kein NFS- und kein Samba-Server, sie ist selbst nur Client der NAS.
|
||||||
|
# Der Weg, der funktioniert: DIESELBE Freigabe einhängen, die auch Rippy nutzt.
|
||||||
#
|
#
|
||||||
# Auf der GPU-Maschine:
|
# Auf der GPU-Maschine:
|
||||||
# 1. Dieses Repo klonen (oder nur dieses File + Zugriff aufs Registry-Image)
|
# 1. Dieses Repo klonen (oder nur dieses File + Zugriff aufs Registry-Image)
|
||||||
# 2. Rohdaten-Freigabe der Rippy-Maschine mounten, z. B.:
|
# 2. Die Freigabe einhängen, die Rippy als Arbeitsverzeichnis UND Ablage
|
||||||
# mount -t nfs <rippy-host>:/srv/rippy /mnt/rippy
|
# benutzt (Einstellungen → Ripping). Heißt sie in Rippy „rippy", liegt
|
||||||
# (die Rippy-VM muss /srv/rippy + das temp-Volume exportieren)
|
# sie dort unter /app/media/rippy — also z. B.:
|
||||||
# 3. RIPPY_HOST unten setzen und starten:
|
# mount -t cifs //NAS/rippy /mnt/rippy-freigabe -o guest,iocharset=utf8
|
||||||
# docker compose -f deploy/remote-transcode-worker.yml up -d --build
|
# 3. Unten RIPPY_HOST setzen, den Freigabe-Pfad im volumes-Block anpassen
|
||||||
|
# und starten:
|
||||||
|
# RIPPY_HOST=192.168.178.162 docker compose \
|
||||||
|
# -f deploy/remote-transcode-worker.yml up -d --build
|
||||||
|
#
|
||||||
|
# Passt der Pfad im Container nicht (weil die Freigabe woanders hängt), gibt es
|
||||||
|
# als Ausweg RIPPY_PATH_MAP — dieselbe Übersetzung, die der Windows-Worker
|
||||||
|
# nutzt, Format: /app/media/rippy=/mnt/anderer-pfad (Paare per „;").
|
||||||
|
# Den fertigen Wert nennt GET /worker-setup/pfad-map.
|
||||||
#
|
#
|
||||||
# Der Worker meldet seine Encoder-Fähigkeiten automatisch — er taucht danach
|
# Der Worker meldet seine Encoder-Fähigkeiten automatisch — er taucht danach
|
||||||
# unter Einstellungen → Verarbeitung auf. Er bedient NUR die transcode-Queue;
|
# unter Einstellungen → Worker auf. Er bedient NUR die transcode-Queue;
|
||||||
# gerippt wird weiterhin dort, wo das Laufwerk hängt.
|
# gerippt wird weiterhin dort, wo das Laufwerk hängt.
|
||||||
|
|
||||||
services:
|
services:
|
||||||
@@ -30,10 +49,15 @@ services:
|
|||||||
- WORKER_NAME=${WORKER_NAME:-transcode-worker}
|
- WORKER_NAME=${WORKER_NAME:-transcode-worker}
|
||||||
# Serien-Episoden-Matching fragt die Rippy-API nach Laufzeiten
|
# Serien-Episoden-Matching fragt die Rippy-API nach Laufzeiten
|
||||||
- API_URL=http://${RIPPY_HOST}:8000
|
- API_URL=http://${RIPPY_HOST}:8000
|
||||||
|
# Nur nötig, wenn die Freigabe hier NICHT unter demselben Pfad liegt wie
|
||||||
|
# in Rippy. Fertigen Wert holen: curl http://${RIPPY_HOST}/api/worker-setup/pfad-map
|
||||||
|
- RIPPY_PATH_MAP=${RIPPY_PATH_MAP:-}
|
||||||
volumes:
|
volumes:
|
||||||
# Freigabe der Rippy-Maschine (siehe Kopf-Kommentar)
|
# LINKS der Pfad auf DIESER Maschine, RECHTS der Pfad, den Rippy nennt.
|
||||||
- /mnt/rippy/media:/app/media
|
# Rechts muss stehen, was in Rippy als Speicherziel heißt: ein Ziel
|
||||||
- /mnt/rippy/temp:/app/temp
|
# namens „rippy" ist dort /app/media/rippy. Prüfen mit
|
||||||
|
# curl http://<rippy-host>/api/worker-setup/pfad-map
|
||||||
|
- /mnt/rippy-freigabe:/app/media/rippy
|
||||||
devices:
|
devices:
|
||||||
# GPU für Hardware-Encoding (AMD/Intel: /dev/dri; NVIDIA: nvidia-runtime)
|
# GPU für Hardware-Encoding (AMD/Intel: /dev/dri; NVIDIA: nvidia-runtime)
|
||||||
- /dev/dri:/dev/dri
|
- /dev/dri:/dev/dri
|
||||||
|
|||||||
Binary file not shown.
@@ -47,7 +47,7 @@ $cPurple = [System.Drawing.Color]::FromArgb(126, 34, 206)
|
|||||||
# --- Fenster ---------------------------------------------------------------
|
# --- Fenster ---------------------------------------------------------------
|
||||||
$form = New-Object System.Windows.Forms.Form
|
$form = New-Object System.Windows.Forms.Form
|
||||||
$form.Text = "Rippy Encoding-Worker - Installation"
|
$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.StartPosition = "CenterScreen"
|
||||||
$form.FormBorderStyle = "FixedDialog"
|
$form.FormBorderStyle = "FixedDialog"
|
||||||
$form.MaximizeBox = $false
|
$form.MaximizeBox = $false
|
||||||
@@ -152,7 +152,7 @@ $form.Controls.Add($lblPfad)
|
|||||||
|
|
||||||
$txtPfad = New-Object System.Windows.Forms.TextBox
|
$txtPfad = New-Object System.Windows.Forms.TextBox
|
||||||
$txtPfad.Location = New-Object System.Drawing.Point(24, 252)
|
$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.Text = $StandardZiel
|
||||||
$txtPfad.Font = New-Object System.Drawing.Font("Consolas", 9)
|
$txtPfad.Font = New-Object System.Drawing.Font("Consolas", 9)
|
||||||
$txtPfad.BackColor = $cFeld
|
$txtPfad.BackColor = $cFeld
|
||||||
@@ -162,8 +162,8 @@ $form.Controls.Add($txtPfad)
|
|||||||
|
|
||||||
$btnPfad = New-Object System.Windows.Forms.Button
|
$btnPfad = New-Object System.Windows.Forms.Button
|
||||||
$btnPfad.Text = "Ändern ..."
|
$btnPfad.Text = "Ändern ..."
|
||||||
$btnPfad.Location = New-Object System.Drawing.Point(424, 251)
|
$btnPfad.Location = New-Object System.Drawing.Point(408, 251)
|
||||||
$btnPfad.Size = New-Object System.Drawing.Size(100, 28)
|
$btnPfad.Size = New-Object System.Drawing.Size(116, 28)
|
||||||
$btnPfad.FlatStyle = "Flat"
|
$btnPfad.FlatStyle = "Flat"
|
||||||
$btnPfad.BackColor = $cFeld
|
$btnPfad.BackColor = $cFeld
|
||||||
$btnPfad.ForeColor = $cText
|
$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
|
# Autostart
|
||||||
$chkAuto = New-Object System.Windows.Forms.CheckBox
|
$chkAuto = New-Object System.Windows.Forms.CheckBox
|
||||||
$chkAuto.Text = "Beim Anmelden automatisch starten (Tray-Symbol)"
|
$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.Size = New-Object System.Drawing.Size(400, 22)
|
||||||
$chkAuto.Checked = $true
|
$chkAuto.Checked = $true
|
||||||
$chkAuto.ForeColor = $cText
|
$chkAuto.ForeColor = $cText
|
||||||
@@ -191,8 +232,8 @@ $form.Controls.Add($chkAuto)
|
|||||||
|
|
||||||
# Log-Bereich
|
# Log-Bereich
|
||||||
$log = New-Object System.Windows.Forms.TextBox
|
$log = New-Object System.Windows.Forms.TextBox
|
||||||
$log.Location = New-Object System.Drawing.Point(24, 322)
|
$log.Location = New-Object System.Drawing.Point(24, 396)
|
||||||
$log.Size = New-Object System.Drawing.Size(500, 150)
|
$log.Size = New-Object System.Drawing.Size(500, 174)
|
||||||
$log.Multiline = $true
|
$log.Multiline = $true
|
||||||
$log.ReadOnly = $true
|
$log.ReadOnly = $true
|
||||||
$log.ScrollBars = "Vertical"
|
$log.ScrollBars = "Vertical"
|
||||||
@@ -205,7 +246,7 @@ $form.Controls.Add($log)
|
|||||||
# Knöpfe
|
# Knöpfe
|
||||||
$btnInstall = New-Object System.Windows.Forms.Button
|
$btnInstall = New-Object System.Windows.Forms.Button
|
||||||
$btnInstall.Text = "Installieren"
|
$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.Size = New-Object System.Drawing.Size(150, 40)
|
||||||
$btnInstall.BackColor = $cAmber
|
$btnInstall.BackColor = $cAmber
|
||||||
$btnInstall.ForeColor = $cBg
|
$btnInstall.ForeColor = $cBg
|
||||||
@@ -215,7 +256,7 @@ $form.Controls.Add($btnInstall)
|
|||||||
|
|
||||||
$btnStart = New-Object System.Windows.Forms.Button
|
$btnStart = New-Object System.Windows.Forms.Button
|
||||||
$btnStart.Text = "Worker starten"
|
$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.Size = New-Object System.Drawing.Size(150, 40)
|
||||||
$btnStart.BackColor = $cEmerald
|
$btnStart.BackColor = $cEmerald
|
||||||
$btnStart.ForeColor = [System.Drawing.Color]::White
|
$btnStart.ForeColor = [System.Drawing.Color]::White
|
||||||
@@ -229,6 +270,46 @@ function Log($text) {
|
|||||||
[System.Windows.Forms.Application]::DoEvents()
|
[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 ---------------------------------------------------
|
# --- Installations-Logik ---------------------------------------------------
|
||||||
function Do-Install {
|
function Do-Install {
|
||||||
$rHost = $txtHost.Text.Trim()
|
$rHost = $txtHost.Text.Trim()
|
||||||
@@ -322,11 +403,40 @@ function Do-Install {
|
|||||||
}
|
}
|
||||||
Log "HandBrake bereit."
|
Log "HandBrake bereit."
|
||||||
|
|
||||||
# 5. Start-Skripte + Deinstaller erzeugen
|
# 5. Netzwerk-Freigabe klaeren, BEVOR die Start-Skripte geschrieben werden.
|
||||||
$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"
|
# 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
|
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
|
Set-Content -Path "start-worker.bat" -Value $workBat -Encoding ASCII
|
||||||
|
|
||||||
$uninstall = @"
|
$uninstall = @"
|
||||||
@@ -349,7 +459,7 @@ Remove-Item -Recurse -Force `$PSScriptRoot
|
|||||||
"@
|
"@
|
||||||
Set-Content -Path "uninstall.ps1" -Value $uninstall -Encoding ASCII
|
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
|
# Befund 25.07.2026 (auf dem Commander-PC aufgetreten): schtasks /create
|
||||||
# mit /tn "RippyWorker" legt die Aufgabe im WURZELORDNER der
|
# 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 })
|
$btnInstall.Add_Click({ Do-Install })
|
||||||
$btnStart.Add_Click({
|
$btnStart.Add_Click({
|
||||||
Start-Process -FilePath (Join-Path $InstallDir "start-tray.bat") -WindowStyle Hidden
|
Start-Process -FilePath (Join-Path $InstallDir "start-tray.bat") -WindowStyle Hidden
|
||||||
|
|||||||
@@ -5,7 +5,9 @@
|
|||||||
# 2. Lädt den Worker-Code direkt von deiner Rippy-Instanz (/api/worker-setup/paket)
|
# 2. Lädt den Worker-Code direkt von deiner Rippy-Instanz (/api/worker-setup/paket)
|
||||||
# 3. Lädt HandBrakeCLI (gepinnte Version, offizielles GitHub-Release),
|
# 3. Lädt HandBrakeCLI (gepinnte Version, offizielles GitHub-Release),
|
||||||
# falls nicht schon im PATH oder im Ordner vorhanden
|
# falls nicht schon im PATH oder im Ordner vorhanden
|
||||||
# 4. Erzeugt start-worker.bat - Doppelklick startet den Worker
|
# 4. Fragt Rippy, über welche Netzwerk-Freigabe die Rohdaten erreichbar sind,
|
||||||
|
# und prüft, ob DIESER PC sie wirklich sieht (RIPPY_PATH_MAP)
|
||||||
|
# 5. Erzeugt start-worker.bat - Doppelklick startet den Worker
|
||||||
#
|
#
|
||||||
# Der Worker bedient NUR die Kompressions-Queue (transcode) - gerippt wird
|
# Der Worker bedient NUR die Kompressions-Queue (transcode) - gerippt wird
|
||||||
# weiterhin auf der Rippy-Hauptmaschine (dort hängt das Laufwerk).
|
# weiterhin auf der Rippy-Hauptmaschine (dort hängt das Laufwerk).
|
||||||
@@ -13,12 +15,18 @@
|
|||||||
# Aufruf (PowerShell):
|
# Aufruf (PowerShell):
|
||||||
# .\install.ps1 -RippyHost 192.168.178.162 [-WorkerName mein-pc] [-Autostart]
|
# .\install.ps1 -RippyHost 192.168.178.162 [-WorkerName mein-pc] [-Autostart]
|
||||||
#
|
#
|
||||||
# -Autostart registriert eine Aufgabe "RippyWorker" (Start bei Anmeldung).
|
# -Autostart legt eine Verknüpfung im Autostart-Ordner an (Start bei Anmeldung).
|
||||||
|
|
||||||
param(
|
param(
|
||||||
[Parameter(Mandatory = $true)] [string]$RippyHost,
|
[Parameter(Mandatory = $true)] [string]$RippyHost,
|
||||||
[string]$WorkerName = $env:COMPUTERNAME.ToLower(),
|
[string]$WorkerName = $env:COMPUTERNAME.ToLower(),
|
||||||
[switch]$Autostart,
|
[switch]$Autostart,
|
||||||
|
# Übersetzung der Rippy-Container-Pfade auf Freigaben, die DIESER PC sieht.
|
||||||
|
# Leer lassen: dann holt der Installer den Wert von Rippy selbst
|
||||||
|
# (GET /worker-setup/pfad-map, abgeleitet aus dessen eigenen Mounts).
|
||||||
|
# Von Hand nur, wenn dieser PC die Freigabe anders erreicht, z. B.
|
||||||
|
# -PfadMap "/app/media/rippy=Z:\"
|
||||||
|
[string]$PfadMap = "",
|
||||||
# Zielverzeichnis. Standard ist "Programme", wie bei jedem anderen Programm
|
# Zielverzeichnis. Standard ist "Programme", wie bei jedem anderen Programm
|
||||||
# (Commander-Wunsch 25.07.2026). Dorthin schreiben braucht Adminrechte -
|
# (Commander-Wunsch 25.07.2026). Dorthin schreiben braucht Adminrechte -
|
||||||
# PowerShell also "Als Administrator" starten, oder hier einen Ordner im
|
# PowerShell also "Als Administrator" starten, oder hier einen Ordner im
|
||||||
@@ -108,7 +116,47 @@ if (-not (Test-Path ".\HandBrakeCLI.exe") -and -not $hb) {
|
|||||||
}
|
}
|
||||||
Write-Host "HandBrakeCLI bereit."
|
Write-Host "HandBrakeCLI bereit."
|
||||||
|
|
||||||
# 5. Start-Skript erzeugen
|
# 5. Netzwerk-Freigabe klären (RIPPY_PATH_MAP) - der stille Blocker bis 26.07.2026
|
||||||
|
#
|
||||||
|
# Rippy schickt dem Worker Pfade wie /app/media/rippy/<job>. Das sind Pfade
|
||||||
|
# INNERHALB des Rippy-Containers; dieser PC sieht sie nur, wenn sie auf eine
|
||||||
|
# Netzwerk-Freigabe übersetzt werden. Ohne das nimmt der Worker die Aufgabe an
|
||||||
|
# und lehnt sie Millisekunden später ab ("Keine Roh-MKVs gefunden") - gemessen
|
||||||
|
# am Job 95afdc89. Geraten wird nichts: Rippy hat die Freigabe selbst
|
||||||
|
# eingehängt und kennt ihre Quelle.
|
||||||
|
if (-not $PfadMap) {
|
||||||
|
Write-Host "Frage Rippy, über welche Freigabe die Rohdaten erreichbar sind ..."
|
||||||
|
try {
|
||||||
|
$antwort = Invoke-RestMethod "http://$RippyHost/api/worker-setup/pfad-map" -TimeoutSec 15
|
||||||
|
if ($antwort.hinweis) { Write-Host $antwort.hinweis -ForegroundColor Yellow }
|
||||||
|
if ($antwort.mapping) { $PfadMap = [string]$antwort.mapping }
|
||||||
|
} catch {
|
||||||
|
Write-Host "HINWEIS: Abfrage fehlgeschlagen ($($_.Exception.Message))." -ForegroundColor Yellow
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ($PfadMap) {
|
||||||
|
Write-Host "Freigabe: $PfadMap"
|
||||||
|
foreach ($paar in ($PfadMap -split ";")) {
|
||||||
|
if ($paar -notmatch "=") { continue }
|
||||||
|
$zielPfad = ($paar -split "=", 2)[1]
|
||||||
|
if (Test-Path -LiteralPath $zielPfad -ErrorAction SilentlyContinue) {
|
||||||
|
Write-Host " OK: $zielPfad ist von hier erreichbar." -ForegroundColor Green
|
||||||
|
} else {
|
||||||
|
Write-Host " NICHT erreichbar: $zielPfad" -ForegroundColor Yellow
|
||||||
|
Write-Host " Meist fehlen nur die Zugangsdaten: die Freigabe einmal im" -ForegroundColor Yellow
|
||||||
|
Write-Host " Explorer öffnen und 'Anmeldedaten speichern' anhaken." -ForegroundColor Yellow
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Write-Host "ACHTUNG: Ohne Freigabe kann dieser Worker NICHTS komprimieren." -ForegroundColor Yellow
|
||||||
|
Write-Host " Er wird trotzdem installiert; Jobs schlagen dann mit einer" -ForegroundColor Yellow
|
||||||
|
Write-Host " Klartext-Meldung fehl statt still zu hängen." -ForegroundColor Yellow
|
||||||
|
}
|
||||||
|
# Leeres RIPPY_PATH_MAP nicht setzen: pfad_lokal() liest es als "kein Mapping",
|
||||||
|
# und die Fehlermeldung im Worker unterscheidet genau diese beiden Fälle.
|
||||||
|
$mapZeile = if ($PfadMap) { "set RIPPY_PATH_MAP=$PfadMap`r`n" } else { "" }
|
||||||
|
|
||||||
|
# 6. Start-Skript erzeugen
|
||||||
$bat = @"
|
$bat = @"
|
||||||
@echo off
|
@echo off
|
||||||
rem Rippy Windows-Transcode-Worker - verbindet sich mit $RippyHost
|
rem Rippy Windows-Transcode-Worker - verbindet sich mit $RippyHost
|
||||||
@@ -117,12 +165,12 @@ set REDIS_URL=redis://${RippyHost}:6379/0
|
|||||||
set DATABASE_URL=postgresql://rippy:rippy@${RippyHost}:5432/rippy
|
set DATABASE_URL=postgresql://rippy:rippy@${RippyHost}:5432/rippy
|
||||||
set API_URL=http://${RippyHost}:8000
|
set API_URL=http://${RippyHost}:8000
|
||||||
set WORKER_NAME=$WorkerName
|
set WORKER_NAME=$WorkerName
|
||||||
set PATH=%~dp0;%PATH%
|
${mapZeile}set PATH=%~dp0;%PATH%
|
||||||
venv\Scripts\celery.exe -A celery_app worker --loglevel=info -Q transcode --pool=solo -n ${WorkerName}@%%h
|
venv\Scripts\celery.exe -A celery_app worker --loglevel=info -Q transcode --pool=solo -n ${WorkerName}@%%h
|
||||||
"@
|
"@
|
||||||
Set-Content -Path "start-worker.bat" -Value $bat -Encoding ASCII
|
Set-Content -Path "start-worker.bat" -Value $bat -Encoding ASCII
|
||||||
|
|
||||||
# 6. Tray-Start (empfohlen): Symbol neben der Uhr, kein Konsolenfenster
|
# 7. Tray-Start (empfohlen): Symbol neben der Uhr, kein Konsolenfenster
|
||||||
$trayBat = @"
|
$trayBat = @"
|
||||||
@echo off
|
@echo off
|
||||||
rem Rippy-Worker mit Tray-Symbol - verbindet sich mit $RippyHost
|
rem Rippy-Worker mit Tray-Symbol - verbindet sich mit $RippyHost
|
||||||
@@ -132,13 +180,13 @@ set DATABASE_URL=postgresql://rippy:rippy@${RippyHost}:5432/rippy
|
|||||||
set API_URL=http://${RippyHost}:8000
|
set API_URL=http://${RippyHost}:8000
|
||||||
set WORKER_NAME=$WorkerName
|
set WORKER_NAME=$WorkerName
|
||||||
set RIPPY_TRAY_HOST=$RippyHost
|
set RIPPY_TRAY_HOST=$RippyHost
|
||||||
set PATH=%~dp0;%PATH%
|
${mapZeile}set PATH=%~dp0;%PATH%
|
||||||
start "" venv\Scripts\pythonw.exe tray.py
|
start "" venv\Scripts\pythonw.exe tray.py
|
||||||
"@
|
"@
|
||||||
Set-Content -Path "start-tray.bat" -Value $trayBat -Encoding ASCII
|
Set-Content -Path "start-tray.bat" -Value $trayBat -Encoding ASCII
|
||||||
Write-Host "start-worker.bat + start-tray.bat erzeugt."
|
Write-Host "start-worker.bat + start-tray.bat erzeugt."
|
||||||
|
|
||||||
# 7. Deinstaller - MUSS-Kriterium: rückstandsfrei entfernbar
|
# 8. Deinstaller - MUSS-Kriterium: rückstandsfrei entfernbar
|
||||||
$uninstall = @"
|
$uninstall = @"
|
||||||
# Rippy-Worker DEINSTALLIEREN: stoppt Prozesse, entfernt Autostart,
|
# Rippy-Worker DEINSTALLIEREN: stoppt Prozesse, entfernt Autostart,
|
||||||
# meldet den Worker in Rippy ab und löscht diesen Ordner komplett.
|
# meldet den Worker in Rippy ab und löscht diesen Ordner komplett.
|
||||||
@@ -169,7 +217,7 @@ Write-Host "Rippy-Worker deinstalliert." -ForegroundColor Green
|
|||||||
Set-Content -Path "uninstall.ps1" -Value $uninstall -Encoding ASCII
|
Set-Content -Path "uninstall.ps1" -Value $uninstall -Encoding ASCII
|
||||||
Write-Host "uninstall.ps1 erzeugt."
|
Write-Host "uninstall.ps1 erzeugt."
|
||||||
|
|
||||||
# 8. Optional: Autostart bei Anmeldung (mit Tray)
|
# 9. Optional: Autostart bei Anmeldung (mit Tray)
|
||||||
#
|
#
|
||||||
# Über den Autostart-ORDNER, nicht über schtasks: Eine Aufgabe im
|
# Über den Autostart-ORDNER, nicht über schtasks: Eine Aufgabe im
|
||||||
# Wurzelordner der Aufgabenplanung anzulegen verlangt Administratorrechte, und
|
# Wurzelordner der Aufgabenplanung anzulegen verlangt Administratorrechte, und
|
||||||
|
|||||||
Reference in New Issue
Block a user