Remote access
دسترسی از راه دور
این مخزن از «راه دور از طریق SSH» با اجرای یک Gateway واحد (اصلی) روی یک میزبان اختصاصی (رایانه رومیزی/سرور) و اتصال کلاینتها به آن پشتیبانی میکند.
- برای اپراتورها (شما / برنامه macOS): تونلزنی SSH راهکار جایگزین همگانی است.
- برای Nodeها (iOS/Android و دستگاههای آینده): به WebSocket متعلق به Gateway وصل شوید (LAN/tailnet یا تونل SSH در صورت نیاز).
ایده اصلی
- WebSocket متعلق به Gateway روی پورت پیکربندیشده شما (بهطور پیشفرض 18789) به loopback متصل میشود.
- برای استفاده راه دور، آن پورت loopback را از طریق SSH فوروارد میکنید (یا از یک tailnet/VPN استفاده میکنید و کمتر تونل میزنید).
راهاندازیهای رایج VPN و tailnet
میزبان Gateway را جایی در نظر بگیرید که agent در آن زندگی میکند. این میزبان مالک نشستها، پروفایلهای احراز هویت، کانالها و وضعیت است. لپتاپ، رایانه رومیزی و Nodeهای شما به آن میزبان وصل میشوند.
Gateway همیشهروشن در tailnet شما
Gateway را روی یک میزبان پایدار (VPS یا سرور خانگی) اجرا کنید و از طریق Tailscale یا SSH به آن دسترسی بگیرید.
- بهترین تجربه کاربری:
gateway.bind: "loopback"را نگه دارید و برای Control UI از Tailscale Serve استفاده کنید. - راهکار جایگزین: loopback را همراه با تونل SSH از هر دستگاهی که به دسترسی نیاز دارد نگه دارید.
- مثالها: exe.dev (VM آسان) یا Hetzner (VPS تولیدی).
مناسب زمانی است که لپتاپ شما اغلب به خواب میرود اما میخواهید agent همیشه روشن باشد.
رایانه رومیزی خانگی Gateway را اجرا میکند
لپتاپ agent را اجرا نمیکند. بهصورت راه دور وصل میشود:
- از حالت Remote over SSH در برنامه macOS استفاده کنید (Settings → General → OpenClaw runs).
- برنامه تونل را باز و مدیریت میکند، بنابراین WebChat و بررسیهای سلامت بدون کار اضافه انجام میشوند.
رهنمود عملیاتی: دسترسی راه دور macOS.
لپتاپ Gateway را اجرا میکند
Gateway را محلی نگه دارید اما آن را ایمن در دسترس قرار دهید:
- از دستگاههای دیگر به لپتاپ تونل SSH بزنید، یا
- Control UI را با Tailscale Serve ارائه کنید و Gateway را فقط loopback نگه دارید.
راهنماها: Tailscale و نمای کلی وب.
جریان فرمان (چه چیزی کجا اجرا میشود)
یک سرویس Gateway مالک وضعیت + کانالها است. Nodeها تجهیزات جانبی هستند.
نمونه جریان (Telegram → node):
- پیام Telegram به Gateway میرسد.
- Gateway، agent را اجرا میکند و تصمیم میگیرد آیا ابزار node را فراخوانی کند یا نه.
- Gateway از طریق WebSocket متعلق به Gateway، node را فراخوانی میکند (
node.*RPC). - Node نتیجه را برمیگرداند؛ Gateway پاسخ را دوباره به Telegram ارسال میکند.
نکات:
- Nodeها سرویس gateway را اجرا نمیکنند. در هر میزبان فقط یک gateway باید اجرا شود، مگر اینکه عمدا پروفایلهای ایزوله اجرا کنید (نگاه کنید به چند Gateway).
- «حالت node» برنامه macOS فقط یک کلاینت node روی WebSocket متعلق به Gateway است.
تونل SSH (CLI + ابزارها)
یک تونل محلی به Gateway WS راه دور بسازید:
ssh -N -L 18789:127.0.0.1:18789 user@host
وقتی تونل برقرار است:
openclaw healthوopenclaw status --deepاکنون از طریقws://127.0.0.1:18789به gateway راه دور میرسند.openclaw gateway status،openclaw gateway health،openclaw gateway probeوopenclaw gateway callنیز در صورت نیاز میتوانند URL فورواردشده را از طریق--urlهدف بگیرند.
پیشفرضهای راه دور CLI
میتوانید یک هدف راه دور را پایدار کنید تا فرمانهای CLI بهطور پیشفرض از آن استفاده کنند:
{
gateway: {
mode: "remote",
remote: {
url: "ws://127.0.0.1:18789",
token: "your-token",
},
},
}
وقتی gateway فقط loopback است، URL را روی ws://127.0.0.1:18789 نگه دارید و ابتدا تونل SSH را باز کنید.
در ترابری تونل SSH برنامه macOS، نامهای میزبان gateway کشفشده باید در
gateway.remote.sshTarget قرار بگیرند؛ gateway.remote.url همان URL تونل محلی باقی میماند.
تقدم اعتبارنامهها
حل اعتبارنامه Gateway در مسیرهای call/probe/status و پایش تایید اجرای Discord از یک قرارداد مشترک پیروی میکند. Node-host از همان قرارداد پایه با یک استثنای local-mode استفاده میکند (عمدا gateway.remote.* را نادیده میگیرد):
- اعتبارنامههای صریح (
--token،--passwordیا ابزارgatewayToken) همیشه در مسیرهای call که احراز هویت صریح را میپذیرند برنده هستند. - ایمنی بازنویسی URL:
- بازنویسیهای URL در CLI (
--url) هرگز از اعتبارنامههای ضمنی پیکربندی/محیط دوباره استفاده نمیکنند. - بازنویسیهای URL محیط (
OPENCLAW_GATEWAY_URL) فقط میتوانند از اعتبارنامههای محیط استفاده کنند (OPENCLAW_GATEWAY_TOKEN/OPENCLAW_GATEWAY_PASSWORD).
- بازنویسیهای URL در CLI (
- پیشفرضهای حالت محلی:
- token:
OPENCLAW_GATEWAY_TOKEN->gateway.auth.token->gateway.remote.token(بازگشت راه دور فقط وقتی ورودی توکن احراز هویت محلی تنظیم نشده باشد اعمال میشود) - password:
OPENCLAW_GATEWAY_PASSWORD->gateway.auth.password->gateway.remote.password(بازگشت راه دور فقط وقتی ورودی گذرواژه احراز هویت محلی تنظیم نشده باشد اعمال میشود)
- token:
- پیشفرضهای حالت راه دور:
- token:
gateway.remote.token->OPENCLAW_GATEWAY_TOKEN->gateway.auth.token - password:
OPENCLAW_GATEWAY_PASSWORD->gateway.remote.password->gateway.auth.password
- token:
- استثنای local-mode برای Node-host:
gateway.remote.token/gateway.remote.passwordنادیده گرفته میشوند. - بررسیهای توکن probe/status راه دور بهطور پیشفرض سختگیرانه هستند: هنگام هدفگیری حالت راه دور فقط از
gateway.remote.tokenاستفاده میکنند (بدون بازگشت به توکن محلی). - بازنویسیهای محیط Gateway فقط از
OPENCLAW_GATEWAY_*استفاده میکنند.
Chat UI از طریق SSH
WebChat دیگر از پورت HTTP جداگانه استفاده نمیکند. UI چت SwiftUI مستقیما به WebSocket متعلق به Gateway وصل میشود.
18789را از طریق SSH فوروارد کنید (بالا را ببینید)، سپس کلاینتها را بهws://127.0.0.1:18789وصل کنید.- در macOS، حالت "Remote over SSH" برنامه را ترجیح دهید که تونل را خودکار مدیریت میکند.
Remote over SSH در برنامه macOS
برنامه نوار منوی macOS میتواند همین راهاندازی را از ابتدا تا انتها هدایت کند (بررسیهای وضعیت راه دور، WebChat و فوروارد کردن Voice Wake).
رهنمود عملیاتی: دسترسی راه دور macOS.
قوانین امنیتی (راه دور/VPN)
نسخه کوتاه: Gateway را فقط loopback نگه دارید مگر اینکه مطمئن باشید به bind نیاز دارید.
- Loopback + SSH/Tailscale Serve امنترین پیشفرض است (بدون در معرض عموم قرار گرفتن).
- متن ساده
ws://بهطور پیشفرض فقط loopback است. برای شبکههای خصوصی مورد اعتماد، روی فرایند کلاینتOPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1را بهعنوان راهکار اضطراری تنظیم کنید. معادلopenclaw.jsonوجود ندارد؛ این باید محیط فرایند برای کلاینتی باشد که اتصال WebSocket را برقرار میکند. - Bindهای غیر loopback (
lan/tailnet/custom، یاautoوقتی loopback در دسترس نیست) باید از احراز هویت gateway استفاده کنند: توکن، گذرواژه، یا reverse proxy آگاه از هویت باgateway.auth.mode: "trusted-proxy". gateway.remote.token/.passwordمنابع اعتبارنامه کلاینت هستند. آنها بهتنهایی احراز هویت سرور را پیکربندی نمیکنند.- مسیرهای call محلی فقط وقتی
gateway.auth.*تنظیم نشده باشد میتوانند ازgateway.remote.*بهعنوان fallback استفاده کنند. - اگر
gateway.auth.token/gateway.auth.passwordصریحا از طریق SecretRef پیکربندی شده و حلنشده باشد، حل اعتبارنامه بسته شکست میخورد (بدون پوشاندن با fallback راه دور). gateway.remote.tlsFingerprintهنگام استفاده ازwss://گواهی TLS راه دور را pin میکند.- Tailscale Serve میتواند ترافیک Control UI/WebSocket را از طریق headerهای هویت احراز هویت کند
وقتی
gateway.auth.allowTailscale: trueباشد؛ endpointهای HTTP API از آن احراز هویت header مربوط به Tailscale استفاده نمیکنند و در عوض از حالت احراز هویت HTTP معمول gateway پیروی میکنند. این جریان بدون توکن فرض میکند میزبان gateway مورد اعتماد است. اگر میخواهید همهجا احراز هویت shared-secret داشته باشید، آن را رویfalseتنظیم کنید. - احراز هویت Trusted-proxy بهطور پیشفرض انتظار راهاندازیهای proxy آگاه از هویت غیر loopback را دارد.
reverse proxyهای loopback روی همان میزبان به
gateway.auth.trustedProxy.allowLoopback = trueصریح نیاز دارند. - کنترل مرورگر را مانند دسترسی اپراتور در نظر بگیرید: فقط tailnet + جفتسازی عمدی node.
بررسی عمیق: امنیت.
macOS: تونل SSH پایدار از طریق LaunchAgent
برای کلاینتهای macOS که به gateway راه دور وصل میشوند، آسانترین راهاندازی پایدار از یک ورودی پیکربندی SSH LocalForward بههمراه LaunchAgent استفاده میکند تا تونل در برابر راهاندازی دوباره و crash زنده بماند.
گام 1: افزودن پیکربندی SSH
~/.ssh/config را ویرایش کنید:
Host remote-gateway
HostName <REMOTE_IP>
User <REMOTE_USER>
LocalForward 18789 127.0.0.1:18789
IdentityFile ~/.ssh/id_rsa
<REMOTE_IP> و <REMOTE_USER> را با مقادیر خود جایگزین کنید.
گام 2: کپی کلید SSH (یکبار)
ssh-copy-id -i ~/.ssh/id_rsa <REMOTE_USER>@<REMOTE_IP>
گام 3: پیکربندی توکن gateway
توکن را در پیکربندی ذخیره کنید تا پس از راهاندازیهای دوباره پایدار بماند:
openclaw config set gateway.remote.token "<your-token>"
گام 4: ایجاد LaunchAgent
این را بهعنوان ~/Library/LaunchAgents/ai.openclaw.ssh-tunnel.plist ذخیره کنید:
<?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>ai.openclaw.ssh-tunnel</string>
<key>ProgramArguments</key>
<array>
<string>/usr/bin/ssh</string>
<string>-N</string>
<string>remote-gateway</string>
</array>
<key>KeepAlive</key>
<true/>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>
گام 5: بارگذاری LaunchAgent
launchctl bootstrap gui/$UID ~/Library/LaunchAgents/ai.openclaw.ssh-tunnel.plist
تونل هنگام ورود به سیستم بهطور خودکار شروع میشود، پس از crash دوباره راهاندازی میشود و پورت فورواردشده را زنده نگه میدارد.
عیبیابی
بررسی کنید تونل در حال اجرا است یا نه:
ps aux | grep "ssh -N remote-gateway" | grep -v grep
lsof -i :18789
راهاندازی دوباره تونل:
launchctl kickstart -k gui/$UID/ai.openclaw.ssh-tunnel
توقف تونل:
launchctl bootout gui/$UID/ai.openclaw.ssh-tunnel
| ورودی پیکربندی | کارکرد |
|---|---|
LocalForward 18789 127.0.0.1:18789 |
پورت محلی 18789 را به پورت راه دور 18789 فوروارد میکند |
ssh -N |
SSH بدون اجرای فرمانهای راه دور (فقط port-forwarding) |
KeepAlive |
اگر تونل crash کند، آن را بهطور خودکار دوباره راهاندازی میکند |
RunAtLoad |
وقتی LaunchAgent هنگام ورود بارگذاری میشود، تونل را شروع میکند |