Native Windows-Auslieferung statt Container

Docker faellt weg. Das Projekt hat keine npm-Abhaengigkeiten und Node fuehrt
TypeScript direkt aus - der Container schrieb nur noch drei Programme fest,
und dafuer braucht es keine Virtualisierung, sondern einen Ordner.

Der Anlass war, dass ADR-0004 zwar `docker compose pull` versprach, es aber
nie ein veroeffentlichtes Image gab. Wer installieren wollte, musste
whisper.cpp aus dem Quelltext uebersetzen.

Plattformschicht (packages/core/src/platform.ts):
- Programme werden neben der Anwendung gesucht, nicht im PATH
- Daten unter %LOCALAPPDATA%, damit Installation und Update ohne
  Administratorrechte auskommen
- Schriften mitgeliefert: ohne fontsdir setzt libass wortlos eine
  Ersatzschrift ein - gemessen 720 statt 826 Pixel Zeilenbreite

Windows-Eigenheiten, an echtem ffmpeg 8.1 durchprobiert:
- Pfade im Filtergraphen brauchen alle drei Schritte (Vorwaertsschraegstriche,
  escapter Doppelpunkt, Anfuehrungszeichen); je zwei davon reichen nicht
- `nice` gibt es nicht, ersetzt durch os.setPriority

Auslieferung:
- scripts/build-package.ts baut das Paket, laeuft auch unter Linux
- install.ps1 ohne Administratorrechte, Autostart ueber den Aufgabenplaner
- update legt neue Fassungen bereit; eingespielt wird beim naechsten Start,
  nie mitten im Stream
- ZIP lesen und schreiben ohne Abhaengigkeiten (packages/core/src/zip.ts)

Kein `irm ... | iex`-Einzeiler: git.zeasy.dev antwortete instanzweit mit einer
Umleitung auf /user/login, und `iex` fuehrte die Anmeldeseite als PowerShell
aus. Der Updater verfolgt Umleitungen jetzt nicht und hat keine erfundene
Vorgabeadresse mehr.

Ausserdem: backup.ps1 war an zwei Stellen dokumentiert, aber nie geschrieben.

ADR-0007 ersetzt ADR-0004. 84 Tests, Typpruefung sauber.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AhVSfMFdWnXKCv5JfLnArZ
This commit is contained in:
ZeasyAlexandClaude Opus 5 committed 2026-09-09 17:39:26 +02:00
1 parent 71dd660d01
commit 5f6301268a
41 files changed
+2254 -312

No files matched your search

+43 -30
View File
@@ -11,7 +11,7 @@ Auslöser bis zum fertigen Short steht **im Code vollständig** — geprüft ist
| Scheibe | Stand | Nachweis |
|---|---|---|
| S0 Container + Toolchain | fertig | `check-env` ohne harte Fehler |
| S0 Toolchain + Auslieferung | fertig | `check-env` nativ ohne harte Fehler, Paket gebaut und installiert |
| S1 Einrichtung, Auth, DB, Chat | fertig | Daemon läuft, Chat verbunden, Secrets verschlüsselt |
| S2 OBS + `!clip` | Code fertig, **nicht abgenommen** | braucht laufendes OBS |
| S3 9:16-Render | fertig | Durchlauf mit künstlicher Aufnahme |
@@ -19,68 +19,76 @@ Auslöser bis zum fertigen Short steht **im Code vollständig** — geprüft ist
| S5 Onboarding + Sichtung | offen | — |
| S6 Erstchatter-Begrüßung | offen | — |
53 Tests, alle grün. Vollständige Liste dessen, was noch fehlt:
79 Tests, alle grün. Vollständige Liste dessen, was noch fehlt:
[`offene-punkte.md`](offene-punkte.md).
## Was jemand wissen muss, bevor er etwas anfasst
**Es gibt keine Abhängigkeiten und keinen Build.** Node 24 bringt SQLite,
WebSocket, `fetch` und die Ausführung von TypeScript mit. `node docker/entrypoint.ts`
WebSocket, `fetch` und die Ausführung von TypeScript mit. `node apps/cli/main.ts`
läuft direkt. Deshalb gilt: nur *löschbare* TypeScript-Syntax — keine `enum`,
keine Parameter-Properties im Konstruktor, keine `namespace`. `erasableSyntaxOnly`
in der `tsconfig.json` erzwingt das und hat schon einen echten Fehler gefangen.
**Alles läuft unter einem Dach**, einem Prozess in einem Container. Schwere
**Alles läuft unter einem Dach**, in einem Prozess. Schwere
Arbeit (ffmpeg, whisper) läuft als Kindprozess und darf abstürzen. Der Ingest
darf nie sterben — was er nicht mitschreibt, ist für immer weg.
**Zugangsdaten kommen aus der Weboberfläche**, nicht aus einer Datei. Sie liegen
verschlüsselt in einem Docker-Volume, bewusst außerhalb der Datenbank, weil die
gesichert und dabei auf die Windows-Seite kopiert wird.
verschlüsselt neben der Datenbank, aber bewusst nicht *in* ihr — die Datenbank
wird gesichert und weitergereicht, die Geheimnisse nicht.
**Rohdateien gehören ins Arbeits-Volume**, nicht in den Windows-Bind-Mount. Über
die WSL2-Brücke zu encodieren kostet ein Vielfaches. Dagegen habe ich einmal
selbst verstoßen — der Fehler fiel erst in S3 auf.
**Rohdateien gehören in den Arbeitsordner**, nicht neben den OBS-Puffer. Das
war unter Docker ein Zeitproblem (Encodieren über die WSL2-Brücke kostete ein
Vielfaches) und ist nativ nur noch Ordnung — der Wiedergabepuffer-Ordner
gehört OBS.
Die Begründungen stehen in [`decisions/`](decisions/), sechs ADRs. Wer eine
Die Begründungen stehen in [`decisions/`](decisions/), sieben ADRs. Wer eine
davon umwerfen will, sollte sie vorher lesen; jede hat einen Grund, der beim
Bauen aufgetaucht ist.
Bauen aufgetaucht ist. ADR-0004 (Docker) ist durch ADR-0007 ersetzt — die
Analyse darin bleibt trotzdem lesenswert.
## Loslegen
```powershell
git clone https://git.zeasy.dev/ZeasyAlex/abdulive.git
cd abdulive
Copy-Item config\config.example.yaml config\config.yaml
**Auf Abdus Rechner** läuft eine native Windows-Anwendung — kein Docker, kein
WSL2, nichts zu übersetzen ([ADR-0007](decisions/ADR-0007-native-windows.md)):
docker compose build
docker compose run --rm toolkit check-env
docker compose run --rm toolkit fetch-model # ca. 465 MB
docker compose up -d
```powershell
Expand-Archive .\abdulive-0.5.0-win-x64.zip -DestinationPath .\abdulive
.\abdulive\install.ps1
abdulive fetch-model
abdulive check-env
```
Dann `http://localhost:4792/setup` öffnen. Ausführlich in
[`05-setup.md`](05-setup.md).
Einen Einzeiler zum Nachladen gibt es nicht — `git.zeasy.dev` ist komplett
angemeldet-only. **Wo die Pakete liegen sollen, ist die naechste offene
Entscheidung**, und ohne sie funktioniert auch `abdulive update` nicht.
Tests:
Ausführlich in [`05-setup.md`](05-setup.md).
**Zum Entwickeln** reicht ein Checkout und Node 24 oder neuer:
```powershell
docker run --rm -v "${PWD}:/app" -w /app node:24-bookworm-slim `
node --test "packages/**/*.test.ts" "apps/**/*.test.ts"
node apps/cli/main.ts check-env
node --test "packages/**/*.test.ts" "apps/**/*.test.ts"
node scripts/build-package.ts --version 0.5.0 # baut dist/*.zip
```
Typprüfung (das Einzige, wofür npm gebraucht wird):
```powershell
docker run --rm -v "${PWD}:/app" -w /tmp node:24-bookworm-slim sh -c `
"npm i -s typescript@5.9 @types/node && cd /app && /tmp/node_modules/.bin/tsc --noEmit --typeRoots /tmp/node_modules/@types"
npm i typescript@5.9 @types/node
npx tsc --noEmit
```
## Die drei Dinge, die Abdu tun muss
1. **Zwei Twitch-Apps anlegen** (dev.twitch.tv/console/apps), Redirect-URI
`http://localhost:4792/callback`. Client-ID und Secret danach auf der
Einrichtungsseite eintragen — nicht in eine Datei.
1. **Broadcaster-Konto verbinden.** Die beiden Twitch-Apps
(dev.twitch.tv/console/apps, Redirect-URI `http://localhost:4792/callback`)
kann auch jemand anders anlegen — sie hängen nicht am Kanal. Was **nur Abdu**
kann: auf der Einrichtungsseite eingeloggt als er selbst auf „Mit Twitch
verbinden" klicken. Dafür muss die Anwendung auf seinem Rechner schon
laufen; die Seite hört nur auf `127.0.0.1`.
2. **OBS einrichten**: obs-websocket an (Port 4455), Wiedergabepuffer 90 s,
Hotkey auf „Wiedergabepuffer speichern", getrennte Audiospuren.
3. **Layout umstellen** nach [`obs-layout.md`](obs-layout.md). Die
@@ -109,5 +117,10 @@ Die Untertitel sind brauchbar, nicht gut. `ggml-small` verhört sich hörbar
Einfärben ist nicht der Stil, der auf Shorts trägt. Sechs konkrete
Verbesserungen stehen in [`offene-punkte.md`](offene-punkte.md).
Und: Das Aufräumen im Arbeits-Volume fehlt komplett. Rohdateien sammeln sich
Und: Das Aufräumen im Arbeitsordner fehlt komplett. Rohdateien sammeln sich
unbegrenzt an. Das ist die Lücke, die als Erstes weh tun wird.
Der Updater ist gebaut und in Teilen geprüft — Manifest, Download, Prüfsumme
und Bereitlegen laufen. Der eigentliche Tausch durch `launcher.ps1` ist noch
nie im Feld passiert. Vor dem ersten echten Update einmal künstlich
durchspielen.