النشر على Fly.io
الهدف: تشغيل OpenClaw Gateway على جهاز Fly.io مع تخزين دائم وHTTPS تلقائي ووصول Discord/القنوات.ما الذي تحتاج إليه
- تثبيت flyctl CLI
- حساب Fly.io (تعمل الفئة المجانية)
- مصادقة النموذج: مفتاح API لمزوّد النموذج الذي اخترته
- بيانات اعتماد القنوات: رمز Discord bot، ورمز Telegram، وما إلى ذلك
المسار السريع للمبتدئين
- انسخ المستودع → خصص
fly.toml - أنشئ التطبيق + volume → اضبط الأسرار
- انشر باستخدام
fly deploy - اتصل عبر SSH لإنشاء التكوين أو استخدم Control UI
أنشئ تطبيق Fly
lhr (لندن)، وiad (فرجينيا)، وsjc (سان خوسيه).كوّن fly.toml
حرر الإعدادات الأساسية:
fly.toml ليتطابق مع اسم تطبيقك ومتطلباتك.ملاحظة أمنية: يكشف التكوين الافتراضي عنوان URL عامًا. وللحصول على نشر مقوى من دون عنوان IP عام، راجع النشر الخاص أو استخدم fly.private.toml.| الإعداد | السبب |
|---|---|
--bind lan | يربط على 0.0.0.0 حتى يتمكن proxy الخاص بـ Fly من الوصول إلى gateway |
--allow-unconfigured | يبدأ من دون ملف تكوين (ستنشئه لاحقًا) |
internal_port = 3000 | يجب أن يطابق --port 3000 (أو OPENCLAW_GATEWAY_PORT) لفحوصات سلامة Fly |
memory = "2048mb" | 512MB صغير جدًا؛ ويوصى بـ 2GB |
OPENCLAW_STATE_DIR = "/data" | يجعل الحالة دائمة على volume |
اضبط الأسرار
- تتطلب عمليات الربط غير الخاصة بـ loopback (
--bind lan) مسار مصادقة صالحًا لـ gateway. يستخدم مثال Fly.io هذاOPENCLAW_GATEWAY_TOKEN، لكنgateway.auth.passwordأو نشرtrusted-proxyغير loopback المكوّن بشكل صحيح يفي أيضًا بالمتطلب. - تعامل مع هذه الرموز كما لو كانت كلمات مرور.
- يفضل استخدام متغيرات البيئة بدلًا من ملف التكوين لكل مفاتيح API والرموز. فهذا يبقي الأسرار خارج
openclaw.jsonحيث قد تُكشَف أو تُسجَّل عن طريق الخطأ.
انشر
أنشئ ملف التكوين
اتصل بالجهاز عبر SSH لإنشاء تكوين صحيح:أنشئ دليل التكوين والملف:ملاحظة: مع
OPENCLAW_STATE_DIR=/data، يكون مسار التكوين هو /data/openclaw.json.ملاحظة: يمكن أن يأتي رمز 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).
OOM / مشكلات الذاكرة
تستمر الحاوية في إعادة التشغيل أو القتل. ومن العلامات:SIGABRT، أو v8::internal::Runtime_AllocateInYoungGeneration، أو عمليات إعادة تشغيل صامتة.
الإصلاح: زد الذاكرة في fly.toml:
مشكلات قفل Gateway
يرفض Gateway البدء مع أخطاء تفيد بأنه “قيد التشغيل بالفعل”. يحدث هذا عندما تُعاد تشغيل الحاوية لكن يبقى ملف قفل PID على volume. الإصلاح: احذف ملف القفل:/data/gateway.*.lock (وليس في دليل فرعي).
عدم قراءة التكوين
يتجاوز--allow-unconfigured حارس بدء التشغيل فقط. وهو لا ينشئ أو يصلح /data/openclaw.json، لذا تأكد من وجود التكوين الحقيقي لديك وأنه يتضمن gateway.mode="local" عندما تريد بدء gateway محليًا بشكل عادي.
تحقّق من وجود التكوين:
كتابة التكوين عبر SSH
لا يدعم الأمرfly ssh console -C إعادة توجيه shell. ولكتابة ملف تكوين:
fly sftp إذا كان الملف موجودًا بالفعل. احذفه أولًا:
عدم استمرار الحالة
إذا فقدت ملفات تعريف المصادقة أو حالة القنوات/المزوّد أو الجلسات بعد إعادة التشغيل، فإن دليل الحالة يكتب إلى نظام ملفات الحاوية. الإصلاح: تأكد من تعيينOPENCLAW_STATE_DIR=/data في fly.toml ثم أعد النشر.
التحديثات
تحديث أمر الجهاز
إذا احتجت إلى تغيير أمر بدء التشغيل من دون إعادة نشر كاملة:fly deploy، قد يُعاد تعيين أمر الجهاز إلى ما هو موجود في fly.toml. وإذا أجريت تغييرات يدوية، فأعد تطبيقها بعد النشر.
النشر الخاص (مقوّى)
افتراضيًا، يخصص Fly عناوين IP عامة، مما يجعل gateway لديك قابلة للوصول عندhttps://your-app.fly.dev. وهذا مناسب لكنه يعني أن نشرك يمكن اكتشافه بواسطة ماسحات الإنترنت (Shodan وCensys وغيرهما).
للحصول على نشر مقوّى من دون أي تعرّض عام، استخدم القالب الخاص.
متى تستخدم النشر الخاص
- كنت تجري فقط مكالمات/رسائل صادرة (من دون webhooks واردة)
- تستخدم ngrok أو Tailscale لأي callbacks خاصة بـ webhook
- تصل إلى gateway عبر SSH أو proxy أو WireGuard بدلًا من المتصفح
- تريد أن يكون النشر مخفيًا عن ماسحات الإنترنت
الإعداد
استخدمfly.private.toml بدلًا من التكوين القياسي:
fly ips list عنوان IP من النوع private فقط:
الوصول إلى نشر خاص
نظرًا لعدم وجود عنوان URL عام، استخدم إحدى هذه الطرق: الخيار 1: proxy محلي (الأبسط)Webhooks مع النشر الخاص
إذا كنت تحتاج إلى callbacks خاصة بـ webhook (Twilio، وTelnyx، وما إلى ذلك) من دون تعرّض عام:- نفق ngrok - شغّل ngrok داخل الحاوية أو كـ sidecar
- Tailscale Funnel - اكشف مسارات محددة عبر Tailscale
- صادر فقط - بعض المزوّدين (Twilio) يعملون جيدًا للمكالمات الصادرة من دون webhooks
webhookSecurity.allowedHosts على اسم مضيف النفق العام حتى يتم قبول رؤوس المضيف المُمرّرة.
الفوائد الأمنية
| الجانب | عام | خاص |
|---|---|---|
| ماسحات الإنترنت | قابل للاكتشاف | مخفي |
| الهجمات المباشرة | ممكنة | محظورة |
| وصول Control UI | متصفح | Proxy/VPN |
| تسليم webhook | مباشر | عبر نفق |
ملاحظات
- يستخدم Fly.io بنية x86 (وليس ARM)
- Dockerfile متوافق مع كلتا البنيتين
- بالنسبة إلى onboarding الخاص بـ WhatsApp/Telegram، استخدم
fly ssh console - تعيش البيانات الدائمة على volume عند
/data - يتطلب Signal وجود Java + signal-cli؛ استخدم صورة مخصصة وأبقِ الذاكرة عند 2GB+.
التكلفة
مع التكوين الموصى به (shared-cpu-2x، و2GB RAM):
- نحو 10-15 دولارًا شهريًا حسب الاستخدام
- تتضمن الفئة المجانية بعض الحصة
الخطوات التالية
- إعداد قنوات المراسلة: القنوات
- تكوين Gateway: تكوين Gateway
- إبقاء OpenClaw محدّثًا: التحديث