From d4e3a73e89b12cdaf4b787a6729a292210f3562b Mon Sep 17 00:00:00 2001 From: duffyduck Date: Thu, 24 Sep 2026 17:27:07 +0200 Subject: [PATCH] feat(host-agent): systemd-Service-Installer + SNI-Doku ueberall install-service.sh: installiert Binary (/usr/local/bin) + .env (/etc/aria-host- agent/.env, 0600) + systemd-Unit und macht enable --now. .env-Pfad als Argument ODER ohne Argument ein ncurses-Dateidialog (dialog --fselect, bietet Installation von dialog an). Findet die Binary unter dist/ bzw. ./ oder als 2. Argument. Doku aktualisiert (RVS_SNI fuer RZ-interne Clients + Installer): - host-agent/README: Installer-Abschnitt + TLS/SNI-Abschnitt. - README (zentral): Installer + SNI im Host-Agent-Abschnitt (Verweis auf Satellit/Compute-Nodes). - satellite/README + xtts/README: RVS_SNI-Hinweis fuer Boxen/Satelliten im RVS-Netz. Co-Authored-By: Claude Opus 4.8 --- README.md | 19 ++++++++- host-agent/README.md | 37 ++++++++++++++++- host-agent/install-service.sh | 75 +++++++++++++++++++++++++++++++++++ satellite/README.md | 5 +++ xtts/README.md | 4 ++ 5 files changed, 138 insertions(+), 2 deletions(-) create mode 100755 host-agent/install-service.sh diff --git a/README.md b/README.md index 536610b..01b7cfd 100644 --- a/README.md +++ b/README.md @@ -970,7 +970,24 @@ cp .env.example .env # RVS-Zugang + CONTROL_ENABLED=true eintragen chmod +x aria-host-agent && ./aria-host-agent ``` -Oder als Dienst: `host-agent/aria-host-agent.service` (systemd). +**Als systemd-Dienst** (Dauerbetrieb) — der Installer kopiert Binary + `.env` +an ihre Plätze und richtet den Dienst ein: + +```bash +sudo ./install-service.sh /pfad/zur/.env # .env-Pfad direkt +sudo ./install-service.sh # oder: ncurses-Dateidialog (dialog) +``` + +→ Binary nach `/usr/local/bin`, `.env` nach `/etc/aria-host-agent/.env` (0600), +Unit installiert + `enable --now`. Danach `journalctl -u aria-host-agent -f`. + +### TLS / SNI — Agent im selben Netz wie der RVS + +Verbindet der Agent direkt auf die **interne RVS-IP** (statt über den externen +Hostnamen per NAT-Hairpin), scheitert TLS sonst am fehlenden Cert für die IP +(`tlsv1 alert internal error`). Dann in der `.env`: `RVS_HOST=` + +`RVS_SNI=` (z.B. `example.com`). Gilt genauso für Satelliten +und Compute-Nodes im RZ-Netz (`RVS_SNI` in deren `.env`). ### sudo diff --git a/host-agent/README.md b/host-agent/README.md index 63e9edc..3404747 100644 --- a/host-agent/README.md +++ b/host-agent/README.md @@ -53,7 +53,42 @@ Overlay stapeln. Zwei Auswege: 1. `dist/aria-host-agent` auf den Ziel-Rechner kopieren. 2. `.env.example` → `.env` daneben, RVS-Zugang + `CONTROL_ENABLED=true` eintragen. 3. Starten: `chmod +x aria-host-agent && ./aria-host-agent` - — oder als Dienst: siehe `aria-host-agent.service`. + +### Als systemd-Dienst (empfohlen für Dauerbetrieb) + +Der Installer kopiert Binary + `.env` an ihre Plätze und richtet den Dienst ein: + +```bash +# .env-Pfad direkt übergeben: +sudo ./install-service.sh /pfad/zur/.env + +# ODER ohne Argument -> ncurses-Dateidialog (dialog) zum Auswählen der .env: +sudo ./install-service.sh +``` + +Er legt ab: +- Binary → `/usr/local/bin/aria-host-agent` +- `.env` → `/etc/aria-host-agent/.env` (Rechte `0600`, enthält Token/Passwörter) +- Unit → `/etc/systemd/system/aria-host-agent.service`, dann `enable --now`. + +Danach: `systemctl status aria-host-agent` · `journalctl -u aria-host-agent -f`. +Die Binary sucht er unter `dist/aria-host-agent` bzw. `./aria-host-agent` (oder +2. Argument). Braucht `dialog` für den Dateibrowser (bietet die Installation an). + +## TLS / SNI — Agent im selben Netz wie der RVS + +Steht der Rechner im **selben Netz wie der RVS** (z.B. Rechenzentrum) und soll +direkt auf dessen **interne IP** verbinden (kein NAT-Hairpin über den externen +Hostnamen), scheitert der TLS-Handshake sonst an `tlsv1 alert internal error` +(Caddy hat kein Zertifikat für die IP). Lösung — in der `.env`: + +``` +RVS_HOST=10.0.0.2 # interne RVS-IP +RVS_SNI=example.com # Name, für den das Caddy-Zert gilt +``` + +Der Agent verbindet dann auf die IP, präsentiert aber den Namen im TLS-SNI. +Zuhause / im Normalfall `RVS_SNI` leer lassen und den Hostnamen als `RVS_HOST`. ## sudo diff --git a/host-agent/install-service.sh b/host-agent/install-service.sh new file mode 100755 index 0000000..ff96c95 --- /dev/null +++ b/host-agent/install-service.sh @@ -0,0 +1,75 @@ +#!/usr/bin/env bash +# ARIA Host-Agent — Service-Installer (systemd). +# +# Installiert die Binary nach /usr/local/bin, die .env nach /etc/aria-host-agent +# und richtet den systemd-Dienst ein (enable + start). +# +# Nutzung: +# sudo ./install-service.sh /pfad/zur/.env # .env-Pfad direkt uebergeben +# sudo ./install-service.sh # ncurses-Dateidialog (dialog) +# +# Die Binary wird unter ./dist/aria-host-agent oder ./aria-host-agent erwartet +# (vorher ./build.sh oder ./build-native.sh ausfuehren), oder als 2. Argument. +set -euo pipefail + +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +BIN_DST="/usr/local/bin/aria-host-agent" +ETC_DIR="/etc/aria-host-agent" +UNIT_DST="/etc/systemd/system/aria-host-agent.service" + +die() { echo "FEHLER: $*" >&2; exit 1; } + +[ "$(id -u)" -eq 0 ] || die "Bitte mit sudo/root ausfuehren: sudo $0 $*" + +# ── Binary finden (Arg 2 > dist/ > ./) ────────────────────────────── +BIN_SRC="${2:-}" +if [ -z "$BIN_SRC" ]; then + if [ -x "$SCRIPT_DIR/dist/aria-host-agent" ]; then BIN_SRC="$SCRIPT_DIR/dist/aria-host-agent" + elif [ -x "$SCRIPT_DIR/aria-host-agent" ]; then BIN_SRC="$SCRIPT_DIR/aria-host-agent" + fi +fi +[ -n "$BIN_SRC" ] && [ -f "$BIN_SRC" ] || die "Binary nicht gefunden. Erst bauen (./build.sh) oder als 2. Argument uebergeben." + +# ── .env bestimmen: Arg 1, sonst ncurses-Dateidialog ──────────────── +ENV_SRC="${1:-}" +if [ -z "$ENV_SRC" ]; then + if ! command -v dialog >/dev/null 2>&1; then + echo "Kein .env-Pfad uebergeben und 'dialog' ist nicht installiert." + read -r -p "dialog jetzt installieren (apt)? [j/N] " a + case "$a" in + j|J|y|Y) (apt-get update && apt-get install -y dialog) || die "dialog-Installation fehlgeschlagen — .env-Pfad bitte als Argument uebergeben." ;; + *) die "Ohne dialog bitte den .env-Pfad als Argument uebergeben: sudo $0 /pfad/zur/.env" ;; + esac + fi + # dialog --fselect: Dateibrowser; --stdout gibt die Auswahl auf stdout. + START_DIR="${SUDO_USER:+/home/$SUDO_USER/}" + [ -d "$START_DIR" ] || START_DIR="$SCRIPT_DIR/" + ENV_SRC="$(dialog --stdout --title 'ARIA Host-Agent — .env auswaehlen' \ + --fselect "$START_DIR" 14 72)" || true + clear + [ -n "$ENV_SRC" ] || die "Abgebrochen — keine .env ausgewaehlt." +fi +[ -f "$ENV_SRC" ] || die ".env nicht gefunden: $ENV_SRC" + +echo "Binary : $BIN_SRC" +echo ".env : $ENV_SRC" + +# ── Installieren ──────────────────────────────────────────────────── +install -m 0755 "$BIN_SRC" "$BIN_DST" +install -d -m 0755 "$ETC_DIR" +install -m 0600 "$ENV_SRC" "$ETC_DIR/.env" # 0600: enthaelt Token/Passwoerter + +if [ -f "$SCRIPT_DIR/aria-host-agent.service" ]; then + install -m 0644 "$SCRIPT_DIR/aria-host-agent.service" "$UNIT_DST" +else + die "aria-host-agent.service nicht gefunden neben dem Installer." +fi + +systemctl daemon-reload +systemctl enable --now aria-host-agent + +echo +echo "✓ Installiert & gestartet." +echo " Status: systemctl status aria-host-agent" +echo " Log: journalctl -u aria-host-agent -f" +echo " .env: $ETC_DIR/.env (aendern -> systemctl restart aria-host-agent)" diff --git a/satellite/README.md b/satellite/README.md index be34474..2d01166 100644 --- a/satellite/README.md +++ b/satellite/README.md @@ -48,6 +48,11 @@ python satellite.py # liest .env automatisch den Satelliten erreicht). `SATELLITE_LOCATION` ist der Name, über den ARIA das Netz anspricht („Büro"). +**Satellit im selben Netz wie der RVS** (z.B. Rechenzentrum, direkt auf die +interne IP statt NAT-Hairpin): `RVS_HOST=` + **`RVS_SNI=`** +(der Name, für den das Caddy-Zertifikat gilt). Ohne das scheitert TLS an +`tlsv1 alert internal error`. Zuhause / normal: `RVS_SNI` leer lassen. + **Kontrolle:** im Log/Diagnostic muss `primary_ip` im Ziel-LAN liegen (`192.168.0.x`) — steht da `192.168.65.x` oder `172.x`, sitzt der Satellit im falschen (Docker-)Netz. diff --git a/xtts/README.md b/xtts/README.md index d14969d..b62685b 100644 --- a/xtts/README.md +++ b/xtts/README.md @@ -58,6 +58,10 @@ GPU-Test + Stack-Start. 24-GB-Karte: `docker compose stop whisper-bridge && docker compose --profile voxtral up -d --build`. - **Erster Start lädt Modelle** (mehrere GB via HuggingFace nach `xtts/hf-cache` + `xtts/models`) — genug Platz (1 TB NVMe ✓) und etwas Geduld. +- **Box im selben Netz wie der RVS** (z.B. Rechenzentrum, direkt auf die interne + IP statt NAT-Hairpin): in `xtts/.env` `RVS_HOST=` + **`RVS_SNI=`** + (Name, für den das Caddy-Zert gilt). Ohne das scheitert TLS an `tlsv1 alert + internal error`. Zuhause / normal: `RVS_SNI` leer lassen. ## Verifizieren