Hub: der Dienst laeuft zentral statt auf dem Stream-PC

Zwei Dinge, die Reichweite bringen sollen, hingen bisher daran, dass jemand
vor seinem Rechner sitzt: der Discord-Rollen-Knopf und die Go-Live-
Ankuendigung. Beide brauchen nur Internet.

Der Schnitt verlaeuft entlang einer Frage: braucht die Aufgabe eine Datei
oder ein Programm, das nur auf dem Stream-PC existiert?

  Hub (LXC)                    Ingest (Abdus PC)
  ---------                    -----------------
  Chat, Zuschauerzahlen        OBS-Wiedergabepuffer
  Discord: Knopf und Go-Live   !clip, Rendern, Untertitel
  Overlay-Seiten fuer OBS

Beide schreiben in ihre eigene Datenbank. Eine gemeinsame waere eine
Netzwerkfreigabe fuer SQLite - der zuverlaessigste bekannte Weg zu einer
beschaedigten Datei.

Das kostet ADR-0005 seine Hauptbegruendung: "bindet nur auf 127.0.0.1" gilt
fuer den Hub nicht mehr. An die Stelle treten ein Passwort mit signiertem
Sitzungs-Cookie fuer alles, was ein Mensch bedient, und ein zufaelliger
Schluessel in der Adresse fuer die Browser-Sources. Der Schluessel ist kein
schoenes Verfahren - er steht in jedem OBS-Profil -, aber eine Browser-Source
kann kein Formular ausfuellen und keinen Login durchhalten.

`publicUrl` haengt der OAuth-Rueckruf daran. Twitch vergleicht die
Redirect-URI zeichengenau, und ein fehlender Schraegstrich sieht im Fehlertext
aus wie ein falsches Client-Secret.

Die Routen der Einrichtungsseite sind aus ingest/server.ts herausgeloest,
weil sie jetzt an zwei Servern haengen.

Begruendung und Konsequenzen in ADR-0008.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
ZeasyAlexandClaude Opus 5 committed 2026-09-18 00:12:58 +02:00
1 parent e18336c57f
commit 3b606e36fb
8 files changed
+985 -10

No files matched your search

+52
View File
@@ -0,0 +1,52 @@
#!/usr/bin/env bash
# Den Hub auf den LXC ausrollen.
#
# Warum ein Skript und kein `git pull` im Container: der Container hat keinen
# Zugang zum Repo, und er soll auch keinen bekommen. Ausgerollt wird, was
# hier im Arbeitsverzeichnis liegt - damit ist immer nachvollziehbar, welcher
# Stand laeuft, auch wenn gerade etwas nicht gepusht ist.
#
# Aufruf: scripts/deploy-hub.sh
# Umgebung (mit Vorgaben):
# PVE_HOST=192.168.2.20 Proxmox-Host
# CT=141 Container-ID
set -euo pipefail
PVE_HOST="${PVE_HOST:-192.168.2.20}"
CT="${CT:-141}"
REPO="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
STAND="$(date -u +%Y%m%d-%H%M%S)"
echo "Packe den Arbeitsstand ..."
cd "$REPO"
# node_modules bleibt draussen: das Projekt hat keine Laufzeit-Abhaengigkeiten,
# TypeScript wird nur fuer die Typpruefung gebraucht und nicht im Betrieb.
tar czf "/tmp/abdulive-${STAND}.tgz" \
--exclude='./node_modules' \
--exclude='./.git' \
--exclude='./dist' \
--exclude='./docs/handbuch/build' \
apps packages config scripts package.json tsconfig.json
echo "Schiebe nach ${PVE_HOST} -> CT ${CT} ..."
scp -q "/tmp/abdulive-${STAND}.tgz" "root@${PVE_HOST}:/tmp/abdulive.tgz"
ssh "root@${PVE_HOST}" "pct push ${CT} /tmp/abdulive.tgz /tmp/abdulive.tgz && rm -f /tmp/abdulive.tgz"
rm -f "/tmp/abdulive-${STAND}.tgz"
echo "Entpacke und starte neu ..."
ssh "root@${PVE_HOST}" "pct exec ${CT} -- bash -lc '
set -e
# In einen frischen Ordner entpacken und erst danach umhaengen: bricht das
# Entpacken ab, laeuft der alte Stand unveraendert weiter.
rm -rf /opt/abdulive.neu
mkdir -p /opt/abdulive.neu
tar xzf /tmp/abdulive.tgz -C /opt/abdulive.neu --no-same-owner
rm -f /tmp/abdulive.tgz
rm -rf /opt/abdulive.alt
[ -d /opt/abdulive ] && mv /opt/abdulive /opt/abdulive.alt || true
mv /opt/abdulive.neu /opt/abdulive
systemctl restart abdulive-hub 2>/dev/null || true
'"
echo "Fertig. Stand ${STAND}."
ssh "root@${PVE_HOST}" "pct exec ${CT} -- systemctl is-active abdulive-hub" || true