feat(satellite): Dienst-Installer install.sh (Linux/macOS) + install.ps1 (Windows)

Richten den Satelliten als Autostart-Dienst ein (venv + requirements + Restart):
- install.sh: Linux → systemd-Unit (aria-satellite), macOS → launchd-Agent.
  `bash install.sh` / `bash install.sh uninstall`.
- install.ps1: Windows → Scheduled Task (S4U, AtStartup+AtLogOn, Restart, hidden),
  loggt nach satellite.log. Admin-Check. `-Uninstall` entfernt.
- WorkingDirectory = satellite/ (findet .env). README-Abschnitt ergaenzt.

install.sh bash -n OK; install.ps1 manuell geprueft (kein pwsh lokal).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-20 20:02:30 +02:00
co-authored by Claude Opus 4.8
parent 902316566e
commit 2811379684
3 changed files with 229 additions and 0 deletions
+23
View File
@@ -52,6 +52,29 @@ anspricht („Büro").
(`192.168.177.x`) — steht da `192.168.65.x` oder `172.x`, sitzt der Satellit im (`192.168.177.x`) — steht da `192.168.65.x` oder `172.x`, sitzt der Satellit im
falschen (Docker-)Netz. falschen (Docker-)Netz.
## Als Dienst installieren (Autostart, ohne Docker)
Legt automatisch ein `.venv` an, installiert die Requirements und richtet einen
Dienst ein, der bei Boot startet und bei Absturz neu hochkommt. `.env` vorher
anlegen.
**Linux (systemd) / macOS (launchd):**
```bash
cd satellite
bash install.sh # installieren + starten
bash install.sh uninstall # entfernen
```
- Linux-Logs: `journalctl -u aria-satellite -f`
- macOS-Logs: `tail -f satellite.log` (evtl. „Lokales Netzwerk"-Zugriff erlauben)
**Windows (Scheduled Task) — PowerShell als Administrator:**
```powershell
cd satellite
powershell -ExecutionPolicy Bypass -File install.ps1 # installieren + starten
powershell -ExecutionPolicy Bypass -File install.ps1 -Uninstall # entfernen
```
- Log: `Get-Content -Wait satellite.log`
## So nutzt ARIA es ## So nutzt ARIA es
ARIA hat drei Brain-Tools: ARIA hat drei Brain-Tools:
+87
View File
@@ -0,0 +1,87 @@
<#
ARIA Satellit — Dienst-Installer fuer Windows (Scheduled Task, Autostart + Restart).
powershell -ExecutionPolicy Bypass -File install.ps1 installiert + startet
powershell -ExecutionPolicy Bypass -File install.ps1 -Uninstall entfernt den Task
Legt ein venv (.venv) an, installiert requirements.txt und richtet einen
geplanten Task ein, der satellite.py aus DIESEM Ordner startet (findet die .env)
und bei Absturz/Neustart wieder hochkommt. Laeuft als aktueller Nutzer (S4U),
auch ohne Anmeldung. Als Administrator ausfuehren.
WICHTIG: Der Satellit muss im ECHTEN Ziel-LAN laufen (siehe README) — auf einer
Maschine, die physisch im Netz der Geraete haengt. Docker Desktop taugt nicht.
#>
param([switch]$Uninstall)
$ErrorActionPreference = "Stop"
$Dir = Split-Path -Parent $MyInvocation.MyCommand.Path
$Task = "ARIA-Satellite"
# ─── Uninstall ──────────────────────────────────────────────────────
if ($Uninstall) {
if (Get-ScheduledTask -TaskName $Task -ErrorAction SilentlyContinue) {
Unregister-ScheduledTask -TaskName $Task -Confirm:$false
Write-Host "Task '$Task' entfernt."
} else {
Write-Host "Kein Task '$Task' gefunden."
}
exit 0
}
# ─── Admin-Check ────────────────────────────────────────────────────
$isAdmin = ([Security.Principal.WindowsPrincipal] `
[Security.Principal.WindowsIdentity]::GetCurrent()
).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)
if (-not $isAdmin) {
Write-Warning "Bitte als Administrator ausfuehren (Rechtsklick PowerShell -> Als Administrator)."
exit 1
}
# ─── Python finden ──────────────────────────────────────────────────
$py = (Get-Command python -ErrorAction SilentlyContinue).Source
if (-not $py) { $py = (Get-Command python3 -ErrorAction SilentlyContinue).Source }
if (-not $py) { Write-Error "Python 3 nicht gefunden. Bitte von python.org installieren (mit 'Add to PATH')."; exit 1 }
# ─── venv + Abhaengigkeiten ─────────────────────────────────────────
if (-not (Test-Path "$Dir\.venv")) {
Write-Host "[install] Lege venv an ..."
& $py -m venv "$Dir\.venv"
}
$venvPy = "$Dir\.venv\Scripts\python.exe"
Write-Host "[install] Installiere Abhaengigkeiten ..."
& $venvPy -m pip install --upgrade pip | Out-Null
& $venvPy -m pip install -r "$Dir\requirements.txt"
if (-not (Test-Path "$Dir\.env")) {
Write-Warning "Keine .env gefunden - bitte anlegen: copy .env.example .env (RVS-Zugang + SATELLITE_LOCATION)"
}
# ─── Scheduled Task ─────────────────────────────────────────────────
Write-Host "[install] Richte geplanten Task '$Task' ein ..."
# Ueber cmd starten, damit stdout/stderr in satellite.log landen (der Task laeuft
# in Session 0 / S4U = kein sichtbares Fenster, python.exe ist hier ok).
$logfile = Join-Path $Dir "satellite.log"
$cmdArg = '/c ""{0}" satellite.py >> "{1}" 2>&1"' -f $venvPy, $logfile
$action = New-ScheduledTaskAction -Execute "cmd.exe" -Argument $cmdArg -WorkingDirectory $Dir
$trigger = @(
New-ScheduledTaskTrigger -AtStartup
New-ScheduledTaskTrigger -AtLogOn
)
# Laeuft als aktueller Nutzer, auch ohne Anmeldung (S4U), mit hoechsten Rechten.
$principal = New-ScheduledTaskPrincipal -UserId "$env:USERDOMAIN\$env:USERNAME" `
-LogonType S4U -RunLevel Highest
# Bei Absturz neu starten, unbegrenzte Laufzeit, startet nach falls Zeitpunkt verpasst, versteckt.
$settings = New-ScheduledTaskSettings -StartWhenAvailable -Hidden `
-RestartCount 999 -RestartInterval (New-TimeSpan -Minutes 1) `
-ExecutionTimeLimit (New-TimeSpan -Seconds 0) `
-MultipleInstances IgnoreNew
Register-ScheduledTask -TaskName $Task -Action $action -Trigger $trigger `
-Principal $principal -Settings $settings -Force | Out-Null
Start-ScheduledTask -TaskName $Task
Write-Host "OK Dienst laeuft."
Write-Host " Status: Get-ScheduledTask -TaskName $Task"
Write-Host " Stoppen: Stop-ScheduledTask -TaskName $Task"
Write-Host " Log: Get-Content -Wait '$logfile' (pruefen: primary_ip + '[scan] N Geraete')"
+119
View File
@@ -0,0 +1,119 @@
#!/usr/bin/env bash
#
# ARIA Satellit — Dienst-Installer fuer Linux (systemd) und macOS (launchd).
#
# bash install.sh installiert + startet den Dienst
# bash install.sh uninstall entfernt den Dienst
#
# Legt ein venv an (.venv), installiert requirements.txt und richtet einen
# Autostart-Dienst ein, der satellite.py aus DIESEM Ordner startet (damit die
# .env gefunden wird) und bei Absturz neu startet.
#
# WICHTIG: Der Satellit muss im ECHTEN Ziel-LAN laufen (siehe README) — auf einer
# Maschine, die physisch im Netz der Geraete haengt. Docker Desktop taugt nicht.
set -euo pipefail
DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
SVC="aria-satellite"
PLIST_LABEL="de.aria.satellite"
OS="$(uname -s)"
ACTION="${1:-install}"
# ─── Uninstall ──────────────────────────────────────────────────────
if [ "$ACTION" = "uninstall" ]; then
if [ "$OS" = "Linux" ]; then
SUDO=""; [ "$(id -u)" -ne 0 ] && SUDO="sudo"
$SUDO systemctl disable --now "$SVC" 2>/dev/null || true
$SUDO rm -f "/etc/systemd/system/$SVC.service"
$SUDO systemctl daemon-reload
echo "systemd-Dienst '$SVC' entfernt."
elif [ "$OS" = "Darwin" ]; then
PLIST="$HOME/Library/LaunchAgents/$PLIST_LABEL.plist"
launchctl unload "$PLIST" 2>/dev/null || true
rm -f "$PLIST"
echo "launchd-Agent '$PLIST_LABEL' entfernt."
fi
exit 0
fi
# ─── venv + Abhaengigkeiten ─────────────────────────────────────────
PY="$(command -v python3 || command -v python || true)"
[ -n "$PY" ] || { echo "Python 3 nicht gefunden. Bitte installieren."; exit 1; }
if [ ! -d "$DIR/.venv" ]; then
echo "[install] Lege venv an …"
if ! "$PY" -m venv "$DIR/.venv" 2>/dev/null; then
echo "venv-Erstellung fehlgeschlagen. Auf Debian/Ubuntu: sudo apt install python3-venv"
exit 1
fi
fi
VENV_PY="$DIR/.venv/bin/python"
echo "[install] Installiere Abhaengigkeiten …"
"$VENV_PY" -m pip install --upgrade pip >/dev/null
"$VENV_PY" -m pip install -r "$DIR/requirements.txt"
if [ ! -f "$DIR/.env" ]; then
echo "⚠ Keine .env gefunden — bitte anlegen: cp .env.example .env (RVS-Zugang + SATELLITE_LOCATION)"
fi
# ─── Dienst einrichten ──────────────────────────────────────────────
if [ "$OS" = "Linux" ]; then
RUN_USER="${SUDO_USER:-$(id -un)}"
UNIT="/etc/systemd/system/$SVC.service"
SUDO=""; [ "$(id -u)" -ne 0 ] && SUDO="sudo"
echo "[install] Schreibe systemd-Unit $UNIT (User=$RUN_USER) …"
$SUDO tee "$UNIT" >/dev/null <<EOF
[Unit]
Description=ARIA Satellit (Netz-Aussenposten)
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=$RUN_USER
WorkingDirectory=$DIR
ExecStart=$VENV_PY $DIR/satellite.py
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
$SUDO systemctl daemon-reload
$SUDO systemctl enable --now "$SVC"
echo "✅ Dienst laeuft."
echo " Status: $SUDO systemctl status $SVC"
echo " Logs: $SUDO journalctl -u $SVC -f"
elif [ "$OS" = "Darwin" ]; then
PLIST="$HOME/Library/LaunchAgents/$PLIST_LABEL.plist"
mkdir -p "$HOME/Library/LaunchAgents"
echo "[install] Schreibe launchd-Agent $PLIST"
cat > "$PLIST" <<EOF
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key><string>$PLIST_LABEL</string>
<key>ProgramArguments</key>
<array>
<string>$VENV_PY</string>
<string>$DIR/satellite.py</string>
</array>
<key>WorkingDirectory</key><string>$DIR</string>
<key>RunAtLoad</key><true/>
<key>KeepAlive</key><true/>
<key>StandardOutPath</key><string>$DIR/satellite.log</string>
<key>StandardErrorPath</key><string>$DIR/satellite.log</string>
</dict>
</plist>
EOF
launchctl unload "$PLIST" 2>/dev/null || true
launchctl load "$PLIST"
echo "✅ Agent geladen."
echo " Logs: tail -f $DIR/satellite.log"
echo " Hinweis: macOS fragt evtl. nach 'Lokales Netzwerk'-Zugriff — erlauben, sonst findet der Satellit keine Geraete."
else
echo "Unbekanntes OS: $OS (dieses Skript kann Linux/macOS; fuer Windows: install.ps1)"
exit 1
fi