دليل تشغيل خدمة Gateway¶
آخر تحديث: 2025-12-09
ما هي¶
- العملية الدائمة التشغيل التي تمتلك اتصال Baileys/Telegram الوحيد ومستوى التحكم/الأحداث.
- تحل محل الأمر القديم
gateway. نقطة دخول CLI:openclaw gateway. - تعمل حتى يتم إيقافها؛ وتخرج برمز غير صفري عند الأخطاء القاتلة كي يعيد المشرف تشغيلها.
كيفية التشغيل (محليًا)¶
openclaw gateway --port 18789
# for full debug/trace logs in stdio:
openclaw gateway --port 18789 --verbose
# if the port is busy, terminate listeners then start:
openclaw gateway --force
# dev loop (auto-reload on TS changes):
pnpm gateway:watch
- إعادة تحميل التهيئة الساخنة تراقب
~/.openclaw/openclaw.json(أوOPENCLAW_CONFIG_PATH). - الوضع الافتراضي:
gateway.reload.mode="hybrid"(تطبيق فوري للتغييرات الآمنة، وإعادة تشغيل عند الحرجة). - إعادة التحميل الساخنة تستخدم إعادة تشغيل داخل العملية عبر SIGUSR1 عند الحاجة.
- التعطيل باستخدام
gateway.reload.mode="off". - ربط مستوى التحكم عبر WebSocket إلى
127.0.0.1:<port>(الافتراضي 18789). - المنفذ نفسه يخدم أيضًا HTTP (واجهة تحكم، hooks، A2UI). تعدد الإرسال على منفذ واحد.
- OpenAI Chat Completions (HTTP):
/v1/chat/completions. - OpenResponses (HTTP):
/v1/responses. - Tools Invoke (HTTP):
/tools/invoke. - يبدأ خادم ملفات Canvas افتراضيًا على
canvasHost.port(الافتراضي18793)، ويخدمhttp://<gateway-host>:18793/__openclaw__/canvas/من~/.openclaw/workspace/canvas. عطّل باستخدامcanvasHost.enabled=falseأوOPENCLAW_SKIP_CANVAS_HOST=1. - يسجل إلى stdout؛ استخدم launchd/systemd لإبقائه حيًا وتدوير السجلات.
- مرّر
--verboseلنسخ سجلات التصحيح (المصافحات، الطلب/الاستجابة، الأحداث) من ملف السجل إلى stdio عند استكشاف الأخطاء وإصلاحها. --forceيستخدمlsofللعثور على المستمعين على المنفذ المختار، يرسل SIGTERM، يسجل ما قام بإنهائه، ثم يبدأ Gateway (يفشل سريعًا إذا كانlsofمفقودًا).- إذا كنت تشغّل تحت مشرف (launchd/systemd/وضع عملية فرعية لتطبيق mac)، فإن الإيقاف/إعادة التشغيل يرسل عادة SIGTERM؛ وقد تُظهر الإصدارات الأقدم ذلك كـ
pnpmELIFECYCLEبرمز خروج 143 (SIGTERM)، وهو إيقاف طبيعي وليس انهيارًا. - SIGUSR1 يُشغّل إعادة تشغيل داخل العملية عند التفويض (أداة Gateway/تطبيق/تحديث التهيئة، أو فعّل
commands.restartلإعادة تشغيل يدوية). - يتطلب توثيق Gateway افتراضيًا: اضبط
gateway.auth.token(أوOPENCLAW_GATEWAY_TOKEN) أوgateway.auth.password. يجب على العملاء إرسالconnect.params.auth.token/passwordما لم يستخدموا هوية Tailscale Serve. - يقوم المعالج الآن بإنشاء رمز مميز افتراضيًا، حتى على loopback.
- أسبقية المنفذ:
--port>OPENCLAW_GATEWAY_PORT>gateway.port> الافتراضي18789.
الوصول عن بُعد¶
- يُفضَّل Tailscale/VPN؛ وإلا فنفق SSH:
bash
ssh -N -L 18789:127.0.0.1:18789 user@host
-
يتصل العملاء بعد ذلك بـ
ws://127.0.0.1:18789عبر النفق. -
إذا كان الرمز المميز مضبوطًا، يجب على العملاء تضمينه في
connect.params.auth.tokenحتى عبر النفق.
بوابات متعددة (على المضيف نفسه)¶
غالبًا غير ضروري: يمكن لـ Gateway واحدة خدمة قنوات مراسلة ووكلاء متعددين. استخدم بوابات متعددة فقط للتكرار أو العزل الصارم (مثل: روبوت إنقاذ).
مدعوم إذا قمت بعزل الحالة + التهيئة واستخدمت منافذ فريدة. الدليل الكامل: بوابات متعددة.
أسماء الخدمات واعية بالملف الشخصي:
- macOS:
bot.molt.<profile>(قد يظل القديمcom.openclaw.*موجودًا) - Linux:
openclaw-gateway-<profile>.service - Windows:
OpenClaw Gateway (<profile>)
بيانات التثبيت مُضمّنة في تهيئة الخدمة:
OPENCLAW_SERVICE_MARKER=openclawOPENCLAW_SERVICE_KIND=gatewayOPENCLAW_SERVICE_VERSION=<version>
نمط روبوت الإنقاذ: احتفِظ بـ Gateway ثانية معزولة بملفها الشخصي الخاص، ودليل الحالة، ومساحة العمل، وتباعد منافذ أساسي. الدليل الكامل: دليل روبوت الإنقاذ.
ملف التطوير (--dev)¶
المسار السريع: شغّل نسخة تطوير معزولة بالكامل (تهيئة/حالة/مساحة عمل) دون المساس بإعدادك الأساسي.
openclaw --dev setup
openclaw --dev gateway --allow-unconfigured
# then target the dev instance:
openclaw --dev status
openclaw --dev health
الافتراضيات (يمكن تجاوزها عبر env/flags/التهيئة):
OPENCLAW_STATE_DIR=~/.openclaw-devOPENCLAW_CONFIG_PATH=~/.openclaw-dev/openclaw.jsonOPENCLAW_GATEWAY_PORT=19001(Gateway WS + HTTP)- منفذ خدمة تحكم المتصفح =
19003(مُشتق:gateway.port+2، loopback فقط) canvasHost.port=19005(مُشتق:gateway.port+4)- يصبح الافتراضي لـ
agents.defaults.workspaceهو~/.openclaw/workspace-devعند تشغيلsetup/onboardتحت--dev.
المنافذ المُشتقة (قواعد إرشادية):
- المنفذ الأساسي =
gateway.port(أوOPENCLAW_GATEWAY_PORT/--port) - منفذ خدمة تحكم المتصفح = الأساسي + 2 (loopback فقط)
canvasHost.port = base + 4(أوOPENCLAW_CANVAS_HOST_PORT/ تجاوز التهيئة)- تُخصَّص منافذ CDP لملف المتصفح تلقائيًا من
browser.controlPort + 9 .. + 108(مُحفوظة لكل ملف شخصي).
Checklist per instance:
gateway.portفريدOPENCLAW_CONFIG_PATHفريدOPENCLAW_STATE_DIRفريدagents.defaults.workspaceفريد- أرقام WhatsApp منفصلة (إن كنت تستخدم WA)
تثبيت الخدمة لكل ملف شخصي:
openclaw --profile main gateway install
openclaw --profile rescue gateway install
مثال:
OPENCLAW_CONFIG_PATH=~/.openclaw/a.json OPENCLAW_STATE_DIR=~/.openclaw-a openclaw gateway --port 19001
OPENCLAW_CONFIG_PATH=~/.openclaw/b.json OPENCLAW_STATE_DIR=~/.openclaw-b openclaw gateway --port 19002
البروتوكول (منظور المشغّل)¶
- الوثائق الكاملة: بروتوكول Gateway وبروتوكول Bridge (قديم).
- الإطار الأول الإلزامي من العميل:
req {type:"req", id, method:"connect", params:{minProtocol,maxProtocol,client:{id,displayName?,version,platform,deviceFamily?,modelIdentifier?,mode,instanceId?}, caps, auth?, locale?, userAgent? } }. - يرد Gateway بـ
res {type:"res", id, ok:true, payload:hello-ok }(أوok:falseمع خطأ، ثم يغلق). - بعد المصافحة:
- الطلبات:
{type:"req", id, method, params}→{type:"res", id, ok, payload|error} - الأحداث:
{type:"event", event, payload, seq?, stateVersion?} - إدخالات حضور مُنظَّمة:
{host, ip, version, platform?, deviceFamily?, modelIdentifier?, mode, lastInputSeconds?, ts, reason?, tags?[], instanceId? }(لعملاء WS، يأتيinstanceIdمنconnect.client.instanceId). - استجابات
agentعلى مرحلتين: أولًا تأكيدres{runId,status:"accepted"}، ثمres{runId,status:"ok"|"error",summary}النهائي بعد انتهاء التشغيل؛ ويصل الخرج المتدفق كـevent:"agent".
الأساليب (المجموعة الأولية)¶
health— لقطة صحة كاملة (نفس البنية مثلopenclaw health --json).status— ملخص قصير.system-presence— قائمة الحضور الحالية.system-event— نشر ملاحظة حضور/نظام (مُنظَّمة).send— إرسال رسالة عبر القناة/القنوات النشطة.agent— تنفيذ دور وكيل (يبث الأحداث عبر الاتصال نفسه).node.list— سرد العُقد المقترنة والمتصلة حاليًا (يتضمنcaps،deviceFamily،modelIdentifier،paired،connected، وcommandsالمُعلَن).node.describe— وصف عُقدة (القدرات + أوامرnode.invokeالمدعومة؛ يعمل للعُقد المقترنة وللعُقد غير المقترنة المتصلة حاليًا).node.invoke— استدعاء أمر على عُقدة (مثلcanvas.*،camera.*).node.pair.*— دورة حياة الاقتران (request،list،approve،reject،verify).
انظر أيضًا: الحضور لمعرفة كيفية إنتاج الحضور وإزالة التكرار ولماذا يهم client.instanceId المستقر.
الأحداث¶
agent— أحداث أدوات/مخرجات مُتدفقة من تشغيل الوكيل (موسومة بتسلسل).presence— تحديثات الحضور (فروق مع stateVersion) تُدفَع إلى جميع العملاء المتصلين.tick— إبقاء الاتصال/لا-عملية دوري لتأكيد الحيوية.shutdown— Gateway بصدد الخروج؛ تتضمن الحمولةreasonوrestartExpectedMsالاختياري. يجب على العملاء إعادة الاتصال.
تكامل WebChat¶
- WebChat واجهة SwiftUI أصلية تتحدث مباشرةً مع WebSocket الخاص بـ Gateway للتاريخ، والإرسال، والإلغاء، والأحداث.
- الاستخدام عن بُعد يمر عبر نفق SSH/Tailscale نفسه؛ وإذا كان رمز Gateway مضبوطًا، يضمنه العميل أثناء
connect. - يتصل تطبيق macOS عبر WS واحد (اتصال مشترك)؛ ويستكمل الحضور من اللقطة الأولية ويستمع لأحداث
presenceلتحديث الواجهة.
الكتابة والتحقق¶
- يتحقق الخادم من كل إطار وارد باستخدام AJV مقابل JSON Schema المُصدَرة من تعريفات البروتوكول.
- يستهلك العملاء (TS/Swift) الأنواع المُولَّدة (TS مباشرة؛ Swift عبر مُولِّد المستودع).
- تعريفات البروتوكول هي مصدر الحقيقة؛ أعد توليد المخطط/النماذج باستخدام:
pnpm protocol:genpnpm protocol:gen:swift
لقطة الاتصال¶
hello-okتتضمنsnapshotمعpresence،health،stateVersion، وuptimeMsإضافةً إلىpolicy {maxPayload,maxBufferedBytes,tickIntervalMs}كي يتمكن العملاء من العرض فورًا دون طلبات إضافية.- تظل
health/system-presenceمتاحة للتحديث اليدوي، لكنها غير مطلوبة وقت الاتصال.
رموز الأخطاء (بنية res.error)¶
- تستخدم الأخطاء
{ code, message, details?, retryable?, retryAfterMs? }. - الرموز القياسية:
NOT_LINKED— WhatsApp غير مُوثَّق.AGENT_TIMEOUT— لم يستجب الوكيل ضمن المهلة المضبوطة.INVALID_REQUEST— فشل التحقق من المخطط/المعاملات.UNAVAILABLE— Gateway قيد الإيقاف أو أن اعتمادًا غير متاح.
سلوك الإبقاء حيًا¶
- تُصدَر أحداث
tick(أو ping/pong لـ WS) دوريًا ليعرف العملاء أن Gateway حي حتى عند غياب الحركة. - تبقى تأكيدات الإرسال/الوكيل استجابات منفصلة؛ لا تُحمِّل نبضات الإبقاء وظائف الإرسال.
إعادة التشغيل / الفجوات¶
- لا تتم إعادة تشغيل الأحداث. يكتشف العملاء فجوات التسلسل ويجب عليهم التحديث (
health+system-presence) قبل المتابعة. تقوم WebChat وعملاء macOS الآن بالتحديث التلقائي عند وجود فجوة.
الإشراف (مثال macOS)¶
- استخدم launchd لإبقاء الخدمة حيّة:
- Program: المسار إلى
openclaw - Arguments:
gateway - KeepAlive: true
- StandardOut/Err: مسارات ملفات أو
syslog - عند الفشل، يعيد launchd التشغيل؛ يجب أن يستمر سوء التهيئة القاتل في الخروج كي يلاحظه المشغّل.
- LaunchAgents لكل مستخدم وتتطلب جلسة مُسجّلة الدخول؛ للإعدادات دون واجهة استخدم LaunchDaemon مخصصًا (غير مُشحن).
openclaw gateway installيكتب~/Library/LaunchAgents/bot.molt.gateway.plist(أوbot.molt.<profile>.plist؛ يتم تنظيف القديمcom.openclaw.*).openclaw doctorيدقق تهيئة LaunchAgent ويمكنه تحديثها إلى الافتراضيات الحالية.
إدارة خدمة Gateway (CLI)¶
استخدم CLI الخاص بـ Gateway للتثبيت/البدء/الإيقاف/إعادة التشغيل/الحالة:
openclaw gateway status
openclaw gateway install
openclaw gateway stop
openclaw gateway restart
openclaw logs --follow
ملاحظات:
gateway statusيفحص Gateway RPC افتراضيًا باستخدام المنفذ/التهيئة المحلولة للخدمة (تجاوز باستخدام--url).gateway status --deepيضيف عمليات مسح على مستوى النظام (LaunchDaemons/وحدات النظام).gateway status --no-probeيتجاوز فحص RPC (مفيد عند تعطل الشبكات).gateway status --jsonثابت للاستخدام في السكربتات.gateway statusيُبلِغ عن تشغيل المشرف (تشغيل launchd/systemd) منفصلًا عن قابلية الوصول إلى RPC (اتصال WS + استدعاء حالة RPC).gateway statusيطبع مسار التهيئة + هدف الفحص لتجنب التباس «localhost مقابل ربط LAN» وعدم تطابق الملفات الشخصية.gateway statusيتضمن آخر سطر خطأ من Gateway عندما تبدو الخدمة تعمل لكن المنفذ مغلق.logsيتتبع سجل ملفات Gateway عبر RPC (لا حاجة إلىtail/grepيدويًا).- إذا كُشفت خدمات شبيهة بالبوابة، يحذّر CLI ما لم تكن خدمات ملفات OpenClaw الشخصية. ما زلنا نوصي بـ بوابة واحدة لكل جهاز لمعظم الإعدادات؛ استخدم ملفات/منافذ معزولة للتكرار أو روبوت إنقاذ. انظر بوابات متعددة.
- التنظيف:
openclaw gateway uninstall(الخدمة الحالية) وopenclaw doctor(ترحيلات قديمة). gateway installلا يقوم بأي إجراء عند كونه مثبتًا بالفعل؛ استخدمopenclaw gateway install --forceلإعادة التثبيت (تغييرات الملف الشخصي/البيئة/المسار).
تطبيق mac المُضمَّن:
- يمكن لـ OpenClaw.app تجميع مرحّل Gateway قائم على Node وتثبيت LaunchAgent لكل مستخدم بعلامة
bot.molt.gateway(أوbot.molt.<profile>؛ وتُفك تحميل العلامات القديمةcom.openclaw.*بشكل نظيف). - لإيقافه بشكل نظيف، استخدم
openclaw gateway stop(أوlaunchctl bootout gui/$UID/bot.molt.gateway). - لإعادة التشغيل، استخدم
openclaw gateway restart(أوlaunchctl kickstart -k gui/$UID/bot.molt.gateway). - يعمل
launchctlفقط إذا كان LaunchAgent مثبتًا؛ وإلا فاستخدمopenclaw gateway installأولًا. - استبدل العلامة بـ
bot.molt.<profile>عند تشغيل ملف شخصي مُسمّى.
الإشراف (وحدة systemd للمستخدم)¶
يثبّت OpenClaw خدمة systemd للمستخدم افتراضيًا على Linux/WSL2. نوصي بخدمات المستخدم للأجهزة أحادية المستخدم (بيئة أبسط، تهيئة لكل مستخدم). استخدم خدمة نظام للخوادم متعددة المستخدمين أو الدائمة التشغيل (لا حاجة إلى lingering، إشراف مشترك).
يكتب openclaw gateway install وحدة المستخدم. يقوم openclaw doctor بتدقيق
الوحدة ويمكنه تحديثها لتطابق الافتراضيات الموصى بها الحالية.
أنشئ ~/.config/systemd/user/openclaw-gateway[-<profile>].service:
[Unit]
Description=OpenClaw Gateway (profile: <profile>, v<version>)
After=network-online.target
Wants=network-online.target
[Service]
ExecStart=/usr/local/bin/openclaw gateway --port 18789
Restart=always
RestartSec=5
Environment=OPENCLAW_GATEWAY_TOKEN=
WorkingDirectory=/home/youruser
[Install]
WantedBy=default.target
فعّل lingering (مطلوب كي تبقى خدمة المستخدم بعد تسجيل الخروج/الخمول):
sudo loginctl enable-linger youruser
تشغيل الإعداد الأولي ينفّذ هذا على Linux/WSL2 (قد يطلب sudo؛ ويكتب /var/lib/systemd/linger).
ثم فعّل الخدمة:
systemctl --user enable --now openclaw-gateway[-<profile>].service
بديل (خدمة نظام) — للخوادم الدائمة التشغيل أو متعددة المستخدمين، يمكنك
تثبيت وحدة نظام systemd بدل وحدة المستخدم (لا حاجة إلى lingering).
أنشئ /etc/systemd/system/openclaw-gateway[-<profile>].service (انسخ الوحدة أعلاه،
بدّل WantedBy=multi-user.target، واضبط User= + WorkingDirectory=)، ثم:
sudo systemctl daemon-reload
sudo systemctl enable --now openclaw-gateway[-<profile>].service
Windows (WSL2)¶
يجب أن تستخدم تثبيتات Windows WSL2 وتتبع قسم systemd الخاص بـ Linux أعلاه.
فحوصات تشغيلية¶
- الحيوية: افتح WS وأرسل
req:connect→ توقّعresمعpayload.type="hello-ok"(مع لقطة). - الجاهزية: استدعِ
health→ توقّعok: trueوقناة مرتبطة فيlinkChannel(عند الاقتضاء). - التصحيح: اشترك في أحداث
tickوpresence؛ تأكّد من أنstatusيُظهر عمر الارتباط/التوثيق؛ وتُظهر إدخالات الحضور مضيف Gateway والعملاء المتصلين.
ضمانات السلامة¶
- افترض بوابة واحدة لكل مضيف افتراضيًا؛ إذا شغّلت ملفات متعددة، اعزل المنافذ/الحالة واستهدف النسخة الصحيحة.
- لا يوجد مسار بديل لاتصالات Baileys المباشرة؛ إذا كانت Gateway متوقفة، تفشل عمليات الإرسال سريعًا.
- تُرفَض الإطارات الأولى غير المتصلة أو JSON المشوّه ويُغلق المقبس.
- إيقاف رشيق: بث حدث
shutdownقبل الإغلاق؛ يجب على العملاء التعامل مع الإغلاق + إعادة الاتصال.
أدوات CLI المساعدة¶
openclaw gateway health|status— طلب الصحة/الحالة عبر WS الخاص بـ Gateway.openclaw message send --target <num> --message "hi" [--media ...]— إرسال عبر Gateway (مُعاد التنفيذ لـ WhatsApp).openclaw agent --message "hi" --to <num>— تشغيل دور وكيل (ينتظر النهائي افتراضيًا).openclaw gateway call <method> --params '{"k":"v"}'— مستدعي أساليب خام للتصحيح.openclaw gateway stop|restart— إيقاف/إعادة تشغيل خدمة Gateway الخاضعة للإشراف (launchd/systemd).- تفترض أوامر Gateway المساعدة وجود بوابة تعمل على
--url؛ ولم تعد تُنشئ واحدة تلقائيًا.
إرشادات الترحيل¶
- أوقف استخدام
openclaw gatewayومنفذ التحكم TCP القديم. - حدّث العملاء للتحدث ببروتوكول WS مع اتصال إلزامي وحضور مُنظَّم.