Deze repo ondersteunt “remote over SSH” door één Gateway (de master) actief te houden op een dedicated host (desktop/server) en clients ermee te verbinden.Documentation Index
Fetch the complete documentation index at: https://docs2.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): verbind met de Gateway WebSocket (LAN/tailnet of SSH-tunnel indien nodig).
Het kernidee
- De Gateway WebSocket bindt aan loopback op je geconfigureerde poort (standaard 18789).
- Voor gebruik op afstand forward je die loopback-poort via SSH (of gebruik je een tailnet/VPN en tunnel je minder).
Veelvoorkomende VPN- en tailnet-setups
Zie de Gateway-host als de plek waar de agent leeft. Die beheert sessies, auth-profielen, kanalen en state. Je laptop, desktop en nodes verbinden met die host.Always-on Gateway in je tailnet
Draai de Gateway op een persistente host (VPS of thuisserver) en bereik die 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. Die verbindt op afstand:- Gebruik de Remote over SSH-modus van de macOS-app (Instellingen → Algemeen → OpenClaw draait).
- De app opent en beheert de tunnel, zodat WebChat en healthchecks gewoon werken.
Laptop draait de Gateway
Houd de Gateway lokaal, maar stel die veilig beschikbaar:- SSH-tunnel naar de laptop vanaf andere machines, of
- Tailscale Serve de Control UI en houd de Gateway alleen op loopback.
Commandostroom (wat waar draait)
Eén gateway-service beheert state + kanalen. Nodes zijn randapparaten. Voorbeeldstroom (Telegram → node):- Telegram-bericht komt binnen 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 retourneert het resultaat; Gateway antwoordt terug 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).
- macOS-app-”node mode” is alleen een node-client via de Gateway WebSocket.
SSH-tunnel (CLI + tools)
Maak een lokale tunnel naar de remote Gateway WS:openclaw healthenopenclaw status --deepbereiken nu de remote gateway viaws://127.0.0.1:18789.openclaw gateway status,openclaw gateway health,openclaw gateway probeenopenclaw gateway callkunnen indien nodig ook de geforwarde URL targeten via--url.
Vervang
18789 door je geconfigureerde gateway.port (of --port of OPENCLAW_GATEWAY_PORT).Remote-standaarden voor de CLI
Je kunt een remote target persistent maken, zodat CLI-commando’s die standaard gebruiken:ws://127.0.0.1:18789 en open je eerst de SSH-tunnel.
In de SSH-tunneltransportlaag van de macOS-app horen ontdekte gateway-hostnamen in
gateway.remote.sshTarget; gateway.remote.url blijft de lokale tunnel-URL.
Credential-prioriteit
Gateway-credentialresolutie volgt één gedeeld contract voor call/probe/status-paden en Discord exec-approval-monitoring. Node-host gebruikt hetzelfde basiscontract met één local-mode-uitzondering (het negeert bewustgateway.remote.*):
- Expliciete credentials (
--token,--passwordof toolgatewayToken) winnen altijd op call-paden die expliciete auth accepteren. - Veiligheid bij URL-override:
- CLI-URL-overrides (
--url) hergebruiken nooit impliciete config-/env-credentials. - Env-URL-overrides (
OPENCLAW_GATEWAY_URL) mogen alleen env-credentials gebruiken (OPENCLAW_GATEWAY_TOKEN/OPENCLAW_GATEWAY_PASSWORD).
- CLI-URL-overrides (
- Standaarden voor local mode:
- 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-passwordinvoer niet is ingesteld)
- token:
- Standaarden voor remote mode:
- token:
gateway.remote.token->OPENCLAW_GATEWAY_TOKEN->gateway.auth.token - password:
OPENCLAW_GATEWAY_PASSWORD->gateway.remote.password->gateway.auth.password
- token:
- Local-mode-uitzondering voor Node-host:
gateway.remote.token/gateway.remote.passwordworden genegeerd. - Tokencontroles voor remote probe/status zijn standaard strikt: ze gebruiken alleen
gateway.remote.token(geen lokale token-fallback) wanneer ze remote mode targeten. - Gateway-env-overrides gebruiken alleen
OPENCLAW_GATEWAY_*.
Chat-UI via SSH
WebChat gebruikt geen aparte HTTP-poort meer. De SwiftUI-chat-UI verbindt rechtstreeks met de Gateway WebSocket.- Forward
18789via SSH (zie hierboven) en verbind clients daarna metws://127.0.0.1:18789. - Op macOS heeft de “Remote over SSH”-modus van de app de voorkeur; die beheert de tunnel automatisch.
macOS-app Remote over SSH
De macOS-menubalk-app kan dezelfde setup end-to-end aansturen (remote statuscontroles, 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 break-glass. Er is geen equivalent inopenclaw.json; dit moet de procesomgeving zijn voor de client die de WebSocket-verbinding maakt. - Non-loopback binds (
lan/tailnet/custom, ofautowanneer loopback niet beschikbaar is) moeten gateway-auth gebruiken: token, password 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 resolutie gesloten (geen maskering door remote fallback). gateway.remote.tlsFingerprintpint het remote TLS-certificaat bij gebruik vanwss://.- Tailscale Serve kan Control UI-/WebSocket-verkeer authenticeren via identity
headers wanneer
gateway.auth.allowTailscale: true; HTTP API-endpoints gebruiken die Tailscale-headerauth niet en volgen in plaats daarvan de normale HTTP auth mode van de gateway. Deze flow zonder token gaat ervan uit dat de gateway-host vertrouwd is. Zet dit opfalseals je overal shared-secret-auth wilt. - Trusted-proxy-auth verwacht standaard non-loopback identity-aware proxy-setups.
Same-host loopback reverse proxies vereisen expliciet
gateway.auth.trustedProxy.allowLoopback = true. - Behandel browsercontrole als operator-toegang: alleen tailnet + bewuste node-pairing.
macOS: persistente SSH-tunnel via LaunchAgent
Voor macOS-clients die met een remote gateway verbinden, gebruikt de eenvoudigste persistente setup een SSH-LocalForward-config-entry plus een LaunchAgent om de tunnel actief te houden na herstarts en crashes.
Stap 1: voeg SSH-config toe
Bewerk~/.ssh/config:
<REMOTE_IP> en <REMOTE_USER> door je waarden.
Stap 2: kopieer de SSH-sleutel (eenmalig)
Stap 3: configureer het gateway-token
Sla het token op in de config zodat het na herstarts behouden blijft:Stap 4: maak de LaunchAgent
Sla dit op als~/Library/LaunchAgents/ai.openclaw.ssh-tunnel.plist:
Stap 5: laad de LaunchAgent
Als je nog een overgebleven
com.openclaw.ssh-tunnel LaunchAgent uit een oudere setup hebt, unload en verwijder die.Probleemoplossing
Controleer of de tunnel draait:| Config-entry | Wat het doet |
|---|---|
LocalForward 18789 127.0.0.1:18789 | Forwardt lokale poort 18789 naar remote poort 18789 |
ssh -N | SSH zonder remote commando’s uit te voeren (alleen port-forwarding) |
KeepAlive | Herstart de tunnel automatisch als die crasht |
RunAtLoad | Start de tunnel wanneer de LaunchAgent bij login wordt geladen |