Akses jarak jauh (SSH, tunnel, dan tailnet)
Repo ini mendukung “remote over SSH” dengan mempertahankan satu Gateway (master) yang berjalan pada host khusus (desktop/server) dan menghubungkan klien ke sana.- Untuk operator (Anda / aplikasi macOS): tunneling SSH adalah fallback universal.
- Untuk node (iOS/Android dan perangkat masa depan): hubungkan ke Gateway WebSocket (LAN/tailnet atau tunnel SSH sesuai kebutuhan).
Gagasan inti
- Gateway WebSocket melakukan bind ke loopback pada port yang Anda konfigurasikan (default 18789).
- Untuk penggunaan jarak jauh, Anda meneruskan port loopback itu melalui SSH (atau menggunakan tailnet/VPN dan mengurangi kebutuhan tunnel).
Penyiapan VPN/tailnet umum (tempat agen berada)
Anggap host Gateway sebagai “tempat agen berada.” Host itu memiliki sesi, profil autentikasi, channel, dan state. Laptop/desktop Anda (dan node) terhubung ke host tersebut.1) Gateway yang selalu aktif di tailnet Anda (VPS atau server rumahan)
Jalankan Gateway pada host persisten dan akses melalui Tailscale atau SSH.- UX terbaik: pertahankan
gateway.bind: "loopback"dan gunakan Tailscale Serve untuk UI Kontrol. - Fallback: pertahankan loopback + tunnel SSH dari mesin mana pun yang memerlukan akses.
- Contoh: exe.dev (VM mudah) atau Hetzner (VPS produksi).
2) Desktop rumah menjalankan Gateway, laptop menjadi kendali jarak jauh
Laptop tidak menjalankan agen. Laptop terhubung dari jarak jauh:- Gunakan mode Remote over SSH pada aplikasi macOS (Settings → General → “OpenClaw runs”).
- Aplikasi membuka dan mengelola tunnel, sehingga WebChat + pemeriksaan kesehatan “langsung berfungsi.”
3) Laptop menjalankan Gateway, akses jarak jauh dari mesin lain
Pertahankan Gateway tetap lokal tetapi ekspos dengan aman:- Tunnel SSH ke laptop dari mesin lain, atau
- Sajikan UI Kontrol dengan Tailscale Serve dan pertahankan Gateway hanya-loopback.
Alur perintah (apa yang berjalan di mana)
Satu layanan gateway memiliki state + channel. Node adalah periferal. Contoh alur (Telegram → node):- Pesan Telegram tiba di Gateway.
- Gateway menjalankan agen dan memutuskan apakah perlu memanggil tool node.
- Gateway memanggil node melalui Gateway WebSocket (
node.*RPC). - Node mengembalikan hasil; Gateway membalas kembali ke Telegram.
- Node tidak menjalankan layanan gateway. Hanya satu gateway yang seharusnya berjalan per host kecuali Anda dengan sengaja menjalankan profil terisolasi (lihat Multiple gateways).
- “Node mode” pada aplikasi macOS hanyalah klien node melalui Gateway WebSocket.
Tunnel SSH (CLI + tools)
Buat tunnel lokal ke WS Gateway jarak jauh:openclaw healthdanopenclaw status --deepsekarang menjangkau gateway jarak jauh melaluiws://127.0.0.1:18789.openclaw gateway status,openclaw gateway health,openclaw gateway probe, danopenclaw gateway calljuga dapat menargetkan URL yang diteruskan melalui--urlbila diperlukan.
18789 dengan gateway.port yang Anda konfigurasikan (atau --port/OPENCLAW_GATEWAY_PORT).
Catatan: saat Anda memberikan --url, CLI tidak akan fallback ke konfigurasi atau kredensial environment.
Sertakan --token atau --password secara eksplisit. Kredensial eksplisit yang tidak ada adalah kesalahan.
Default jarak jauh CLI
Anda dapat menyimpan target jarak jauh agar perintah CLI menggunakannya secara default:ws://127.0.0.1:18789 dan buka tunnel SSH terlebih dahulu.
Prioritas kredensial
Resolusi kredensial Gateway mengikuti satu kontrak bersama di jalur call/probe/status dan pemantauan persetujuan-eksekusi Discord. Node-host menggunakan kontrak dasar yang sama dengan satu pengecualian mode lokal (secara sengaja mengabaikangateway.remote.*):
- Kredensial eksplisit (
--token,--password, atau toolgatewayToken) selalu menang pada jalur call yang menerima autentikasi eksplisit. - Keamanan override URL:
- Override URL CLI (
--url) tidak pernah menggunakan ulang kredensial implisit config/env. - Override URL env (
OPENCLAW_GATEWAY_URL) hanya dapat menggunakan kredensial env (OPENCLAW_GATEWAY_TOKEN/OPENCLAW_GATEWAY_PASSWORD).
- Override URL CLI (
- Default mode lokal:
- token:
OPENCLAW_GATEWAY_TOKEN->gateway.auth.token->gateway.remote.token(fallback jarak jauh hanya berlaku ketika input token autentikasi lokal tidak disetel) - password:
OPENCLAW_GATEWAY_PASSWORD->gateway.auth.password->gateway.remote.password(fallback jarak jauh hanya berlaku ketika input password autentikasi lokal tidak disetel)
- token:
- Default mode jarak jauh:
- token:
gateway.remote.token->OPENCLAW_GATEWAY_TOKEN->gateway.auth.token - password:
OPENCLAW_GATEWAY_PASSWORD->gateway.remote.password->gateway.auth.password
- token:
- Pengecualian mode lokal node-host:
gateway.remote.token/gateway.remote.passworddiabaikan. - Pemeriksaan token probe/status jarak jauh bersifat ketat secara default: menggunakan
gateway.remote.tokensaja (tanpa fallback token lokal) saat menargetkan mode jarak jauh. - Override env Gateway hanya menggunakan
OPENCLAW_GATEWAY_*.
UI Chat melalui SSH
WebChat tidak lagi menggunakan port HTTP terpisah. UI chat SwiftUI terhubung langsung ke Gateway WebSocket.- Teruskan
18789melalui SSH (lihat di atas), lalu hubungkan klien kews://127.0.0.1:18789. - Di macOS, sebaiknya gunakan mode “Remote over SSH” pada aplikasi, yang mengelola tunnel secara otomatis.
Aplikasi macOS “Remote over SSH”
Aplikasi bilah menu macOS dapat mengelola penyiapan yang sama secara menyeluruh (pemeriksaan status jarak jauh, WebChat, dan penerusan Voice Wake). Panduan: akses jarak jauh macOS.Aturan keamanan (jarak jauh/VPN)
Versi singkat: pertahankan Gateway hanya-loopback kecuali Anda yakin memerlukan bind.- Loopback + SSH/Tailscale Serve adalah default paling aman (tanpa eksposur publik).
ws://plaintext secara default hanya loopback. Untuk jaringan privat tepercaya, setelOPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1pada proses klien sebagai break-glass.- Bind non-loopback (
lan/tailnet/custom, atauautosaat loopback tidak tersedia) harus menggunakan autentikasi gateway: token, password, atau reverse proxy sadar identitas dengangateway.auth.mode: "trusted-proxy". gateway.remote.token/.passwordadalah sumber kredensial klien. Keduanya tidak mengonfigurasi autentikasi server dengan sendirinya.- Jalur call lokal dapat menggunakan
gateway.remote.*sebagai fallback hanya ketikagateway.auth.*tidak disetel. - Jika
gateway.auth.token/gateway.auth.passwordsecara eksplisit dikonfigurasi melalui SecretRef dan belum di-resolve, resolusi gagal tertutup (tidak ada fallback jarak jauh yang menutupi). gateway.remote.tlsFingerprintmelakukan pin pada sertifikat TLS jarak jauh saat menggunakanwss://.- Tailscale Serve dapat mengautentikasi lalu lintas UI Kontrol/WebSocket melalui header identitas saat
gateway.auth.allowTailscale: true; endpoint API HTTP tidak menggunakan autentikasi header Tailscale tersebut dan sebagai gantinya mengikuti mode autentikasi HTTP normal gateway. Alur tanpa token ini mengasumsikan host gateway tepercaya. Setel kefalsejika Anda ingin autentikasi shared-secret di semua tempat. - Autentikasi trusted-proxy hanya untuk penyiapan proxy sadar identitas non-loopback.
Reverse proxy loopback pada host yang sama tidak memenuhi
gateway.auth.mode: "trusted-proxy". - Perlakukan kontrol browser seperti akses operator: tailnet-only + pairing node yang disengaja.
macOS: tunnel SSH persisten melalui LaunchAgent
Untuk klien macOS yang terhubung ke gateway jarak jauh, penyiapan persisten termudah menggunakan entri konfigurasi SSHLocalForward ditambah LaunchAgent agar tunnel tetap aktif lintas reboot dan crash.
Langkah 1: tambahkan konfigurasi SSH
Edit~/.ssh/config:
<REMOTE_IP> dan <REMOTE_USER> dengan nilai Anda.
Langkah 2: salin kunci SSH (satu kali)
Langkah 3: konfigurasikan token gateway
Simpan token dalam konfigurasi agar tetap ada setelah restart:Langkah 4: buat LaunchAgent
Simpan ini sebagai~/Library/LaunchAgents/ai.openclaw.ssh-tunnel.plist:
Langkah 5: muat LaunchAgent
com.openclaw.ssh-tunnel yang tersisa dari penyiapan lama, unload dan hapus.
Pemecahan masalah
Periksa apakah tunnel sedang berjalan:| Entri konfigurasi | Fungsinya |
|---|---|
LocalForward 18789 127.0.0.1:18789 | Meneruskan port lokal 18789 ke port jarak jauh 18789 |
ssh -N | SSH tanpa mengeksekusi perintah jarak jauh (hanya port-forwarding) |
KeepAlive | Secara otomatis memulai ulang tunnel jika crash |
RunAtLoad | Memulai tunnel saat LaunchAgent dimuat ketika login |