Deze repo ondersteunt “remote over SSH” door een enkele Gateway (de master) draaiend te houden op een toegewezen host (desktop/server) en clients ermee te verbinden.Documentation Index
Fetch the complete documentation index at: https://docs.openclaw.ai/llms.txt
Use this file to discover all available pages before exploring further.
- Voor operators (jij / de macOS-app): SSH-tunneling is de universele fallback.
- Voor nodes (iOS/Android en toekomstige apparaten): maak verbinding met de Gateway WebSocket (LAN/tailnet of SSH-tunnel waar nodig).
Het kernidee
- De Gateway WebSocket bindt aan loopback op je geconfigureerde poort (standaard 18789).
- Voor gebruik op afstand forward je die loopback-poort over SSH (of gebruik je een tailnet/VPN en tunnel je minder).
Veelvoorkomende VPN- en tailnet-set-ups
Zie de Gateway-host als de plek waar de agent leeft. Deze beheert sessies, auth-profielen, kanalen en status. Je laptop, desktop en nodes verbinden met die host.Altijd actieve Gateway in je tailnet
Draai de Gateway op een persistente host (VPS of thuisserver) en bereik deze via Tailscale of SSH.- Beste UX: houd
gateway.bind: "loopback"aan en gebruik Tailscale Serve voor de Control UI. - Fallback: houd loopback aan plus een SSH-tunnel vanaf elke machine die toegang nodig heeft.
- Voorbeelden: exe.dev (eenvoudige VM) of Hetzner (productie-VPS).
Thuisdesktop draait de Gateway
De laptop draait de agent niet. Hij verbindt op afstand:- Gebruik de modus Remote over SSH van de macOS-app (Instellingen → Algemeen → OpenClaw draait).
- De app opent en beheert de tunnel, zodat WebChat en health checks gewoon werken.
Laptop draait de Gateway
Houd de Gateway lokaal, maar stel deze veilig beschikbaar:- SSH-tunnel naar de laptop vanaf andere machines, of
- Tailscale Serve voor de Control UI en houd de Gateway alleen op loopback.
Commandostroom (wat draait waar)
Één gateway-service beheert status + kanalen. Nodes zijn randapparaten. Voorbeeldstroom (Telegram → node):- Telegram-bericht komt aan bij de Gateway.
- Gateway draait de agent en beslist of een node-tool moet worden aangeroepen.
- Gateway roept de node aan via de Gateway WebSocket (
node.*RPC). - Node geeft het resultaat terug; Gateway antwoordt weer naar Telegram.
- Nodes draaien de gateway-service niet. Er mag slechts één gateway per host draaien, tenzij je bewust geïsoleerde profielen draait (zie Meerdere gateways).
- “node-modus” in de macOS-app is gewoon een node-client via de Gateway WebSocket.
SSH-tunnel (CLI + tools)
Maak een lokale tunnel naar de externe Gateway WS:openclaw healthenopenclaw status --deepbereiken nu de externe gateway viaws://127.0.0.1:18789.openclaw gateway status,openclaw gateway health,openclaw gateway probeenopenclaw gateway callkunnen de geforwarde URL ook targeten via--urlwanneer nodig.
Vervang
18789 door je geconfigureerde gateway.port (of --port of OPENCLAW_GATEWAY_PORT).Externe standaardinstellingen voor de CLI
Je kunt een extern doel persistent maken zodat CLI-commando’s dit standaard gebruiken:ws://127.0.0.1:18789 en open je eerst de SSH-tunnel.
In het SSH-tunneltransport van de macOS-app horen gevonden gateway-hostnamen in
gateway.remote.sshTarget; gateway.remote.url blijft de lokale tunnel-URL.
Credential-prioriteit
Gateway-credentialresolutie volgt één gedeeld contract over call/probe/status-paden en Discord exec-approval-monitoring. Node-host gebruikt hetzelfde basiscontract met één uitzondering voor lokale modus (het negeert bewustgateway.remote.*):
- Expliciete credentials (
--token,--passwordof toolgatewayToken) winnen altijd op call-paden die expliciete auth accepteren. - Veiligheid bij URL-overschrijvingen:
- CLI-URL-overschrijvingen (
--url) hergebruiken nooit impliciete config/env-credentials. - Env-URL-overschrijvingen (
OPENCLAW_GATEWAY_URL) mogen alleen env-credentials gebruiken (OPENCLAW_GATEWAY_TOKEN/OPENCLAW_GATEWAY_PASSWORD).
- CLI-URL-overschrijvingen (
- Standaarden voor lokale modus:
- token:
OPENCLAW_GATEWAY_TOKEN->gateway.auth.token->gateway.remote.token(remote fallback geldt alleen wanneer lokale auth-tokeninvoer niet is ingesteld) - password:
OPENCLAW_GATEWAY_PASSWORD->gateway.auth.password->gateway.remote.password(remote fallback geldt alleen wanneer lokale auth-wachtwoordinvoer niet is ingesteld)
- token:
- Standaarden voor remote-modus:
- token:
gateway.remote.token->OPENCLAW_GATEWAY_TOKEN->gateway.auth.token - password:
OPENCLAW_GATEWAY_PASSWORD->gateway.remote.password->gateway.auth.password
- token:
- Uitzondering voor lokale modus van Node-host:
gateway.remote.token/gateway.remote.passwordworden genegeerd. - Tokenchecks voor remote probe/status zijn standaard strikt: ze gebruiken alleen
gateway.remote.token(geen fallback naar lokaal token) wanneer remote-modus wordt getarget. - Gateway-env-overschrijvingen gebruiken alleen
OPENCLAW_GATEWAY_*.
Chat-UI over SSH
WebChat gebruikt geen aparte HTTP-poort meer. De SwiftUI-chat-UI verbindt rechtstreeks met de Gateway WebSocket.- Forward
18789over SSH (zie hierboven) en verbind clients vervolgens metws://127.0.0.1:18789. - Op macOS heeft de modus “Remote over SSH” van de app de voorkeur; die beheert de tunnel automatisch.
macOS-app Remote over SSH
De macOS-menubalkapp kan dezelfde set-up end-to-end aansturen (statuschecks op afstand, WebChat en Voice Wake-forwarding). Runbook: macOS-toegang op afstand.Beveiligingsregels (remote/VPN)
Korte versie: houd de Gateway alleen op loopback tenzij je zeker weet dat je een bind nodig hebt.- Loopback + SSH/Tailscale Serve is de veiligste standaard (geen publieke blootstelling).
- Plaintext
ws://is standaard alleen loopback. Voor vertrouwde privénetwerken stel jeOPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1in op het clientproces als noodoptie. Er is geenopenclaw.json-equivalent; dit moet de procesomgeving zijn voor de client die de WebSocket-verbinding maakt. - Niet-loopback binds (
lan/tailnet/custom, ofautowanneer loopback niet beschikbaar is) moeten gateway-auth gebruiken: token, wachtwoord of een identity-aware reverse proxy metgateway.auth.mode: "trusted-proxy". gateway.remote.token/.passwordzijn bronnen voor clientcredentials. Ze configureren op zichzelf geen server-auth.- Lokale call-paden kunnen
gateway.remote.*alleen als fallback gebruiken wanneergateway.auth.*niet is ingesteld. - Als
gateway.auth.token/gateway.auth.passwordexpliciet via SecretRef is geconfigureerd en niet kan worden opgelost, faalt de resolutie gesloten (geen remote fallback die dit maskeert). gateway.remote.tlsFingerprintpint het externe TLS-certificaat bij gebruik vanwss://.- Tailscale Serve kan Control UI/WebSocket-verkeer authenticeren via identity
headers wanneer
gateway.auth.allowTailscale: true; HTTP API-eindpunten gebruiken die Tailscale-headerauth niet en volgen in plaats daarvan de normale HTTP auth-modus van de gateway. Deze tokenloze stroom gaat ervan uit dat de gateway-host vertrouwd is. Zet dit opfalseals je overal shared-secret-auth wilt. - Trusted-proxy-auth verwacht standaard niet-loopback identity-aware proxy-set-ups.
Same-host loopback reverse proxies vereisen expliciet
gateway.auth.trustedProxy.allowLoopback = true. - Behandel browserbediening als operatortoegang: alleen tailnet + bewuste node-koppeling.
macOS: persistente SSH-tunnel via LaunchAgent
Voor macOS-clients die met een externe gateway verbinden, gebruikt de eenvoudigste persistente set-up een SSH-LocalForward-configuratievermelding plus een LaunchAgent om de tunnel actief te houden bij herstarts en crashes.
Stap 1: SSH-config toevoegen
Bewerk~/.ssh/config:
<REMOTE_IP> en <REMOTE_USER> door je waarden.
Stap 2: SSH-sleutel kopiëren (eenmalig)
Stap 3: gateway-token configureren
Sla het token op in config zodat het behouden blijft na herstarts:Stap 4: LaunchAgent maken
Sla dit op als~/Library/LaunchAgents/ai.openclaw.ssh-tunnel.plist:
Stap 5: LaunchAgent laden
Als je nog een oude
com.openclaw.ssh-tunnel LaunchAgent uit een oudere set-up hebt, unload en verwijder die dan.Probleemoplossing
Controleer of de tunnel draait:| Config-vermelding | Wat deze doet |
|---|---|
LocalForward 18789 127.0.0.1:18789 | Forwardt lokale poort 18789 naar externe poort 18789 |
ssh -N | SSH zonder externe commando’s uit te voeren (alleen port-forwarding) |
KeepAlive | Herstart de tunnel automatisch als deze crasht |
RunAtLoad | Start de tunnel wanneer de LaunchAgent bij inloggen laadt |