Files
ARIA-AGENT/satellite
duffyduckandClaude Opus 5 cfd17b200a feat(satellite): Port-Tunnel ins fremde Netz + Geraete-Namen
ARIA sitzt woanders und kommt nicht ins Buero-Netz. Der Satellit kann beides:
er sieht das LAN und haelt eine ausgehende Verbindung zum RVS. Also reicht er
eine TCP-Verbindung durch — wie der VNC-Tunnel, nur fuer beliebige Ports.
Damit erreicht ARIA einen FreeCAD-MCP, eine Web-App, ein NAS-Interface.

Entscheidend fuer die Brauchbarkeit: die Bridge macht daraus einen GANZ
NORMALEN lokalen Port (aria-bridge:19000...). Dadurch funktioniert alles, was
sowieso TCP spricht — MCP-Client, curl, Browser — ohne Sonder-API. Jede
eingehende Verbindung bekommt einen eigenen Tunnel, parallele Verbindungen
sind also kein Problem (ein Browser oeffnet gern sechs).

Geraete-Namen: "duffy-desktop" ist ansprechbar, "192.168.1.47" nicht. Stefan
kann jedem gefundenen Geraet einen Namen geben, ARIA adressiert danach.
Schluessel ist die MAC, nicht die IP — per DHCP wandert die IP, die MAC bleibt.

Absicherung, weil das ein Weg in ein fremdes Netz ist:
- TUNNEL_ENABLED default AUS, pro Satellit.
- Ohne TUNNEL_ALLOW nur Ziele, die bei der Suche GEFUNDEN wurden. Der Tunnel
  kann damit nichts ansteuern, was nicht ohnehin im LAN sichtbar ist — und
  nichts im Internet.
- Obergrenze gleichzeitiger Tunnel + Reaper fuer ungenutzte (sonst bleibt eine
  vergessene Verbindung offen, bis der Satellit neu startet).
- Faehigkeit 'tunnel' wird im sat_hello gemeldet, damit Diagnostic und ARIA
  sehen, ob der Satellit das ueberhaupt erlaubt.

Neue RVS-Typen eingetragen (sat_tunnel_*, sat_name_*) — ohne das verwirft die
Allow-List sie still, und nichts funktioniert ohne Fehlermeldung.

16 Pruefungen gegen BEIDE echten Implementierungen (nur der RVS dazwischen ist
kurzgeschlossen): Namensaufloesung, Freigabe-Regeln, fremder Satellit
ignoriert, abgeschaltet blockt, echter Byte-Durchlauf (PONG:HALLO), unbekanntes
Ziel schliesst sauber statt zu haengen, Liste/Schliessen/Doppel-Schliessen.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-10-04 18:35:40 +02:00
..

ARIA Satellit 🛰️

Ein eigenständiger Außenposten-Container für ein fremdes Netz (Büro, Werkstatt, Ferienwohnung …). Er verbindet sich als RVS-Client in Stefans Raum und gibt ARIA Augen und Hände in genau diesem Netz — ohne dass der Haupt-Stack dort stehen muss.

  • Augen (Info): entdeckt Geräte via mDNS/Zeroconf (Chromecast, AirPlay, Sonos, Drucker, NAS …), SSDP/UPnP + DIAL (Smart-TVs, Fire TV) und der ARP-Tabelle (rohe Hosts). Meldet ARIA ein Live-Inventar.
  • Hände (Steuerung): DIAL-App-Launch (z.B. YouTube-Video auf dem Fire TV), Wake-on-LAN, generisches HTTP. Nur wenn freigeschaltet (siehe Sicherheit).

⚠️ Wichtig: der Satellit MUSS im echten Ziel-LAN laufen

Discovery (mDNS/SSDP-Multicast + ARP) funktioniert nur, wenn der Prozess tatsächlich im selben LAN wie die Geräte hängt — z.B. 192.168.0.0/24, wo der Fire TV steht.

Docker Desktop (Mac/Windows) geht NICHT. Dort ist network_mode: host das Netz der Docker-Linux-VM (NAT, 192.168.65.x / 172.x), nicht dein echtes LAN. Der Satellit sieht dann nur Docker-Container statt der echten Geräte. (Der Satellit erkennt das selbst und meldet eine ⚠-Warnung im Diagnostic + Log.)

Richtig deployen — zwei Wege:

A) Linux-Box im Ziel-LAN mit Docker Engine (empfohlen, z.B. Raspberry Pi / NUC im Büro):

cd satellite
cp .env.example .env            # RVS-Zugang + SATELLITE_LOCATION
docker compose up -d --build
docker compose logs -f          # "Netz: primary_ip=192.168.0.x" + "[scan] N Geraete"

network_mode: host (schon gesetzt) gibt hier echtes LAN + Multicast.

Fehler KeyError: 'ContainerConfig' beim Neubauen? Das ist ein Bug im alten docker-compose 1.29.2 (Python-Version), nicht im Satelliten: Beim Ersetzen eines bestehenden Containers mit Volume liest es ein Feld aus dem Image, das neuere Docker-Versionen nicht mehr schreiben. Zwei Fixes:

docker compose up -d --build                 # v2 (mit LEERZEICHEN) — falls vorhanden
# oder mit der alten Version: alten Container erst weg, dann neu anlegen
docker-compose rm -sf satellite && docker-compose up -d --build

Der ./data-Ordner (Credentials, ADB-Schlüssel, APK-Cache) bleibt dabei erhalten — er ist ein Bind-Mount, kein Container-Volume.

B) Nativ als Python-Prozess (für Mac/Windows-Test oder ohne Docker) — läuft direkt auf einer Maschine im Ziel-LAN. Das Script lädt die .env selbst (muss im satellite/-Ordner liegen):

cd satellite
cp .env.example .env      # RVS-Zugang + SATELLITE_LOCATION eintragen
pip install -r requirements.txt
python satellite.py       # liest .env automatisch

(Echte Umgebungsvariablen haben Vorrang — export RVS_TOKEN=... überschreibt die .env, falls du das lieber magst.)

RVS_HOST/PORT/TLS/TOKEN identisch zum Haupt-Stack (gleicher Raum, damit ARIA 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=<interne-ip> + RVS_SNI=<zert-name> (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.

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):

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:

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:

  • satellite_list — welche Netze/Satelliten sind online + was können sie.
  • satellite_devices(satellite) — Inventar eines Netzes.
  • satellite_command(satellite, device, action, params) — Aktion ausführen.

Beispiel „YouTube-Video auf dem Büro-Stick":

satellite_command(satellite="Büro", device="Fire TV",
                  action="dial.launch", params={"app":"YouTube","v":"<videoId>"})

Sicherheit

Der Satellit scannt ein Netz und ist über einen Cloud-Relay erreichbar — deshalb:

  • Reagiert nur auf den eigenen RVS-Raum (Token).
  • CONTROL_ENABLED=false = reiner Info-Satellit (steuert nichts). Standard-sicher.
  • Bei true: nur Aktionen aus CONTROL_ALLOWLIST, alles andere wird abgelehnt.
  • Jede ausgeführte Aktion wird geloggt.
  • Keine offenen Ports — reiner Client.

Empfehlung: in vertrauenswürdigen Netzen CONTROL_ENABLED=true mit enger Allowlist; sonst false und nur beobachten.