كيفية استضافة OpenHands على VPS باستخدام Docker
ثبّت OpenHands على VPS بنظام Ubuntu 24.04 عبر Docker، واحمِ واجهة الويب ومفاتيح API، لأن الوصول إلى مقبس Docker يعادل عملياً صلاحيات root.
ما هو OpenHands، والخطر الوحيد الذي يجب فهمه أولاً
OpenHands، الذي كان يُعرف سابقاً باسم OpenDevin، هو وكيل مستقل لهندسة البرمجيات. تعطيه مهمة بلغة واضحة، فيخطط للعمل، ويكتب التعليمات البرمجية، وينفّذ الأوامر، ويقرأ المخرجات، ويكرّر هذه الخطوات حتى تكتمل المهمة. تشغّله على خادمك باستخدام Docker، وتربطه بنموذج لغوي. على VPS، يصبح وكيلاً برمجياً يعمل أثناء غيابك.
يجب أن تحدد حقيقة واحدة طريقة إعدادك بالكامل. لا يكتفي OpenHands باقتراح التعليمات البرمجية، بل ينفّذها أيضاً. ولتحقيق ذلك، يربط حاويته المتحكّمة بمقبس Docker الخاص بالمضيف عند /var/run/docker.sock، حتى يتمكن من إنشاء حاويات sandbox لكل مهمة. يمكن لأي شيء يستطيع الاتصال بمقبس Docker بدء حاوية جديدة تربط نظام ملفات المضيف بالكامل، ما يعني أن الوصول إلى المقبس يعادل عملياً امتلاك صلاحيات root على الجهاز. لذلك تعامل مع خادم OpenHands على أنه خادم ينفّذ تعليمات برمجية غير موثوقة، فهذا هو ما يفعله فعلياً. وكل خيار من خيارات التحصين أدناه ناتج عن هذه الحقيقة.
ما تحتاج إليه
تحتاج إلى VPS يعمل بنظام Ubuntu 24.04، مع إصدار حديث من Docker Engine، وذاكرة RAM بسعة 4 GB على الأقل، ومفتاح API لنموذج لغوي من OpenAI أو Anthropic أو Google، أو نموذج محلي يوفّره Ollama على VPS نفسه. يدعم OpenHands عشرات الواجهات الخلفية للنماذج، لذا يمكنك اختيار ما يناسبك. إذا لم يسبق لك إعداد الحاويات، فإن أساسيات Docker على VPS تغطي المتطلبات التي يفترضها هذا الدليل.
التثبيت باستخدام Docker
يُصدَر OpenHands في صورتين: صورة التطبيق التي تشغّلها، وصورة agent-server التي يسحبها لتشغيل sandbox الخاصة بكل مهمة. شغّله كما يلي، مع استبدال الوسوم الحالية الواردة في وثائق المشروع:
docker run -it --rm --pull=always \
-e AGENT_SERVER_IMAGE_REPOSITORY=ghcr.io/openhands/agent-server \
-e AGENT_SERVER_IMAGE_TAG=1.26.0-python \
-e LOG_ALL_EVENTS=true \
-v /var/run/docker.sock:/var/run/docker.sock \
-v ~/.openhands:/.openhands \
-p 127.0.0.1:3000:3000 \
--add-host host.docker.internal:host-gateway \
--name openhands \
docker.openhands.dev/openhands/openhands:1.8هناك تفصيلان يجنّبانك ساعة من الالتباس. تحمل صورة التطبيق وصورة agent-server أرقام إصدارات مختلفة عن قصد، لذلك لا تحاول توحيدهما. استخدم وسم agent-server الذي توصي الوثائق باستخدامه مع إصدار التطبيق. لاحظ أيضاً استخدام -p 127.0.0.1:3000:3000 بدلاً من -p 3000:3000. هذا التغيير وحده هو الفارق بين Web UI لا يمكنك الوصول إليها إلا أنت، وWeb UI يمكن للإنترنت بأكمله الوصول إليها. ويتناول القسم التالي هذا الموضوع.
أبقِ واجهة Web UI خارج الإنترنت العام
يخدم OpenHands واجهته على المنفذ 3000. تتحكم هذه الواجهة في agent ينفّذ التعليمات البرمجية، لذلك فإن نشرها على الإنترنت يمنح أي شخص يعثر عليها مساراً عن بُعد إلى عملية تنفّذ الأوامر. اربطها بواجهة loopback، كما يفعل أمر التشغيل أعلاه، ثم صِل إليها من حاسوبك المحمول عبر نفق SSH:
ssh -L 3000:127.0.0.1:3000 you@your-vpsافتح بعد ذلك http://127.0.0.1:3000 على جهازك أنت. تمر حركة الشبكة عبر جلسة SSH الحالية، ولا توجد خدمة جديدة تستمع على الإنترنت العام. لا يحتاج كل agent إلى منفذ أصلاً: تتبادل جلسات Claude Code على VPS نفسه الرسائل عبر الطرفية، لذلك لا تكشف إلا SSH نفسه. ومن المفيد تطبيق أسلوب loopback والنفق نفسه على كل لوحة تحكم agent تستضيفها؛ الوصول إلى واجهة الفحص في open-kritt عبر نفق يعمل بالطريقة نفسها، ولكن على المنفذ 5173. ولإعداد أكثر استمرارية، ضعها خلف VPN بدلاً من ذلك. في كلتا الحالتين، ضع جداراً نارياً بسياسة منع افتراضية أمام الخادم حتى لا تُكشف أي خدمة عن طريق الخطأ، وتذكّر أن الجدار الناري الذي يغطي IPv4 فقط يترك المنفذ نفسه مفتوحاً عبر IPv6، وهذه هي فجوة جدار IPv6 الناري التي توقع كثيراً من الأشخاص في المشكلة.
اعزل مفتاح النموذج وبيانات اعتماد المستودعات
يحتاج OpenHands إلى API key لنموذجه، وغالباً إلى token لاستنساخ مستودعاتك ودفع التغييرات إليها. يمكن لكليهما إنفاق المال والتصرف نيابةً عنك، لذلك تعامل معهما مثل كلمات المرور. احتفظ بهما في ملف بيئة لا يستطيع قراءته إلا الحساب المصرّح له، ولا تضعهما أبداً في أمر التشغيل، حيث سيظهران في سجل أوامر الصدفة وقائمة العمليات، ولا في ملف داخل مستودع git. إذا احتفظت بالنسخ الأصلية في مدير كلمات مرور مستضاف ذاتياً، فأمّن ذلك الخادم أيضاً، لأن نقاط الضعف في vault تكون في admin token وملف النسخ الاحتياطي، لا في العناصر المشفّرة نفسها، كما يوضح دليل تقوية Vaultwarden.
شغّله على خادم يمكنك التخلّي عنه
لأن وحدة التحكم يجب أن تتصل بـDocker socket، لا يمكنك عزل OpenHands بالكامل عن مضيفه. الإجراء الواقعي هو العزل عبر اختيار موضع التشغيل: شغّل OpenHands على VPS مخصص لا يحتوي على أي شيء آخر يهمك، وليس على الخادم الذي يشغّل قاعدة بياناتك أو موقعك أيضاً. أنشئ snapshot قبل البدء، ثم أعد بناء الخادم منه بدلاً من الوثوق بخادم شغّل شيفرة كتبها وكيل لمدة أسبوع. يُعد VPS رخيصاً وقابلاً للتخلّي عنه ومخصصاً لغرض واحد المكان المناسب لتشغيله. اختيار موضع التشغيل هو وسيلة التحكم الوحيدة التي يوفّرها OpenHands فعلياً هنا. لذلك، إذا كنت تريد أيضاً التحكم في مقدار ما يمكن للوكيل تنفيذه قبل أن يتوقف لطلب الإذن، توضّح أوضاع أذونات Claude Code شكل وسيلة التحكم الثانية هذه على خادم لا يراقبه أحد.
حصِّن الخادم الذي يستضيفه
بقية الخطوات تندرج ضمن ممارسات تأمين الخادم المعتادة. لكنها أهم هنا من المعتاد لأن عبء العمل أكثر خطورة من المعتاد. أنشئ مستخدماً إدارياً غير مميّز بدلاً من العمل باستخدام root، واتبع تشغيل الخدمات باستخدام مستخدم غير مميّز. اضبط SSH لاستخدام المصادقة بالمفاتيح فقط. ثم نفّذ قائمة التحقق أدناه واحتفظ بها في مكان ستراها فيه مجدداً.
لفهم المكوّنات بدلاً من تنفيذها فقط، راجع إنشاء وكيل AI خاص بك على VPS؛ وإذا كنت تفضّل منصة تتطلب كتابة شيفرة أقل، فإن الاستضافة الذاتية لـ Dify تمثّل نقطة بداية أسهل.
FAQ
هل تشغيل OpenHands على خادم آمن؟
يمكن أن يكون آمناً مع اتخاذ الاحتياطات، لكنه أكثر خطورة من تطبيق ويب عادي لأنه يكتب التعليمات البرمجية ويشغّلها، كما أن وحدة التحكم فيه تحتفظ بمقبس Docker الخاص بالمضيف، وهذا يعادل امتلاك صلاحيات root على الجهاز. شغّله على VPS مخصص وقابل لإعادة الإنشاء، ولا يحتوي على أي بيانات مهمة أخرى. أبقِ Web UI متاحاً على loopback خلف نفق SSH أو VPN، واعزل مفاتيحه، وعزّز إعدادات الخادم. لا تشغّله بجوار خدماتك المهمة.
لماذا يحتاج OpenHands إلى مقبس Docker؟
يشغّل OpenHands كل مهمة داخل حاوية sandbox جديدة، ويطلب من Docker daemon على المضيف إنشاء هذه الحاويات عبر تركيب /var/run/docker.sock داخل وحدة التحكم. يمنح ذلك حاوية وحدة التحكم صلاحية التحكم في Docker على المضيف. وهذه صلاحية قوية تنطوي على مخاطر، لذلك يجب التعامل مع المضيف نفسه على أنه يشغّل تعليمات برمجية غير موثوقة.
هل يمكن لـ OpenHands استخدام نموذج محلي بدلاً من API مدفوعة؟
نعم. يدعم OpenHands النماذج المحلية التي يوفّرها Ollama أو vLLM، لذا يمكنك تشغيله بالكامل باستضافة ذاتية من دون تكلفة لكل token ومن دون مغادرة البيانات لخادمك. تحتاج إلى جهاز يملك ذاكرة كافية لتشغيل نموذج برمجة قادر، وهذا هو سؤال تحديد الحجم نفسه الموضح في دليل Ollama.
هل ينبغي أن أشغّل OpenHands على خادمي الرئيسي؟
لا. لأنه يشغّل تعليمات برمجية ينشئها الوكيل ويحتفظ بمقبس Docker، أبقه على VPS منفصل مخصص لغرض واحد، وكن مستعداً لإعادة إنشائه. يعني وضعه مع قاعدة بيانات أو موقع ويب أو خدماتك الأخرى أن خطأ من الوكيل، أو خللاً فيه، قد يصل إلى موارد لم يكن من المفترض أن يلمسها.