لماذا تستضيف حزمة تطوير Docker على خادم VPS؟
تعمل بيئة التطوير المحلية، لكنها تبقى مرتبطة بجهاز واحد: فتغيير محطة العمل أو إدماج زميل جديد أو الوصول من بلد آخر يصبح كله مصدر احتكاك. بمركزة حزمة Docker الخاصة بك على خادم VPS، تحصل على خادم تطوير مشترك، يعمل دائمًا، ويمكن الوصول إليه عبر SSH أو المتصفح من أي مكان. تكسب أيضًا في قابلية إعادة الإنتاج: إذ يُعرَّف كل خدمة في ملف docker-compose.yml، ما يقضي على مشكلة « إنه يعمل على جهازي » الشهيرة.
ما يمكنك فعله بحزمة تطوير Docker
- تشغيل عدة خدمات في آنٍ واحد (Nginx وMySQL وRedis وPHP-FPM وNode.js) في حاويات معزولة دون تعارض في المنافذ أو الإصدارات
- مشاركة بيئة تطوير متطابقة بين جميع أعضاء الفريق بفضل ملف docker-compose.yml المُدار بإصدارات في Git
- اختبار عمليات ترحيل قاعدة البيانات أو تحديثات التبعيات في حاوية مؤقتة دون المخاطرة بالبيئة الرئيسية
- استضافة خادم CI/CD خفيف (Gitea وDrone CI) مباشرة على خادم VPS نفسه لأتمتة عمليات النشر الداخلية
- الوصول إلى خدمات التطوير عبر نطاقات فرعية أو reverse proxies من نوع Traefik/Nginx دون فتح منافذ غير ضرورية
- نسخ حزمتك بالكامل احتياطيًا واستعادتها بأوامر قليلة بفضل أحجام Docker ولقطات (snapshots) خادم VPS
المتطلبات الأساسية: الحد الأدنى الموصى به
تستهلك حزمة كاملة تشمل PostgreSQL وRedis وNginx وتطبيقًا ما 4 غيغابايت من RAM على الأقل — في حال أقل من ذلك، يُوقف Docker OOM killer تشغيل PostgreSQL أو Redis في منتصف عملية ترحيل دون رسالة خطأ على مستوى التطبيق. يجب أن يعمل خادم VPS على Ubuntu 22.04 LTS أو Debian 12، مع تثبيت Docker Engine 26+ وDocker Compose v2.22+ (الأمر يُكتب docker compose بدون شرطة). تحقق من الإصدار بـ docker compose version: تتطلب ميزة watch المستخدمة لاحقًا الإصدار v2.22 على الأقل، الذي صدر في سبتمبر 2023.
مكونات الحزمة: دور كل خدمة
تجمع حزمة مرجع ServOrbit ستة خدمات متكاملة.
Nginx يلعب دور reverse proxy أمامي: يستقبل طلبات HTTP على المنفذ 80 ويوجهها إلى PHP-FPM (عبر FastCGI) أو إلى خادم Node.js. ضبط nginx/default.conf مُحمَّل كـ volume ليبقى قابلًا للتعديل دون إعادة بناء الصورة.
PHP-FPM 8.3 (أو Node.js 22 حسب ملف الحزمة) ينفِّذ كود التطبيق. كلا الخيارين متاحان في Marketplace ServOrbit؛ يتضمن ملف docker-compose.yml الخدمتين — عطِّل التي لا تحتاجها باستخدام profiles.
PostgreSQL 16 يخزِّن البيانات الدائمة. المنفذ 5432 غير مكشوف على المضيف افتراضيًا — يصل إليه فقط شبكة Docker الداخلية dev_net، مما يمنع أي كشف عرضي على عنوان IP العام للخادم.
Redis 7 يعمل كـ cache وكوسيط رسائل. كـ PostgreSQL، يبقى على الشبكة الداخلية (المنفذ 6379) ويمكن الوصول إليه من كود التطبيق باسم الخدمة redis.
Mailpit 1.x يحل محل خادم SMTP حقيقي أثناء التطوير: يلتقط جميع رسائل البريد الإلكتروني الصادرة ويعرضها في واجهة ويب على المنفذ 8025. لا يلزم أي إعداد SMTP خاص جهة التطبيق — ما عليك سوى الإشارة إلى mailpit:1025.
Adminer (المنفذ 8080) يوفر واجهة ويب خفيفة لإدارة PostgreSQL أو MySQL دون عميل ثقيل. لا يمكن الوصول إليه إلا من الخادم نفسه أو عبر SSH tunnel.
تثبيت حزمة تطوير Docker على خادم VPS من ServOrbit
اطلب خادم VPS Cloud من ServOrbit
توجَّه إلى صفحة /vps-cloud واختر عرضًا مناسبًا لاستخدامك. بالنسبة لحزمة تطوير قياسية (بضع حاويات، قاعدة بيانات، reverse proxy)، يشكِّل خادم VPS بـ 2 vCPU و4 غيغابايت من RAM نقطة انطلاق جيدة. أكمل الطلب: يُجهَّز خادم VPS الخاص بك في أقل من 60 ثانية على نظام Ubuntu 22.04 LTS.
الوصول إلى Marketplace في مساحة العميل
سجِّل الدخول إلى مساحة العميل الخاصة بك على ServOrbit، ثم افتح قسم « Marketplace » من لوحة معلومات خادم VPS الخاص بك. يسرد Marketplace جميع التطبيقات المتاحة للتثبيت بنقرة واحدة، مُنظَّمة حسب الفئة. اختر فئة « التطوير » لتصفية الحزم الموجَّهة للتطوير.
بدء تثبيت حزمة تطوير Docker
انقر على بطاقة « Docker Dev Stack »، ثم على زر « Install ». تنشر الأتمتة Docker Engine وDocker Compose وملف docker-compose.yml مُهيَّأ مسبقًا مع الخدمات الأساسية (Nginx وPHP-FPM وPostgreSQL 16 وRedis وMailpit لاختبار الرسائل الإلكترونية وAdminer). يستغرق التثبيت الكامل عادةً بين دقيقتين و4 دقائق حسب حجم خادم VPS.
استرجاع بيانات الاعتماد والوصول إلى الواجهة
بمجرد اكتمال التثبيت، تعرض مساحة العميل معلومات الاتصال المُولَّدة تلقائيًا: عنوان IP لخادم VPS، وكلمة مرور PostgreSQL، وعنوان URL للوصول إلى Mailpit (افتراضيًا على المنفذ 8025). اتصل عبر SSH باستخدام
ssh root@<IP_VPS>للتحقق من حالة الحاويات عبرdocker compose psفي الدليل/opt/docker-dev-stack.تهيئة مشروعك الأول وتخصيص الحزمة
انسخ شيفرتك المصدرية إلى
/opt/docker-dev-stack/app/أو عدِّل ملف/opt/docker-dev-stack/docker-compose.ymlلإضافة أو إزالة خدمات وفق احتياجاتك. أعد تشغيل الحزمة باستخدامdocker compose up -dلتطبيق التغييرات. لعرض خدماتك على اسم نطاق، هيِّئ سجل DNS يشير إلى عنوان IP لخادم VPS وكيِّف تهيئة Nginx المضمَّنة في الدليل/opt/docker-dev-stack/nginx/.أول تسجيل دخول
لا يوجد حساب لإنشائه: يفتح الرابط مباشرة صندوق البريد التجريبي Mailpit، دون كلمة مرور. أما PostgreSQL (المنفذ 5432) وRedis (المنفذ 6379) فلا يمكن الوصول إليهما إلا من الخادم نفسه؛ وتجدون بيانات اعتماد Postgres في الملف
/opt/docker-dev-stack/.env.
ضبط الخدمات: الأحجام والشبكات ومتغيرات البيئة
يُعلن ملف docker-compose.yml الخاص بالحزمة عن ثلاثة أحجام مسمَّاة — postgres_data وredis_data وapp_data — مُحمَّلة في /var/lib/postgresql/data و/data و/var/www/html على التوالي. هذه الأحجام تنجو من docker compose down: تبقى بيانات قاعدة البيانات والملفات المرفوعة سليمة بين عمليات إعادة التشغيل.
تشترك جميع الخدمات في شبكة dev_net الداخلية من نوع bridge. Nginx هو الخدمة الوحيدة التي تكشف منفذًا على المضيف (80)؛ أما البقية فتبقى معزولة وتتواصل باسم الخدمة — postgres وredis وmailpit.
المتغيرات الحساسة (كلمة مرور PostgreSQL، المفتاح السري للتطبيق) لا تُكتَب أبدًا بشكل مباشر في docker-compose.yml. تُقرأ من /opt/docker-dev-stack/.env عبر التوجيه env_file. هذا الملف مُستبعَد من مستودع Git بواسطة .gitignore. يمكن لمتغيرات البيئة غير الحساسة (المنفذ، إصدار PHP، اسم القاعدة) أن تظهر مباشرة في ملف Compose تحت مفتاح environment، لتكون مرئية عند مراجعة الكود.
الوصول من الحاسوب المحمول: SSH tunneling وreverse proxy
PostgreSQL وAdminer وRedis غير مكشوفة على عنوان IP العام للخادم. للوصول إليها من جهازك المحلي، افتح SSH tunnel: ssh -L 5432:localhost:5432 -L 8080:localhost:8080 root@<IP_VPS> ينشئ توجيهَين محليَّين — منفذ 5432 على حاسوبك يشير إلى PostgreSQL، ومنفذ 8080 إلى Adminer. يتصل عميل SQL المعتاد لديك على localhost:5432 كأن قاعدة البيانات تعمل محليًا.
لخدمات HTTP (Nginx وMailpit)، هناك مقاربتان. إن توفّر لديك اسم نطاق، أعد ضبط سجل A ليشير إلى عنوان IP للخادم وضبط Nginx لخدمة dev.yourdomain.com عبر HTTP بسيط (دون TLS في بيئة تطوير). وإن عملت دون نطاق، يكفي SSH tunnel: ssh -L 8025:localhost:8025 root@<IP_VPS> يتيح الوصول إلى Mailpit على localhost:8025.
أفضل الممارسات: التطوير مقابل الإنتاج
في التطوير، يمركز ملف .env جميع الأسرار. في الإنتاج، تحل أسرار Docker (docker secret) أو مدير أسرار خارجي (Vault أو AWS Secrets Manager) محل الملف الاعتيادي — فملف .env مُصادَق عليه بالخطأ يكشف بيانات الاعتماد في تاريخ Git.
تستحق حدود الموارد (deploy.resources.limits) الضبط منذ مرحلة التطوير: قد يستهلك PostgreSQL كل RAM المتاحة إذا انحرف استعلام ما. ابدأ بـ memory: 512m على PostgreSQL وبـ memory: 256m على Redis وبـ memory: 256m على PHP-FPM، ثم اضبط حسب ملفات الاستخدام الفعلية.
لا تُحمِّل أبدًا socket Docker (/var/run/docker.sock) في حاوية تطبيق إلا عند الضرورة القصوى: حاوية تصل إلى هذا الـ socket يمكنها إطلاق حاويات أخرى بامتيازات root على المضيف. في التطوير المخاطرة محدودة، لكن العادات المكتسبة هنا تُعاد في الإنتاج.
إعادة التحميل الفوري مع docker compose watch
يُقدِّم Docker Compose v2.22+ الأمرَ docker compose watch، المتاح منذ سبتمبر 2023. فعِّله بإضافة كتلة develop.watch في خدمة app من ملف docker-compose.yml: حدِّد المسارات المراقَبة والإجراء المرتبط (sync لنسخ الملفات إلى الحاوية دون إعادة تشغيلها، أو rebuild لإعادة بناء الصورة). ثم شغِّل docker compose watch بدلًا من docker compose up -d: تُنشر تعديلات الملفات فورًا داخل الحاوية، دون إعادة تشغيل يدوية. تحقق من إصدارك أولًا بـ docker compose version.
متغيرات الحزمة حسب نوع مشروعك
مرّر الجدول أفقيًا
| الحزمة | الخدمات الرئيسية | حالة الاستخدام | RAM الموصى بها |
|---|---|---|---|
| LAMP | Nginx + PHP-FPM 8.3، MariaDB 10.11، Redis | WordPress وOctoberCMS وLaravel | 4 غيغابايت |
| MERN | Node.js 22، MongoDB 7، Redis | REST API + React/Vue SPA | 4 غيغابايت |
| Django / PostgreSQL | Python 3.12، PostgreSQL 16، Redis، Celery | تطبيقات Python وML وDjango REST API | 4 غيغابايت |
| PHP + PostgreSQL | Nginx + PHP-FPM 8.3، PostgreSQL 16، Redis، Mailpit | Symfony وAPI Platform وDrupal | 4 غيغابايت |
| Full Node | Node.js 22، PostgreSQL 16، Redis، Mailpit | NestJS وExpress وFastify | 4 غيغابايت |
استكشاف الأخطاء: 4 أخطاء شائعة
المنفذ مشغول بالفعل. الخطأ Bind for 0.0.0.0:80 failed: port is already allocated يدل على أن خدمة على المضيف (Apache أو nginx النظامي) تستمع بالفعل على المنفذ 80. أوقف الخدمة النظامية (systemctl stop nginx أو systemctl stop apache2) أو غيِّر منفذ المضيف في docker-compose.yml إلى "8080:80" وصِل إلى الحزمة على المنفذ 8080.
صلاحيات الحجم. خطأ Permission denied على حجم مُحمَّل يأتي غالبًا من uid/gid مختلف في الحاوية عن المضيف. أضف user: "1000:1000" في الخدمة المعنية، أو غيِّر صلاحيات الدليل على المضيف بـ chown -R 1000:1000 /opt/docker-dev-stack/app.
شبكة bridge غير موجودة. الرسالة network dev_net declared as external, but could not be found تظهر إن استخدمت external: true على شبكة لم تُنشأ بعد. احذف external: true: ينشئ Docker Compose الشبكة تلقائيًا عند أول docker compose up.
RAM غير كافية. يعرض PostgreSQL FATAL: out of memory أو يُعيد التشغيل باستمرار إن كان VPS بحجم غير كافٍ. تحقق بـ free -m: يجب توفُّر 4 غيغابايت على الأقل للحزمة الكاملة. قلِّص shared_buffers في ضبط PostgreSQL (command: postgres -c shared_buffers=128MB) أو انتقل إلى عرض VPS أعلى.
نصيحة احترافية: التقط لقطة (snapshot) عند الطلب لخادم VPS من ServOrbit من مساحة العميل قبل إجراء تعديلات عميقة على تهيئة Docker. تتيح لك اللقطة العودة إلى حالة مستقرة بنقرة واحدة إذا كسر تحديث حاوية أو تغيير في ملف Compose بيئتك. تذكَّر أيضًا استخدام ملف .env لتخزين متغيراتك الحساسة (كلمات المرور، مفاتيح API) واستبعاده من مستودع Git الخاص بك عبر .gitignore — حتى على خادم تطوير، تلك عادة جيدة يُستحسن ترسيخها من البداية.
الوثائق الرسمية
للتهيئة المتقدِّمة والخيارات الخاصة بالأداة وتغييرات الإصدار، راجع الوثائق الرسمية لـ Docker Compose. يغطِّي هذا الدليل النشر على خادم VPS من ServOrbit؛ وتبقى وثائق الناشر المرجع للضبط الدقيق.