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:
@@ -52,6 +52,29 @@ anspricht („Büro").
|
||||
(`192.168.177.x`) — steht da `192.168.65.x` oder `172.x`, sitzt der Satellit im
|
||||
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
|
||||
|
||||
ARIA hat drei Brain-Tools:
|
||||
|
||||
@@ -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')"
|
||||
Executable
+119
@@ -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
|
||||
Reference in New Issue
Block a user