docs: Konzept fuer Rippy v2 + drei Commander-Entscheide (28.08.2026)

WAS: KONZEPT-V2.md neu — Systemarchitektur, Daten-/Queue-Strategie, die
drei Betriebsmodi, API-/Event-Design, Migrationsplan V2-0 bis V2-7.
KONZEPT.md §10 und ROADMAP.md ziehen nach.

WARUM: Rippy soll drei Betriebsarten bekommen statt einer — Docker,
native Windows-App ohne Docker, Headless-Linux-Dienst; alle mit
demselben Webinterface. Das traegt technisch nur, wenn es EINEN Kern
gibt, dessen Betriebsmodus nur die Auswahl der Treiber hinter vier
Ports ist (Store, Queue, Bus, Drives).

Drei Entscheide des Commanders sind eingearbeitet:

- Reihenfolge: Echtzeit (SSE statt Polling) VOR der Windows-App. Die
  Windows-App braucht SQLite und die lokale Queue ohnehin.
- Disc-Schluessel: automatischer Abruf MIT Rueckfallebene, als Kette in
  drei Stufen (eigener Bestand -> Abruf -> Import von Hand). Das
  verschiebt die Grenze aus KONZEPT.md §10 vom 25.07.2026 bewusst —
  deshalb steht sie dort jetzt ausdruecklich fortgeschrieben statt
  still ersetzt (AGENTS Regel B). Bezugsadresse leer vorbelegt,
  Fehlschlag laut, Bestand wird nie still ueberschrieben.
- Speicherziele: der Host mountet, Rippy prueft und erzeugt die
  kopierbare Zeile. Raeumt die URSACHE der CIFS-Ausfaelle ab (Befund
  26.07.2026: die Verbindung lebt in der Netz-Namespace des
  api-Containers und stirbt mit ihm) statt weiter das Symptom zu
  heilen. SYS_ADMIN, DAC_READ_SEARCH, apparmor:unconfined und die
  Mount-Wache fallen damit weg.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Hitonabi
2026-08-28 08:38:03 +02:00
co-authored by Claude Opus 5
parent a14449ef85
commit 20675a98fa
3 changed files with 1426 additions and 0 deletions
+97
View File
@@ -570,8 +570,105 @@ heruntergerechnet und der Rohschnitt gelöscht worden (`keepOriginal: False`).
---
## Rippy v2 — Etappen V2-0 bis V2-7 (Plan vom 28.08.2026)
**Vollständige Spezifikation: `KONZEPT-V2.md`.** Hier stehen nur die Etappen
und ihre Abnahmekriterien.
**Ziel:** drei Betriebsmodi statt eines — Docker (wie heute, aufgeräumt), eine
native Windows-App ohne Docker, eine Headless-Linux-Anwendung. Alle drei mit
demselben Webinterface, alle drei aus EINEM Kern.
**Grundregel für den ganzen Weg:** Jede Etappe endet mit grüner Ampel und einem
lauffähigen System. v1 läuft bis V2-5 produktiv weiter — auf der VM liegen echte
Medien.
### V2-0: Monorepo — ein Paket statt Zwillingen
- [ ] `src/rippy/` als gemeinsames Paket anlegen (api UND worker importieren daraus)
- [ ] Die byte-identischen Zwillinge zusammenführen: `detection.py`,
`makemkv_daten.py`, `notify.py` — je zweimal im Repo
- [ ] Tests wandern mit; `test_zwillinge_sind_byteweise_identisch` wird
gegenstandslos und weicht einem Test, der die EINE Quelle prüft
- [ ] Beide Dockerfiles kopieren `src/rippy`, `PYTHONPATH` gesetzt
- **Verhalten unverändert.** Kein Funktionsgewinn, reine Struktur.
- **Fertig, wenn:** Ampel grün, `docker compose up` verhält sich wie vorher,
kein Modul mehr doppelt im Repo.
### V2-1: Ports einziehen
- [ ] `Store`, `Queue`, `Bus`, `Drives` als Python-`Protocol`
- [ ] v1-Verhalten läuft über die Treiber Postgres / Celery / Redis / Linux
- [ ] Kein Funktionsgewinn — reine Verdrahtung
- **Fertig, wenn:** Ampel grün und ein Rip auf der VM durchläuft.
### V2-2: Standalone (SQLite + lokale Queue)
- [ ] SQLite-Treiber mit WAL, `busy_timeout`, ein Schreiber-Kontext
- [ ] Alembic statt handgeschriebener `ALTER TABLE … IF NOT EXISTS`
(das ist Postgres-only und bricht auf SQLite)
- [ ] LocalQueue: Auftrags-Tabelle + Lease + Prozesspool, kein Broker
- [ ] Lease ersetzt `zombies.py` — abgelaufene Lease = Auftrag ist frei
- [ ] `rippyd --profil standalone`
- **Fertig, wenn:** ein DVD-Rip komplett ohne Postgres, Redis und Docker läuft.
### V2-3: Echtzeit — Polling raus
- [ ] Bus-Treiber (asyncio in-process / Redis Pub/Sub)
- [ ] `GET /api/v2/events` als SSE-Strom, `snapshot` beim Verbinden,
lückenlose `seq` für Wiederaufnahme
- [ ] UI auf einen `useEventStream`-Haken; die neun `setInterval` fliegen raus
- [ ] `test_grenze_deckt_die_eigene_last_ab` auf die neuen Zahlen ziehen
- **Fertig, wenn:** Grundlast ≈ 0/min gemessen (heute ≈ 133/min bei einem Tab
plus Worker) UND ein Verbindungsabriss keine Liste leert.
### V2-4: Windows nativ
- [ ] `drives/windows.py` — Win32 statt ioctl (`IOCTL_STORAGE_CHECK_VERIFY2`,
`IOCTL_STORAGE_MEDIA_REMOVAL`, `IOCTL_STORAGE_EJECT_MEDIA`,
MMC `GET CONFIGURATION` für den Disc-Typ)
- [ ] Disc-Einwurf per `WM_DEVICECHANGE` statt Polling
- [ ] Dienst (WinSW) + Tray als GETRENNTE Prozesse; WebView2-Fenster
- [ ] Nuitka `--standalone` (one-dir, nicht one-file) + Inno Setup
- [ ] Standby blocken via `SetThreadExecutionState`, ohne `ES_DISPLAY_REQUIRED`
- **Fertig, wenn:** auf einem frischen Win-11-Rechner gilt: Installer →
Disc rein → MKV raus. Und der UHD-Schlüssel kommt automatisch.
### V2-5: Docker neu
- [ ] EIN Image, drei Profile (`standalone`, `api`, `node`)
- [ ] GPU-Durchreichung: `/dev/dri` für QSV/VAAPI, `runtime: nvidia` für NVENC
- [ ] **Host-Mounts statt Container-Mounts** (Entscheid 28.08.2026)
- [ ] Multi-Arch; ARM64 ist Encode-/API-Knoten (MakeMKV hat kein ARM64-Binary)
- **Fertig, wenn:** All-in-One und verteilt laufen und `SYS_ADMIN`,
`DAC_READ_SEARCH`, `apparmor:unconfined` weg sind.
### V2-6: CLI & Pakete
- [ ] `rippy status / drives / scan / rip / queue / logs --follow / doctor`
- [ ] `rippy doctor` = die Prüfphase aus `install.sh` als Befehl (erst alles
prüfen, dann berichten, nichts ändern)
- [ ] systemd-Unit mit `SupplementaryGroups=cdrom` und `DeviceAllow` für
block-sr UND char-sg (ohne sg findet MakeMKV kein Laufwerk)
- [ ] udev-Regel für echte Disc-Ereignisse; ioctl-Poll bleibt Rückfallebene
- [ ] `.deb` / AppImage
- **Fertig, wenn:** ein Headless-Server ohne Browser bedienbar ist.
### V2-7: Neue Features
- [ ] Multi-Drive Parallel-Ripping (Rip parallel, **Schlüssel-Phase
serialisiert** — vorher an zwei Laufwerken MESSEN, nicht annehmen)
- [ ] Zero-Click gegen Interaktiv, je Laufwerk und Disc-Typ
- [ ] Auto-Presets nach gemessener Hardware (Vorschlag, kein Zwang)
- [ ] Ton-/Untertitel-Regelwerk (Originalton, Wunschsprachen, erzwungene
Untertitel behalten, Kommentarspuren verwerfen, HD-Ton durchreichen)
- [ ] **Schlüsselkette in drei Stufen** (Entscheid 28.08.2026, `KONZEPT.md` § 10)
- [ ] Anime über AniList zusätzlich zu Jikan
- [ ] Medienserver-Refresh als Auftrag MIT Wiederholung (heute still scheiternd)
- [ ] FFmpeg-Direktpfad für reines Remuxen
- **Fertig, wenn:** je Feature ein Nachweis vorliegt.
---
## Ideen-Katalog (Rest) — bewusst offen
> **Stand 28.08.2026:** Punkt 3 (Kodi-Refresh) und Punkt 4 (Windows-Worker als
> Dienst) sind in den v2-Plan aufgegangen — Punkt 4 ist V2-4, Punkt 3 steckt in
> V2-7 („Medienserver-Refresh"). Punkt 2 (AI-Box als Transcode-Worker) wird von
> V2-5 abgedeckt, sobald der Host-Mount-Weg steht.
1. **Design 2.0** — an Gemini übergeben (24.07.2026). Vollständiges
Briefing: `docs/DESIGN-2.0-BRIEFING.md`. Arbeitsbranch: `design-2.0`
(deployt bewusst NICHT, nur `main` wird befördert). Kern: 428