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>
53 lines
2.0 KiB
Bash
53 lines
2.0 KiB
Bash
#!/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
|