feat(installer): fertige .exe mit Rippy-Icon + ohne Konsolenfenster (statt .vbs)
Ampel / ampel (push) Successful in 28s

Commander-Einwand: .vbs ist abgekuendigt (Win11 24H2 Feature-on-Demand) und
wird oft als gefaehrlich geflaggt. Loesung: echte .exe.
- RippyWorkerSetup.exe (50 KB): install-gui.ps1 via ps2exe kompiliert —
  eingebettetes Rippy-Disc-Icon (deploy/worker-windows/rippy.ico), kein
  Konsolenfenster (-noConsole), WinForms (-STA). E2E getestet: Fenster
  oeffnet, conhost-Zaehler unveraendert (kein Konsolenfenster).
  Vorgebaut auf Windows (build-exe.ps1) + committet — eine Windows-.exe
  kann nicht von Linux (Rippy-Host) gebaut werden. WICHTIG: friert KEINE
  Versionen ein — HandBrake wird zur Laufzeit (GitHub latest) und der
  Worker-Code live von Rippy geholt; nur bei GUI-Aenderungen neu bauen.
- API: GET /worker-setup/windows-exe (FileResponse); Dockerfile kopiert die
  .exe ins Image. .gitattributes: *.exe/*.ico als binary.
- UI (Worker -> Windows): 'Installer herunterladen (.exe)' als Haupt-Weg
  (generisch, GUI fragt Adresse ab; die einzutragende IP wird als Hinweis
  angezeigt). .vbs-Erzeugung entfernt. CLI bleibt Profi-Alternative.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Hitonabi
2026-07-24 19:15:42 +02:00
parent b1d9ece9b2
commit 20cdfedb85
7 changed files with 101 additions and 30 deletions
+4
View File
@@ -22,5 +22,9 @@ COPY docker/api/ .
# die Zielmaschine braucht weder git noch Docker.
COPY docker/worker/*.py docker/worker/requirements.txt worker_dist/
COPY deploy/worker-windows/install.ps1 deploy/worker-windows/install-gui.ps1 worker_dist/
# Vorgebaute .exe (Rippy-Icon, kein Konsolenfenster) — auf Windows via
# deploy/worker-windows/build-exe.ps1 erzeugt (Windows-.exe geht nicht von
# Linux). Nur bei GUI-Aenderungen neu bauen, nicht bei Tool-Updates.
COPY deploy/worker-windows/RippyWorkerSetup.exe worker_dist/
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000", "--app-dir", "/app"]
+18 -2
View File
@@ -1091,14 +1091,30 @@ async def worker_setup_windows():
@app.get("/worker-setup/windows-gui")
async def worker_setup_windows_gui():
"""Grafischer Windows-Installer (WinForms) — vom .bat-Launcher geladen und
gestartet, damit der Nutzer ein Fenster statt CLI bekommt."""
"""Grafischer Windows-Installer (WinForms, PowerShell-Quelle) — Rückfall
für Fortgeschrittene; der Normalweg ist die .exe unten."""
pfad = "worker_dist/install-gui.ps1"
if not os.path.isfile(pfad):
raise HTTPException(status_code=404, detail="GUI-Installer nicht im Image — API neu bauen")
return FileResponse(pfad, media_type="text/plain", filename="rippy-worker-gui.ps1")
@app.get("/worker-setup/windows-exe")
async def worker_setup_windows_exe():
"""Fertige Windows-Installer-.exe (Rippy-Icon, kein Konsolenfenster).
Vorgebaut auf Windows (deploy/worker-windows/build-exe.ps1) — eine
Windows-.exe lässt sich nicht auf Linux bauen. Generisch: die GUI fragt
die Rippy-Adresse selbst ab, HandBrake + Worker-Code kommen zur Laufzeit."""
pfad = "worker_dist/RippyWorkerSetup.exe"
if not os.path.isfile(pfad):
raise HTTPException(status_code=404, detail="Installer-.exe nicht im Image — API neu bauen")
return FileResponse(
pfad, media_type="application/vnd.microsoft.portable-executable",
filename="RippyWorkerSetup.exe",
)
@app.get("/worker-setup/paket")
async def worker_setup_paket():
"""Worker-Quellcode als Zip — der Windows-Installer lädt ihn von hier.