Files
abdulive/docs/05-setup.md
T
ZeasyAlexandClaude Opus 5 5f6301268a 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
2026-09-09 17:39:26 +02:00

157 lines
5.5 KiB
Markdown

# Setup
Eine native Windows-Anwendung. Node, ffmpeg, whisper.cpp und die Schriften
sind mitgeliefert — vorausgesetzt wird nur OBS.
Begruendung: [ADR-0007](decisions/ADR-0007-native-windows.md).
## Voraussetzungen
| Was | Version | Anmerkung |
|---|---|---|
| Windows | 10 oder 11, 64 Bit | |
| OBS Studio | 30+ mit obs-websocket v5 | derselbe Rechner |
Mehr nicht. Kein Docker, kein WSL2, kein Compiler, kein Git.
## Installieren
Das Paket herunterladen, entpacken, darin `install.ps1` ausfuehren:
```powershell
Expand-Archive .\abdulive-0.5.0-win-x64.zip -DestinationPath .\abdulive
.\abdulive\install.ps1
```
Liegt das Paket an einer Adresse **ohne** Anmeldung, holt der Installer es
selbst:
```powershell
.\install.ps1 -Quelle https://.../abdulive
```
> Ein `irm … | iex`-Einzeiler funktioniert mit `git.zeasy.dev` nicht. Die
> Instanz verlangt fuer alles eine Anmeldung und antwortet mit einer Umleitung
> auf `/user/login`; `iex` fuehrt dann die Anmeldeseite als PowerShell aus.
> Wo die Pakete liegen sollen, ist noch zu entscheiden.
Der Installer laeuft **ohne Administratorrechte**:
| Was | Wohin |
|---|---|
| Programm | `%LOCALAPPDATA%\Programs\abdulive` |
| Daten, Datenbank, Clips | `%LOCALAPPDATA%\abdulive` |
| Autostart | Aufgabe `abdulive`, bei der Anmeldung |
| Update-Pruefung | Aufgabe `abdulive-update`, taeglich 05:00 |
Beim ersten Start warnt Windows SmartScreen vor einem unbekannten Herausgeber —
das Paket ist nicht signiert. Einmal auf *Weitere Informationen* → *Trotzdem
ausfuehren*.
## Twitch-Apps anlegen
Zwei Anwendungen unter https://dev.twitch.tv/console/apps:
1. `abdulive-toolkit` — OAuth Redirect `http://localhost:4792/callback`
2. `abdulive-bot` — gleicher Redirect
Client-ID und Client-Secret **nicht** in eine Datei eintragen, sondern später
im Einrichtungs-Assistenten einfügen (siehe unten). Begründung:
[ADR-0005](decisions/ADR-0005-zugangsdaten.md).
## OBS vorbereiten
1. **obs-websocket aktivieren:** Werkzeuge → WebSocket-Servereinstellungen →
Server aktivieren, Port 4455, Passwort setzen — eingetragen wird es später
im Einrichtungs-Assistenten.
2. **Wiedergabepuffer aktivieren:** Einstellungen → Ausgabe → Wiedergabepuffer,
90 Sekunden. Den Zielordner merken und in `.env` als `OBS_REPLAY_DIR`
eintragen — mit Forward-Slashes, z. B. `C:/Users/abdu/Videos/replay`.
3. **Hotkey setzen:** Einstellungen → Hotkeys → „Wiedergabepuffer speichern".
Das ist der Clip-Knopf. Ein globaler Windows-Hotkey wird bewusst *nicht*
gebaut — aus einem Container ist er nicht abfangbar, und OBS meldet den
gespeicherten Puffer ohnehin über WebSocket.
4. **Getrennte Audiospuren** (bereits eingerichtet): Mikrofon auf Spur 2,
Spielton auf Spur 3, Mischung auf Spur 1. Die Untertitel werden aus Spur 2
erzeugt - das ist bei lauten Spielen der Unterschied zwischen brauchbarem
und unbrauchbarem Transkript. Einstellungen -> Ausgabe -> Aufnahme ->
Audiospuren, und im Audiomixer je Quelle die Spurzuordnung pruefen.
5. **Browser-Sources** (erst ab Meilenstein M3 relevant): „Browser-Quelle beim
Szenenwechsel neu laden" **aus**, sonst brechen laufende Effekte ab.
## Erste Einrichtung
```powershell
abdulive check-env # ffmpeg, whisper, Schriften, Verzeichnisse, Layout
abdulive fetch-model # Sprachmodell, ca. 465 MB
Start-ScheduledTask -TaskName abdulive
```
Dann **http://localhost:4792/setup** oeffnen: Client-ID und Secret der beiden
Twitch-Apps eintragen und je einmal auf „Mit Twitch verbinden" klicken.
## Layout einmessen
```powershell
abdulive calibrate
```
Legt einen Frame als PNG unter `%LOCALAPPDATA%\abdulive\clips\_calibration`
ab und rendert die 9:16-Vorschau dazu. Anleitung: [`obs-layout.md`](obs-layout.md).
Welche OBS-Quelle im Ausschnitt landet — etwa fremde Untertitel:
```powershell
abdulive sources
```
## Betrieb
```powershell
Start-ScheduledTask -TaskName abdulive # startet
Stop-ScheduledTask -TaskName abdulive # stoppt
Get-Content "$env:LOCALAPPDATA\abdulive\logs\abdulive.log" -Wait -Tail 40
```
Sichtungsseite: http://localhost:4792
## Aktualisieren
```powershell
abdulive update
```
Prueft das Manifest, laedt das Paket, vergleicht die SHA256 und legt es
bereit. Die Adresse steht in `config.yaml` unter `update.url` und hat
**keine Vorgabe** — ohne Eintrag sagt der Befehl das auch. Liegt die Ablage
hinter einer Anmeldung, gehoert ein Lese-Token in den verschluesselten
Speicher (Einrichtungsseite), nicht in die `config.yaml`. **Eingespielt wird es beim naechsten Start** — waehrend eines Streams
wird nichts ausgetauscht. Sofort uebernehmen:
```powershell
Stop-ScheduledTask -TaskName abdulive; Start-ScheduledTask -TaskName abdulive
```
Die Aufgabe `abdulive-update` macht die Pruefung taeglich um 05:00 von selbst.
## Backup
```powershell
.\scripts\backup.ps1
```
Kopiert die Datenbank per `VACUUM INTO` aus `%LOCALAPPDATA%\abdulive\db`
nach `backup\` und haelt 30 Generationen. `VACUUM INTO` und nicht einfach
kopieren: die Datei wird im laufenden Betrieb gesichert, und ein Kopieren
waehrend eines Schreibvorgangs ergaebe eine unbrauchbare Sicherung.
Die Datenbank liegt seit [ADR-0007](decisions/ADR-0007-native-windows.md)
in einem gewoehnlichen Windows-Ordner. Der Grund fuer das fruehere
Docker-Volume - unzuverlaessige Dateisperren ueber die WSL2-Bruecke - ist
mit dem Container weggefallen.
## Was nicht ins Repo gehört
`.env`, `config/config.yaml`, alles unter `data/`. Steht in `.gitignore`.
Die Datenbank enthält personenbezogene Daten (Chatverläufe, Notizen zu
Zuschauern) und darf nicht committet oder geteilt werden.