الويب (Gateway)
يقدّم Gateway واجهة Control UI صغيرة في المتصفح (Vite + Lit) من المنفذ نفسه الذي يستخدمه WebSocket الخاص بـ Gateway:- الافتراضي:
http://<host>:18789/ - بادئة اختيارية: عيّن
gateway.controlUi.basePath(مثل/openclaw)
Webhooks
عندما تكونhooks.enabled=true، يكشف Gateway أيضًا عن نقطة نهاية webhook صغيرة على خادم HTTP نفسه.
راجع تهيئة Gateway ← hooks للحصول على تفاصيل المصادقة + الحمولات.
التهيئة (مفعّلة افتراضيًا)
تكون Control UI مفعّلة افتراضيًا عند وجود الأصول (dist/control-ui).
يمكنك التحكم فيها عبر التهيئة:
الوصول عبر Tailscale
Serve المدمج (موصى به)
أبقِ Gateway على local loopback ودع Tailscale Serve يمرّره كوكيل:https://<magicdns>/(أو قيمةgateway.controlUi.basePathالتي هيأتها)
الربط مع tailnet + token
http://<tailscale-ip>:18789/(أو قيمةgateway.controlUi.basePathالتي هيأتها)
الإنترنت العام (Funnel)
ملاحظات الأمان
- تكون مصادقة Gateway مطلوبة افتراضيًا (token، أو password، أو trusted-proxy، أو رؤوس هوية Tailscale Serve عند تمكينها).
- لا تزال عمليات الربط غير المعتمدة على local loopback تتطلب مصادقة gateway. عمليًا، يعني ذلك مصادقة token/password أو reverse proxy مدركًا للهوية مع
gateway.auth.mode: "trusted-proxy". - ينشئ المعالج مصادقة بالسر المشترك افتراضيًا، وعادةً ما يولّد token خاصًا بـ gateway (حتى على local loopback).
- في وضع السر المشترك، ترسل الواجهة
connect.params.auth.tokenأوconnect.params.auth.password. - في الأوضاع الحاملة للهوية مثل Tailscale Serve أو
trusted-proxy، يتم استيفاء فحص مصادقة WebSocket من رؤوس الطلب بدلًا من ذلك. - بالنسبة إلى عمليات نشر Control UI غير المعتمدة على local loopback، عيّن
gateway.controlUi.allowedOriginsصراحةً (كأصول كاملة). وبدون ذلك، يُرفض بدء تشغيل gateway افتراضيًا. - يفعّل
gateway.controlUi.dangerouslyAllowHostHeaderOriginFallback=trueوضع الرجوع إلى أصل Host-header، لكنه يُعد خفضًا خطيرًا في مستوى الأمان. - مع Serve، يمكن لرؤوس هوية Tailscale استيفاء مصادقة Control UI/WebSocket
عندما تكون
gateway.auth.allowTailscaleمساوية لـtrue(ولا حاجة إلى token/password). أما نقاط نهاية HTTP API فلا تستخدم رؤوس هوية Tailscale تلك؛ بل تتبع وضع مصادقة HTTP العادي الخاص بـ gateway بدلًا من ذلك. عيّنgateway.auth.allowTailscale: falseلفرض بيانات اعتماد صريحة. راجع Tailscale والأمان. يفترض هذا التدفق من دون token أن مضيف gateway موثوق. - تتطلب
gateway.tailscale.mode: "funnel"القيمةgateway.auth.mode: "password"(كلمة مرور مشتركة).
بناء الواجهة
يقدّم Gateway الملفات الثابتة منdist/control-ui. ابنِها باستخدام: