لماذا تختار CapRover بدلًا من منصة PaaS سحابية
نشر تطبيق على خادم VPS خام يعني تهيئة Nginx وشهادات TLS وDocker وعمليات إعادة التشغيل يدويًا عند كل إصدار. يزيل CapRover هذا العبء: فهو يعتمد على Docker Swarm لتنسيق حاوياتك، ويولّد شهادات Let's Encrypt تلقائيًا، ويوفّر نشرًا عبر git push أو صورة Docker جاهزة. يغطي كتالوجه «One-Click Apps» ووردبريس وPostgreSQL وRedis وMongoDB وGhost وأكثر من مئة خدمة أخرى، كلٌّ منها في حاويتها الخاصة. حيث تفرض Heroku أو Render رسومًا بالـdyno أو بساعة الحوسبة، يعمل CapRover على خادم VPS الخاص بك بالتكلفة الشهرية الثابتة لخادمك — الخيار الطبيعي للمطورين والوكالات التي تريد إنتاجية منصة PaaS دون فاتورة متغيرة.
الفوائد الملموسة لـ CapRover
- النشر عبر
git pushأوcaprover deployدون إعادة تهيئة الخادم عند كل إصدار. - شهادات SSL تلقائية ومُجدّدة من Let's Encrypt لكل نطاق ونطاق فرعي للتطبيق.
- كتالوج One-Click: أكثر من 100 خدمة (قواعد بيانات، CMS، أدوات DevOps) ببضع نقرات.
- توسّع أفقي أصيل عبر Docker Swarm: أضِف عُقد worker أثناء التشغيل دون تغيير تطبيقاتك.
- واجهة ويب مع سجلّات مباشرة، ومتغيرات بيئة، وحفظ دائم للبيانات، ومراقبة Netdata.
- خطافات بناء قابلة للتكامل مع GitHub Actions أو GitLab CI أو Bitbucket من أجل CI/CD كامل.
- تحديث CapRover ذاتيًا بنقرة واحدة من لوحة التحكم دون الوصول إلى الخادم.
متطلبات الأجهزة والشبكة
يحجز CapRover ذاكرة لـ Docker Swarm ومحرك البناء. خادم VPS بذاكرة 2 غيغابايت من RAM ومعالج vCPU واحد يكفي للمشاريع الشخصية وبضعة تطبيقات صغيرة؛ انتقل إلى 4 غيغابايت من RAM ومعالجَي vCPU بمجرد أن تستضيف عدة تطبيقات مع قواعد بياناتها. خصّص 30 غيغابايت من SSD على الأقل، لأن كل عملية بناء Docker تستهلك مساحة قرص مؤقتة. يُنصح بشدة باستخدام نطاق wildcard — مثل *.apps.mydomain.com — حتى يولّد CapRover نطاقات فرعية أثناء التشغيل لكل تطبيق. يجب أن تكون المنافذ 80 و443 و3000 (لوحة الإدارة) مفتوحة. منذ الإصدار 1.14، يتطلب CapRover إصدار Docker API بحد أدنى 1.43؛ وقد أصلح الإصدار 1.14.1 مشكلة التوافق التي أدخلها Docker v29 والتي رفعت هذا الحد إلى 1.44. تحقق من إصدارك بـ docker version | grep API قبل أي تحديث.
ثبّت CapRover وانشر تطبيقك الأول
ابدأ التثبيت بأمر واحد
على نظام Ubuntu نظيف بدون Docker مثبَّت مسبقًا، نفّذ docker run -p 80:80 -p 443:443 -p 3000:3000 -v /var/run/docker.sock:/var/run/docker.sock -v /captain:/captain caprover/caprover. يهيّئ CapRover نظام Docker Swarm ويبدأ لوحة الإدارة على المنفذ 3000. تثبّت صورة Docker كل شيء تلقائيًا — لا توجد اعتماديات يجب تثبيتها مسبقًا.
هيّئ نطاق wildcard
أنشئ سجل DNS من نوع A wildcard يوجّه *.apps.mydomain.com إلى IP خادم VPS. في لوحة الإدارة (http://YOUR_IP:3000)، أدخِل هذا النطاق الجذر. سيستخدمه CapRover كلاحقة لجميع تطبيقاتك وسيفعّل HTTPS عبر Let's Encrypt بنقرة واحدة.
ثبّت واجهة سطر الأوامر وسجّل الدخول
على جهاز التطوير الخاص بك: npm install -g caprover ثم caprover login. أدخِل الرابط https://captain.apps.mydomain.com وكلمة المرور التي حددتها في الخطوة السابقة. تحتفظ واجهة سطر الأوامر بالاتصال لعمليات النشر اللاحقة. إذا فعّلت المصادقة الثنائية، استخدم token التطبيق بدلًا من كلمة المرور.
أعدّ ملف captain-definition
أضِف ملف captain-definition في جذر مشروعك. تنسيق v2 (الموصى به) لا يعدو سطرين: { "schemaVersion": 2, "dockerfilePath": "./Dockerfile" }. لنشر صورة Docker جاهزة بدلًا من البناء من المصدر، استبدل dockerfilePath بـ "imageName": "your-image:tag". يظل تنسيق v1 مع dockerfileLines مدعومًا لكنه يُعدّ legacy.
أنشئ التطبيق وانشره
في اللوحة، أنشئ تطبيقًا باسم my-api. ثم من مستودع Git الخاص بك: caprover deploy. يبني CapRover الصورة وفق captain-definition، يرسلها إلى Docker Swarm ويعرض التطبيق على https://my-api.apps.mydomain.com. من أجل النشر دون توقف، لا يبدّل CapRover حركة البيانات إلا بعد أن تجتاز الحاوية الجديدة فحوصات السلامة.
أضِف قاعدة بيانات واحفظ البيانات بشكل دائم
من علامة تبويب One-Click Apps، ثبّت PostgreSQL. ينشئ CapRover قاعدة البيانات في حاوية مخصصة ويولّد متغيرات البيئة (POSTGRES_PASSWORD، POSTGRES_HOST…). اربط تطبيقك بهذه المتغيرات في تبويب App Configs، ثم فعّل Persistent Directory في التبويب المخصص حتى تبقى البيانات بين عمليات إعادة النشر. تُخزَّن الأحجام (volumes) تحت /var/lib/docker/volumes/captain--VOLUME_NAME/_data على المضيف.
دمج CapRover في مسار CI/CD مع GitHub Actions
يكشف CapRover عن webhook بناء لكل تطبيق، يمكن الوصول إليه في تبويب Deployment لكل تطبيق. يُطلق هذا الـwebhook عملية نشر كاملة عند كل طلب HTTP POST. للتكامل مع GitHub Actions، خزّن ثلاثة أسرار في مستودعك: CAPROVER_SERVER (رابط نسختك)، وAPP_NAME (اسم التطبيق في CapRover)، وAPP_TOKEN (token النشر المعروض في تبويب Deployment). تتوفر action رسمية على GitHub Marketplace هي caprover/deploy-from-github: تتولى بناء ملف tar النشر وإرساله إلى CapRover في خطوة واحدة. مثال لمهمة بسيطة: بعد npm run build الذي ينتج مجلد dist/، أنشئ أرشيفًا يحتوي على dist/ وملف captain-definition، ثم استدعِ الـaction بأسرارك الثلاثة. يُغني الجمع بين webhook وGitHub Actions عن واجهة سطر الأوامر المحلية في الفرق: كل push إلى main يُطلق نشرًا تلقائيًا، دون تداول مفاتيح الوصول إلى الخادم بين المطورين.
التوسع إلى كتلة متعددة العقد مع Docker Swarm
يعمل CapRover أصلًا على Docker Swarm: إضافة الطاقة الحسابية تتم من اللوحة دون إعادة تهيئة تطبيقاتك. في قائمة Cluster، أدخِل IP العقدة الجديدة ومفتاح SSH الجذر المرتبط بها وIP عقدة القائد كما تراها العقدة الجديدة. يثبّت CapRover Docker على الهدف وينضم به إلى Swarm. قيد مهم: يتطلب وضع الكتلة سجل Docker افتراضيًا، لأن العقدة القائدة يجب أن تدفع الصور المبنية إلى العقد العاملة. يعرض CapRover نشر سجل تلقائيًا. قيد آخر يجب معرفته: التطبيقات التي تمكّن Persistent Directory لا تعمل إلا على عقدة واحدة (Docker Swarm لا يشارك أحجام الملفات بين المضيفين). لتوسيع تطبيق ذي حالة، استخدم قاعدة بيانات خارجية أو خدمة تخزين كائنات.
نسخ CapRover احتياطيًا
يوفر CapRover نسخًا احتياطيًا أصليًا من اللوحة: Settings → Export Backup. يحتوي الأرشيف المُنتج على تهيئة جميع تطبيقاتك ومتغيرات البيئة وإعدادات Nginx. لا يحتوي على بيانات الأحجام الدائمة. لنسخ قاعدة بيانات PostgreSQL المستضافة عبر One-Click احتياطيًا، الأسلوب الموصى به هو pg_dump مجدوَل بـcron مع الأرشفة إلى تخزين خارجي. أحجام Docker متاحة تحت /var/lib/docker/volumes/؛ نسخة هذه المجلدات مع إيقاف قاعدة البيانات تُشكّل نسخة احتياطية منخفضة المستوى. اختبر دائمًا الاستعادة على خادم VPS staging قبل الاعتماد على نسخة احتياطية في الإنتاج.
استكشاف الأخطاء وإصلاحها: الأخطاء الأكثر شيوعًا
فيما يلي رسائل الخطأ التي واجهها المستخدمون فعليًا في مشكلات GitHub ومنتديات CapRover، مع أسبابها وطرق إصلاحها.
الأخطاء الشائعة وطرق إصلاحها
502 Bad Gatewayعلى اللوحة أو تطبيق بعد النشر. السبب الأكثر شيوعًا: التطبيق لا يرتبط بالمنفذ الصحيح. تحقق من حقلcontainerHttpPortفي App Configs (يجب أن يطابق المنفذ الذي يستمع إليه تطبيقك). للتطبيقات بطيئة البدء، قد يُفعّل CapRover الحاوية قبل أن تكون جاهزة: زِد تأخير فحص السلامة أو أضِف ملفCHECKSفي جذر المشروع. إذا كانت بوابة 502 تطال اللوحة ذاتها بعد إعادة تشغيل VPS، انتظر 60 ثانية — يُعاد تهيئة خدمةcaptain-captainعند الإقلاع.App build failed/Build took too long. أوقف OOM killer عملية بناء Docker (ذاكرة غير كافية). أضِف 2 غيغابايت من swap:fallocate -l 2G /swapfile && chmod 600 /swapfile && mkswap /swapfile && swapon /swapfile. لجعل swap دائمًا، أضِف/swapfile swap swap defaults 0 0إلى/etc/fstab. لبناءات Node.js، عيّنNODE_OPTIONS=--max-old-space-size=512في متغيرات البيئة للحد من استهلاك الذاكرة.Error: minimum supported Docker API is 1.43(أو 1.44). رفع Docker v29 الحد الأدنى المطلوب وأوقف نسخ CapRover السابقة للإصدار 1.14.1. حدّث CapRover من اللوحة (Settings → Check for Updates) قبل تحديث Docker، أو حدّث CapRover أولًا إذا كان Docker في الإصدار v29 بالفعل.Verification Failedأثناء إعداد SSL. سجلات DNS لم تنتشر بعد، أو المنفذ 80 محجوب بجدار حماية. تحقق من فتح المنافذ بـufw statusوانتظر انتشار DNS بـdig +short *.apps.mydomain.com. وضع Cloudflare بالوكيل البرتقالي يحجب التحقق HTTP-01 من Let's Encrypt: بدّل DNS إلى رمادي (DNS-only) أثناء إنشاء الشهادة، أو استخدم شهادة wildcard عبر DNS-01.caprover loginيفشل بـECONNREFUSED. المنفذ 3000 غير متاح من جهازك. تحقق منufw allow 3000على الخادم. إذا لم تهيّئ نطاق captain بعد، وجّه مباشرة إلى IP:http://YOUR_IP:3000. بمجرد تعيين النطاق الجذر في اللوحة، يصبح رابط CLI هوhttps://captain.apps.mydomain.com.- نشر من GitHub في حلقة إعادة تشغيل لا تنتهي. ناتج عن
captain-definitionمفقود أو مشوّه، أو ملف Dockerfile لا يخرج بشكل نظيف. تحقق من سجلات البناء عبر اللوحة أوdocker service logs captain--my-app. الغياب عنCMDفي Dockerfile يجعل الحاوية تخرج فورًا، وهو ما يفسّره CapRover على أنه عطل.
قيّد المنفذ 3000 على IP الثابتة الخاصة بك: ufw allow from YOUR_IP to any port 3000 && ufw deny 3000. فعّل المصادقة الثنائية في اللوحة (Settings → Two-Factor Auth) وأنشئ token تطبيق لكل مشروع من أجل CI/CD — لا تضع كلمة مرور المشرف أبدًا في سر GitHub. للبناءات الثقيلة على RAM، أضِف swap قبل الترقية إلى خطة أعلى: 2 غيغابايت من swap على خادم VPS بـ2 غيغابايت RAM تكفي معظم stacks Node/Python. فعّل Netdata (متاح في One-Click Apps) لمراقبة CPU وRAM والشبكة مباشرة من لوحة CapRover دون أداة خارجية.
CapRover مقارنةً ببدائل PaaS مفتوحة المصدر
| المعيار | CapRover | Dokku | Coolify |
|---|---|---|---|
| واجهة ويب | نعم، متكاملة | لا (CLI فقط) | نعم، متكاملة |
| النشر | CLI، webhook، صورة | `git push` | Git، Docker، صورة |
| التنسيق | Docker Swarm | Docker (مستقل) | Docker (مستقل) |
| كتلة متعددة العقد | نعم (Swarm أصيل) | لا | جزئي (تجريبي) |
| كتالوج One-Click | أكثر من 100 تطبيق | إضافات CLI | أكثر من 50 قالب |
| RAM VPS الدنيا | 2 غيغابايت | 1 غيغابايت | 2 غيغابايت |
| التحديث الذاتي من اللوحة | نعم | عبر CLI/script | نعم |