ما تحتاجه
- تثبيت flyctl CLI
- حساب Fly.io (تعمل الخطة المجانية)
- مصادقة النموذج: مفتاح API لمزوّد النموذج الذي تختاره
- بيانات اعتماد القناة: رمز بوت Discord، رمز Telegram، إلخ.
المسار السريع للمبتدئين
- استنسخ المستودع ← خصّص
fly.toml - أنشئ التطبيق + وحدة التخزين ← اضبط الأسرار
- انشر باستخدام
fly deploy - ادخل عبر SSH لإنشاء الإعدادات أو استخدم واجهة Control UI
إنشاء تطبيق Fly
lhr (لندن)، iad (فيرجينيا)، sjc (سان خوسيه).إعداد fly.toml
عدّل تستخدم صورة Docker الخاصة بـ OpenClaw
fly.toml ليطابق اسم تطبيقك ومتطلباتك.ملاحظة أمان: يكشف الإعداد الافتراضي عنوان URL عامًا. لنشر معزّز بلا IP عام، راجع النشر الخاص أو استخدم deploy/fly.private.toml.tini كنقطة دخول. تستبدل أوامر عمليات Fly أمر Docker CMD من دون استبدال ENTRYPOINT، لذلك تبقى العملية عاملة تحت tini.الإعدادات الأساسية:| الإعداد | السبب |
|---|---|
--bind lan | يربط بـ 0.0.0.0 حتى يتمكن وكيل Fly من الوصول إلى Gateway |
--allow-unconfigured | يبدأ من دون ملف إعدادات (ستنشئ واحدًا لاحقًا) |
internal_port = 3000 | يجب أن يطابق --port 3000 (أو OPENCLAW_GATEWAY_PORT) لفحوصات صحة Fly |
memory = "2048mb" | 512MB صغيرة جدًا؛ يوصى بـ 2GB |
OPENCLAW_STATE_DIR = "/data" | يحفظ الحالة على وحدة التخزين |
ضبط الأسرار
- تتطلب عمليات الربط غير local loopback (
--bind lan) مسار مصادقة صالحًا لـ Gateway. يستخدم مثال Fly.io هذاOPENCLAW_GATEWAY_TOKEN، لكنgateway.auth.passwordأو نشرtrusted-proxyغير local loopback والمُعد بشكل صحيح يفيان بالمتطلب أيضًا. - تعامل مع هذه الرموز مثل كلمات المرور.
- فضّل متغيرات البيئة على ملف الإعدادات لجميع مفاتيح API والرموز. هذا يبقي الأسرار خارج
openclaw.jsonحيث يمكن أن تُكشف أو تُسجّل بالخطأ.
النشر
إنشاء ملف الإعدادات
ادخل إلى الجهاز عبر SSH لإنشاء إعدادات مناسبة:أنشئ دليل الإعدادات والملف:ملاحظة: مع
OPENCLAW_STATE_DIR=/data، يكون مسار الإعدادات هو /data/openclaw.json.ملاحظة: استبدل https://my-openclaw.fly.dev بالأصل الحقيقي لتطبيق Fly لديك. يزرع بدء تشغيل Gateway أصول Control UI المحلية من قيم التشغيل --bind و--port حتى يمكن للإقلاع الأول المتابعة قبل وجود الإعدادات، لكن الوصول عبر المتصفح من خلال Fly لا يزال يحتاج إلى إدراج أصل HTTPS الدقيق في gateway.controlUi.allowedOrigins.ملاحظة: يمكن أن يأتي رمز Discord من أي من الآتي:- متغير البيئة:
DISCORD_BOT_TOKEN(موصى به للأسرار) - ملف الإعدادات:
channels.discord.token
DISCORD_BOT_TOKEN تلقائيًا.أعد التشغيل للتطبيق:استكشاف الأخطاء وإصلاحها
”App is not listening on expected address”
يرتبط Gateway بـ127.0.0.1 بدلًا من 0.0.0.0.
الإصلاح: أضف --bind lan إلى أمر العملية في fly.toml.
فشل فحوصات الصحة / رفض الاتصال
لا يستطيع Fly الوصول إلى Gateway على المنفذ المُعد. الإصلاح: تأكد من أنinternal_port يطابق منفذ Gateway (اضبط --port 3000 أو OPENCLAW_GATEWAY_PORT=3000).
نفاد الذاكرة / مشكلات الذاكرة
تستمر الحاوية في إعادة التشغيل أو تتعرض للقتل. العلامات:SIGABRT، أو v8::internal::Runtime_AllocateInYoungGeneration، أو عمليات إعادة تشغيل صامتة.
الإصلاح: زد الذاكرة في fly.toml:
مشكلات قفل Gateway
يرفض Gateway البدء مع أخطاء “already running”. يحدث هذا عندما تعيد الحاوية التشغيل لكن ملف قفل PID يبقى على وحدة التخزين. الإصلاح: احذف ملف القفل:/data/gateway.*.lock (وليس في دليل فرعي).
عدم قراءة الإعدادات
يتجاوز--allow-unconfigured حارس بدء التشغيل فقط. لا ينشئ أو يصلح /data/openclaw.json، لذلك تأكد من وجود إعداداتك الحقيقية وأنها تتضمن gateway.mode="local" عندما تريد بدء Gateway محلي عادي.
تحقق من وجود الإعدادات:
كتابة الإعدادات عبر SSH
لا يدعم الأمرfly ssh console -C إعادة توجيه الصدفة. لكتابة ملف إعدادات:
fly sftp إذا كان الملف موجودًا بالفعل. احذفه أولًا:
عدم استمرار الحالة
إذا فقدت ملفات تعريف المصادقة، أو حالة القناة/المزوّد، أو الجلسات بعد إعادة التشغيل، فإن دليل الحالة يكتب إلى نظام ملفات الحاوية. الإصلاح: تأكد من ضبطOPENCLAW_STATE_DIR=/data في fly.toml وأعد النشر.
التحديثات
تحديث أمر الجهاز
إذا كنت بحاجة إلى تغيير أمر بدء التشغيل من دون إعادة نشر كاملة:fly deploy، قد يُعاد ضبط أمر الجهاز إلى ما هو موجود في fly.toml. إذا أجريت تغييرات يدوية، فأعد تطبيقها بعد النشر.
النشر الخاص (المعزّز)
افتراضيًا، يخصص Fly عناوين IP عامة، مما يجعل Gateway متاحًا علىhttps://your-app.fly.dev. هذا مريح لكنه يعني أن نشرك قابل للاكتشاف بواسطة ماسحات الإنترنت (Shodan وCensys وغيرها).
لنشر معزّز بلا تعرض عام، استخدم القالب الخاص.
متى تستخدم النشر الخاص
- تجري مكالمات/رسائل صادرة فقط (لا Webhook واردة)
- تستخدم أنفاق ngrok أو Tailscale لأي عمليات رد Webhook
- تصل إلى Gateway عبر SSH أو وكيل أو WireGuard بدلًا من المتصفح
- تريد أن يكون النشر مخفيًا عن ماسحات الإنترنت
الإعداد
استخدمdeploy/fly.private.toml بدلًا من الإعداد القياسي:
fly ips list عنوان IP واحدًا فقط من النوع private:
الوصول إلى نشر خاص
بما أنه لا يوجد عنوان URL عام، استخدم إحدى هذه الطرق: الخيار 1: وكيل محلي (الأبسط)Webhooks مع النشر الخاص
إذا كنت تحتاج إلى استدعاءات Webhook راجعة (Twilio، Telnyx، وما إلى ذلك) من دون تعريض عام:- نفق ngrok - شغّل ngrok داخل الحاوية أو كحاوية جانبية
- Tailscale Funnel - عرّض مسارات محددة عبر Tailscale
- صادر فقط - يعمل بعض المزوّدين (Twilio) بشكل جيد للمكالمات الصادرة من دون Webhooks
webhookSecurity.allowedHosts على اسم مضيف النفق العام حتى تُقبَل ترويسات المضيف المُمرَّرة.
فوائد الأمان
| الجانب | عام | خاص |
|---|---|---|
| أدوات فحص الإنترنت | قابل للاكتشاف | مخفي |
| الهجمات المباشرة | ممكنة | محظورة |
| الوصول إلى واجهة التحكم | متصفح | وكيل/VPN |
| تسليم Webhook | مباشر | عبر نفق |
ملاحظات
- يستخدم Fly.io معمارية x86 (وليس ARM)
- ملف Dockerfile متوافق مع كلتا المعماريتين
- لإعداد WhatsApp/Telegram، استخدم
fly ssh console - تعيش البيانات الدائمة على وحدة التخزين في
/data - يتطلب Signal Java + signal-cli؛ استخدم صورة مخصصة وأبقِ الذاكرة عند 2GB+.
التكلفة
مع الإعداد الموصى به (shared-cpu-2x، وذاكرة 2GB RAM):
- نحو 10-15 دولارًا أمريكيًا/شهرًا حسب الاستخدام
- تتضمن الطبقة المجانية قدرًا من الحصة
الخطوات التالية
- إعداد قنوات المراسلة: القنوات
- تهيئة Gateway: تهيئة Gateway
- إبقاء OpenClaw محدّثًا: التحديث