Skip to main content

نشر Fly.io

الهدف: تشغيل OpenClaw Gateway على جهاز Fly.io مع تخزين دائم، وHTTPS تلقائي، وإتاحة الوصول عبر Discord/القنوات.

ما الذي تحتاجه

  • تثبيت flyctl CLI
  • حساب Fly.io (الطبقة المجانية تعمل)
  • تفويض النموذج: مفتاح Anthropic API (أو مفاتيح موفّرين آخرين)
  • بيانات اعتماد القنوات: رمز بوت Discord، رمز Telegram، إلخ.

المسار السريع للمبتدئين

  1. استنساخ المستودع → تخصيص fly.toml
  2. إنشاء التطبيق + وحدة التخزين → تعيين الأسرار
  3. النشر باستخدام fly deploy
  4. الدخول عبر SSH لإنشاء التهيئة أو استخدام واجهة التحكم

1) إنشاء تطبيق Fly

نصيحة: اختر منطقة قريبة منك. خيارات شائعة: lhr (لندن)، iad (فيرجينيا)، sjc (سان خوسيه).

2. تهيئة fly.toml

حرّر fly.toml ليتطابق مع اسم تطبيقك ومتطلباتك. ملاحظة أمنية: التهيئة الافتراضية تكشف عنوان URL عامًا. لنشر مُحصّن بدون عنوان IP عام، راجع النشر الخاص أو استخدم fly.private.toml.
الإعدادات الأساسية:

3. تعيين الأسرار

ملاحظات:
  • الارتباطات غير المحلية (--bind lan) تتطلب OPENCLAW_GATEWAY_TOKEN لأسباب أمنية.
  • تعامل مع هذه الرموز ككلمات مرور.
  • فضّل متغيرات البيئة على ملف التهيئة لجميع مفاتيح API والرموز. هذا يُبقي الأسرار خارج openclaw.json حيث قد تُكشف أو تُسجَّل عن غير قصد.

4.

أول عملية نشر تبني صورة Docker (~2–3 دقائق). عمليات النشر اللاحقة أسرع. بعد النشر، تحقق:
يجب أن ترى:

5. إنشاء ملف التهيئة

ادخل عبر SSH إلى الجهاز لإنشاء تهيئة مناسبة:
أنشئ دليل التهيئة والملف:
ملاحظة: مع OPENCLAW_STATE_DIR=/data، يكون مسار التهيئة هو /data/openclaw.json. ملاحظة: يمكن توفير رمز Discord من أحد الخيارين:
  • متغير بيئة: DISCORD_BOT_TOKEN (مُوصى به للأسرار)
  • ملف التهيئة: channels.discord.token
إذا استخدمت متغير البيئة، فلا حاجة لإضافة الرمز إلى التهيئة. يقرأ Gateway DISCORD_BOT_TOKEN تلقائيًا. أعد التشغيل للتطبيق:

6. الوصول إلى Gateway

واجهة التحكم

افتح في المتصفح:
أو زُر https://my-openclaw.fly.dev/ الصق رمز Gateway الخاص بك (الذي من OPENCLAW_GATEWAY_TOKEN) للمصادقة.

السجلات

وحدة تحكم SSH

استكشاف الأخطاء وإصلاحها

«التطبيق لا يستمع على العنوان المتوقع»

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:
أو حدّث جهازًا موجودًا:
ملاحظة: 512MB صغيرة جدًا. قد تعمل 1GB لكنها قد تتعرّض لـ OOM تحت الحمل أو مع تسجيل مُفصّل. يُوصى بـ 2GB.

مشاكل قفل Gateway

يرفض Gateway البدء مع أخطاء «قيد التشغيل بالفعل». يحدث هذا عندما تُعاد تشغيل الحاوية بينما يبقى ملف قفل PID على وحدة التخزين. الحل: احذف ملف القفل:
يوجد ملف القفل في /data/gateway.*.lock (ليس داخل دليل فرعي).

عدم قراءة التهيئة

إذا كنت تستخدم --allow-unconfigured، ينشئ Gateway تهيئة دنيا. يجب قراءة تهيئتك المخصّصة في /data/openclaw.json عند إعادة التشغيل. تحقّق من وجود التهيئة:

كتابة التهيئة عبر 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، إلخ). لنشر مُحصّن دون تعرّض عام، استخدم القالب الخاص.

متى تستخدم النشر الخاص

  • تُجري مكالمات/رسائل صادرة فقط (لا توجد webhooks واردة)
  • تستخدم أنفاق ngrok أو Tailscale لأي ردود webhook
  • تصل إلى Gateway عبر SSH أو proxy أو WireGuard بدل المتصفح
  • تريد نشرًا مخفيًا عن ماسحات الإنترنت

الإعداد

استخدم fly.private.toml بدل التهيئة القياسية:
أو حوّل نشرًا قائمًا:
بعد ذلك، يجب أن يُظهر fly ips list فقط عنوان IP من النوع private:

الوصول إلى نشر خاص

نظرًا لعدم وجود عنوان URL عام، استخدم إحدى الطرق التالية: الخيار 1: proxy محلي (الأبسط)
الخيار 2: VPN عبر WireGuard
الخيار 3: SSH فقط

Webhooks مع النشر الخاص

إذا احتجت إلى ردود webhook (Twilio، Telnyx، إلخ) دون تعرّض عام: دون التعرض العلني: دون التعرض العلني:
  1. نفق ngrok — شغّل ngrok داخل الحاوية أو كحاوية جانبية
  2. Tailscale Funnel — اكشف مسارات محددة عبر Tailscale
  3. صادر فقط — يعمل بعض المزوّدين (Twilio) جيدًا للمكالمات الصادرة دون webhooks
مثال تهيئة مكالمة صوتية مع ngrok:
يعمل نفق ngrok داخل الحاوية ويوفّر عنوان URL عامًا للـ webhook دون تعريض تطبيق Fly نفسه. عيّن webhookSecurity.allowedHosts إلى اسم مضيف النفق العام ليتم قبول رؤوس المضيف المُعاد توجيهها.

فوائد أمنية

ملاحظات

  • يستخدم Fly.io معمارية x86 (وليس ARM)
  • ملف Dockerfile متوافق مع المعماريتين
  • لتهيئة WhatsApp/Telegram، استخدم fly ssh console
  • توجد البيانات الدائمة على وحدة التخزين في /data
  • يتطلب Signal Java + signal-cli؛ استخدم صورة مخصّصة واحتفظ بالذاكرة عند 2GB+.

التكلفة

مع التهيئة المُوصى بها (shared-cpu-2x، ذاكرة 2GB):
  • حوالي 10–15 دولارًا شهريًا حسب الاستخدام
  • تتضمن الطبقة المجانية بعض المخصصات
راجع تسعير Fly.io للتفاصيل.