From 3987c31b1e2214c58c765c054f348a17ee6ce341 Mon Sep 17 00:00:00 2001 From: Hitonabi Date: Fri, 24 Jul 2026 15:39:20 +0200 Subject: [PATCH] Update-Check im System-Tab, Worker-Adressfeld mit Heimnetz-Warnung, Save-Knopf raus aus dem Worker-Tab MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. Update-Erkennung (Commander-Frage 'wie kriegen wir Updates mit?'): GET /system/updates vergleicht installierte Versionen (Worker-Info) mit makemkv.com (Versionsnummer der Download-Seite) und der HandBrake- GitHub-Release-API (releases/latest), 12 h gecacht. Einstellungen -> System: 'Auf Updates prüfen' + fertiger Update-Befehl bei MakeMKV. Selbst-Update gibt es bewusst NICHT (waere Docker-Socket-Zugriff); dafuer ist MAKEMKV_VERSION jetzt per .env uebersteuerbar — Update ohne Code-Aenderung. HandBrake-Abweichung wird als Info dargestellt (Debian-Paket hinkt der offiziellen Version bewusst hinterher). 2. Worker-Anbindung: editierbares Adressfeld statt stillschweigend window.location.hostname — Befund: ueber die externe Domain kopierte Befehle liefen in den Reverse-Proxy (401) und Worker koennen Redis/ Postgres eh nur im Heimnetz erreichen. Amber-Warnung bei oeffentlich aussehender Adresse, Anleitung ergaenzt. 3. 'Einstellungen speichern' ist im Worker-Tab ausgeblendet — dort gibt es nichts zu speichern, der Knopf verwirrte nur. Co-Authored-By: Claude Fable 5 --- .env.example | 6 ++ README.md | 14 +++- docker-compose.yml | 5 ++ docker/api/main.py | 64 ++++++++++++++++++ docker/ui/src/components/WorkerVerwaltung.tsx | 35 +++++++++- docker/ui/src/pages/Anleitung.tsx | 12 ++++ docker/ui/src/pages/Settings.tsx | 67 ++++++++++++++++++- 7 files changed, 198 insertions(+), 5 deletions(-) diff --git a/.env.example b/.env.example index be4bcdb..1366eab 100644 --- a/.env.example +++ b/.env.example @@ -21,3 +21,9 @@ OMDB_API_KEY= # Bequemer: im UI unter Einstellungen → System eintragen (gilt ab dem # nächsten Rip, ohne Neustart, und schlägt diesen Env-Wert). MAKEMKV_APP_KEY= + +# MakeMKV-Version fürs Worker-Image (Einstellungen → System meldet Updates). +# Update: Version hier anheben, dann auf der Rippy-Maschine +# docker compose build worker && docker compose up -d worker +# (bei Cloudflare-Zicken vorher Tarballs nach docker/worker/vendor/ legen) +#MAKEMKV_VERSION=1.18.4 diff --git a/README.md b/README.md index 1ec8fbc..3ea5df5 100644 --- a/README.md +++ b/README.md @@ -103,14 +103,22 @@ fehlgeschlagen, abgebrochen) und erkennt den Dienst an der URL selbst: | ntfy (Handy-Push) | `https://ntfy.sh/mein-geheimes-thema` | Roh-Text + Titel | | Eigenes (HA, n8n, …) | beliebige HTTPS-URL | `{"title","message","level"}` | -## System & MakeMKV-Beta-Key +## System, MakeMKV-Beta-Key & Updates **Einstellungen → System** zeigt die Werkzeug-Versionen jedes Workers (MakeMKV, HandBrake), den Key-Status und den freien Speicherplatz. Der MakeMKV-Beta-Key (wechselt ~monatlich, Forum-Thread t=1053) wird hier im UI eingetragen und gilt ab dem **nächsten Rip** — ohne Rebuild, ohne -Neustart; er schlägt den Key aus der `.env`. Nur die MakeMKV-*Version* -steckt im Image: `docker compose build worker && docker compose up -d worker`. +Neustart; er schlägt den Key aus der `.env`. + +**Updates:** „Auf Updates prüfen" vergleicht mit makemkv.com und den +offiziellen HandBrake-Releases (12 h gecacht). MakeMKV-Update ohne +Code-Änderung: `MAKEMKV_VERSION=x.y.z` in die `.env`, dann +`docker compose build worker && docker compose up -d worker` — neue +Versionen bringen auch die neueste Disc-Schlüssel-Datenbank mit. +HandBrake kommt im Docker-Worker bewusst aus Debian (stabil, hinkt der +offiziellen Version hinterher); der native Windows-Worker nutzt die +aktuelle Version direkt. ## Verarbeitung & Hardware diff --git a/docker-compose.yml b/docker-compose.yml index 97727c6..e7c0509 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -68,6 +68,11 @@ services: # 525); dann Wayback-Snapshot als MAKEMKV_URL_BASE eintragen. # /download = aktuelle Version, /download/old = ältere Versionen. MAKEMKV_URL_BASE: ${MAKEMKV_URL_BASE:-https://www.makemkv.com/download} + # MakeMKV-Update OHNE Code-Änderung: neue Version in die .env, + # Tarballs nach docker/worker/vendor/ legen (oder Download klappt), + # dann docker compose build worker && docker compose up -d worker. + # Einstellungen → System meldet, wenn es eine neuere Version gibt. + MAKEMKV_VERSION: ${MAKEMKV_VERSION:-1.18.4} environment: - DATABASE_URL=postgresql://rippy:rippy@postgres:5432/rippy - REDIS_URL=redis://redis:6379/0 diff --git a/docker/api/main.py b/docker/api/main.py index 4c07d9e..c3cfbcc 100644 --- a/docker/api/main.py +++ b/docker/api/main.py @@ -935,6 +935,70 @@ async def browse_mkdir(request: MkdirRequest): return {"path": ziel} +@app.get("/system/updates") +async def system_updates(): + """Update-Check für die Kern-Werkzeuge (Einstellungen → System). + + Quellen: HandBrake über die GitHub-Release-API (releases/latest → + tag_name), MakeMKV über die offizielle Download-Seite (Versionsnummer + im Seitentext). Ergebnisse werden 12 h gecacht — der Check ist Komfort, + kein Dauerfeuer auf fremde Server. Ein Selbst-Update gibt es bewusst + NICHT: die Versionen stecken im Worker-Image, das Update ist ein + Image-Rebuild (Befehl wird im UI angezeigt). + """ + import re as _re + + import requests as _requests + + from cache import get as cache_get, set as _cache_set + + def hole_neueste(): + ergebnis = {"makemkv": None, "handbrake": None} + cached = cache_get("updates:neueste") + if cached: + return cached + try: + antwort = _requests.get( + "https://api.github.com/repos/HandBrake/HandBrake/releases/latest", + timeout=15, headers={"Accept": "application/vnd.github+json"}, + ) + if antwort.status_code == 200: + ergebnis["handbrake"] = (antwort.json().get("tag_name") or "").lstrip("v") + except Exception: + pass + try: + antwort = _requests.get("https://www.makemkv.com/download/", timeout=15) + treffer = _re.search(r"MakeMKV\s+(\d+\.\d+\.\d+)", antwort.text or "") + if treffer: + ergebnis["makemkv"] = treffer.group(1) + except Exception: + pass + if ergebnis["makemkv"] or ergebnis["handbrake"]: + _cache_set("updates:neueste", ergebnis, expire=12 * 3600) + return ergebnis + + def sammle(): + neueste = hole_neueste() + installiert = {"makemkv": None, "handbrake": None} + for worker in db.list_workers(): + info = worker.get("info") or {} + installiert["makemkv"] = installiert["makemkv"] or info.get("makemkv") + installiert["handbrake"] = installiert["handbrake"] or info.get("handbrake") + return { + werkzeug: { + "installiert": installiert[werkzeug], + "verfuegbar": neueste[werkzeug], + "update": bool( + installiert[werkzeug] and neueste[werkzeug] + and installiert[werkzeug] != neueste[werkzeug] + ), + } + for werkzeug in ("makemkv", "handbrake") + } + + return await asyncio.to_thread(sammle) + + @app.get("/worker-setup/windows") async def worker_setup_windows(): """Windows-Installer-Skript für den nativen Transcode-Worker. diff --git a/docker/ui/src/components/WorkerVerwaltung.tsx b/docker/ui/src/components/WorkerVerwaltung.tsx index 000fe6a..b67ff40 100644 --- a/docker/ui/src/components/WorkerVerwaltung.tsx +++ b/docker/ui/src/components/WorkerVerwaltung.tsx @@ -41,9 +41,20 @@ export default function WorkerVerwaltung() { const [workers, setWorkers] = useState([]) const [kopiert, setKopiert] = useState(false) const [variante, setVariante] = useState<'linux' | 'windows'>('linux') + const [rippyHost, setRippyHost] = useState(window.location.hostname) const { theme } = useDarkMode() const { toast } = useToast() + // Worker verbinden sich DIREKT mit Redis/Postgres (6379/5432) — das geht + // nur im Heimnetz. Wer das UI gerade über eine externe Domain (Reverse- + // Proxy) aufruft, würde sonst Befehle mit der falschen Adresse kopieren + // (Befund 24.07.: 401 vom Proxy statt Installer). + const siehtOeffentlichAus = + !/^(\d{1,3}\.){3}\d{1,3}$/.test(rippyHost) && + !rippyHost.endsWith('.local') && + rippyHost !== 'localhost' && + rippyHost.includes('.') + const laden = (manuell = false) => { api.get('/capabilities') .then(r => { @@ -59,7 +70,6 @@ export default function WorkerVerwaltung() { return () => clearInterval(interval) }, []) - const rippyHost = window.location.hostname const installBefehl = variante === 'linux' ? [ `git clone rippy && cd rippy`, @@ -141,6 +151,29 @@ export default function WorkerVerwaltung() { {/* Neue Maschine anbinden — zwei Varianten */}

Maschine als Encoding-Worker anbinden

+ + {/* Rippy-Adresse für die Befehle: Worker reden DIREKT mit Redis/ + Postgres — das geht nur im Heimnetz, nie über die externe Domain */} +
+ + setRippyHost(e.target.value.trim())} + className={`w-full max-w-xs px-3 py-2 border rounded-lg text-sm font-mono focus:ring-2 focus:ring-indigo-500 focus:border-transparent ${theme === 'dark' ? 'bg-slate-800 border-slate-600 text-slate-200' : 'bg-white border-slate-300 text-slate-900'}`} + placeholder="192.168.178.162" + /> + {siehtOeffentlichAus && ( +

+ ⚠️ Das sieht nach einer externen Domain aus (Reverse-Proxy). Worker verbinden sich + direkt mit Redis/Postgres (Ports 6379/5432) — das geht nur im Heimnetz, und der + Proxy blockt den Installer-Download (401). Hier die LAN-IP der + Rippy-Maschine eintragen, z. B. 192.168.178.162. +

+ )} +
+
{([['linux', '🐧 Linux (Docker)'], ['windows', '🪟 Windows (nativ, ohne Docker)']] as const).map(([wert, label]) => (
+ + {/* Update-Check: Rippy MELDET Updates ehrlich — selbst updaten + kann es nicht (die Versionen stecken im Worker-Image) */} +
+
+

Update-Check

+ +
+ {updates ? ( +
+
+ MakeMKV: installiert {updates.makemkv?.installiert || '—'}, + aktuell {updates.makemkv?.verfuegbar || 'unbekannt'} + {updates.makemkv?.update && ( + + Update: in der .env MAKEMKV_VERSION={updates.makemkv.verfuegbar} setzen, + dann auf der Rippy-Maschine docker compose build worker && docker compose up -d worker. + Neue Version bringt auch die neueste Disc-Schlüssel-Datenbank mit. + + )} +
+
+ HandBrake: Docker-Worker {updates.handbrake?.installiert || '—'} (Debian-Paket), + neueste offizielle Version {updates.handbrake?.verfuegbar || 'unbekannt'} + + Im Docker-Worker kommt HandBrake aus Debian und hinkt der offiziellen Version + bewusst hinterher (stabil, keine Eigenbauten). Der native Windows-Worker nutzt + die aktuelle Version direkt. + +
+
+ ) : ( +

+ Prüft gegen makemkv.com und die HandBrake-GitHub-Releases (Ergebnis wird 12 h gemerkt). +

+ )} +
} - {/* Save Button */} + {/* Save Button — nicht im Worker-Tab: dort gibt es nichts zu + speichern (Liste + Anbinde-Befehle), der Knopf verwirrte nur */} + {activeTab !== 'worker' && (
+ )}