لماذا تستضيف واجهة نشر على خادم VPS؟
خادم VPS مزود بـDocker يترك لك واجهة وحيدة: سطر الأوامر. هذا كافٍ لجهاز واحد، مرهق لخمسة، وغير قابل للإدارة لفريق كامل. تجمع واجهة الويب السجلات وتحديثات الصور ومتغيرات البيئة وشهادات TLS في مكان واحد — دون الحاجة إلى خط أنابيب CI/CD متكامل منذ اليوم الأول.
تتنافس عائلتان: المديرون (Portainer، Yacht) الذين يعرضون Docker كما هو، وPaaS الخفيف (Dokploy، Coolify، CapRover) الذي يضيف طبقة نشر — فروع Git، نطاقات تلقائية، شهادات Let's Encrypt. الفرق ليس شكلياً: يحدد ما إذا كان مطوروك قادرين على النشر بأنفسهم أم يحتاجون إلى وصول SSH.
ما تكسبه بنشر هذا القالب على خادم VPS
- النشر من Git أو Docker Hub بنقرات قليلة، دون SSH
- إدارة تلقائية لشهادات TLS عبر Let's Encrypt
- متغيرات بيئة ذات إصدار، معزولة لكل مشروع
- سجلات مركزية وطرفية ويب من المتصفح
- لوحة صحة: CPU، RAM، حالة الحاويات
- إدارة الأقراص والشبكات في Docker دون حفظ الأوامر
وضع Portainer في 2026: نهاية الإصدار المجتمعي
كان Portainer CE (الإصدار المجتمعي) المرجع لمدة ست سنوات. في 2026، أعادت Portainer هيكلة نموذج الترخيص: الإصدار المجتمعي أصبح محدوداً بـKubernetes أو مدفوعاً (Portainer Business). النسخ القائمة من Portainer 2.x تواصل العمل، لكن CE لم تعد تتطور.
لهذا التحول نتائج عملية متعددة. أولاً، عمليات التثبيت الجديدة التي تبحث عن واجهة Docker مجانية لا تجد خارطة طريق واضحة لـCE. ثانياً، صور portainer/portainer-ce:latest لا تزال موجودة وتتحدث، لكن القناة المجتمعية فقدت زخمها. وبشكل حاسم — تراكمت على Portainer 2.x ثغرتا CVE بدرجة 9.4 تبقيان فاعلتين على أي تثبيت غير محدّث.
إن كنت لا تزال تشغّل Portainer 2.x، فالسؤال ليس «هل أنتقل بالمبدأ»: بل «هل نسختي محدّثة، وهل المخاطرة مقبولة؟»
ثغرات CVE الحرجة في Portainer 2.x: التحقق والتصحيح
تؤثر ثغرتان على نسخ Portainer من 2.33.0 إلى 2.40.x:
CVE-2026-44848 (CVSS 9.4) — نقاط النهاية /plugins/* غير محمية بالمصادقة. مهاجم غير مصادق يستطيع الاستعلام عن ملحقات Docker وتعديلها على مضيفك عبر API الـPortainer.
CVE-2026-44849 (CVSS 9.4) — يمكن تجاوز آلية قيود Swarm: مستخدم Portainer بصلاحيات مخفضة قادر على تنفيذ إجراءات محجوزة للمدير على مجموعة Swarm.
النسخ المصححة: 2.33.8، 2.39.2، 2.41.0.
للتحقق من نسختك:
docker exec portainer /app/portainer --versionللتحديث:
docker pull portainer/portainer-ce:latest
docker stop portainer
docker rm portainer
docker run -d \
--name=portainer \
--restart=always \
-p 8000:8000 -p 9443:9443 \
-v /var/run/docker.sock:/var/run/docker.sock \
-v portainer_data:/data \
portainer/portainer-ce:latestإن كنت دون 2.33.8 أو 2.39.2 حسب فرعك، حدّث قبل الاستمرار في استخدام التثبيت. Portainer المكشوف على الإنترنت دون هذا التصحيح يمثل ناقل اختراق مباشر لمضيف Docker لديك.
ثغرة CVE في Dokploy: السر المضمّن في الكود (< 0.29.13)
Dokploy ليس بمنأى عن الثغرات. CVE-2026-45631 (CVSS 10.0) يؤثر على النسخ قبل 0.29.13: كان سر المصادقة مضمّناً بصورة ثابتة في كود المصدر، مما يتيح لأي شخص يعرف هذا السر المصادقة على أي تثبيت Dokploy.
تم إصلاح هذه الثغرة منذ الإصدار 0.29.13. للتحقق والتحديث:
# التحقق من الإصدار المثبت
docker exec dokploy dokploy --version
# التحديث عبر السكريبت الرسمي
curl -sSL https://dokploy.com/install.sh | shيستخدم Dokploy BETTER_AUTH_SECRET كمفتاح جلسة. في التثبيت قبل 0.29.13، كانت هذه القيمة ثابتة في الكود. بعد التحديث، تحقق من أن docker-compose.yml الخاص بـDokploy يُصرّح بقيمة عشوائية قوية:
grep BETTER_AUTH_SECRET /etc/dokploy/docker-compose.ymlإذا كانت المتغيرة فارغة أو غائبة، أنشئ قيمة جديدة وأعد التشغيل:
export BETTER_AUTH_SECRET=$(openssl rand -hex 32)المتطلبات الأساسية لاستضافة Portainer أو Dokploy
كلا الأداتين تعملان على Docker. يحتاج Dokploy إلى موارد أكثر قليلاً لأنه يتضمن قاعدة بيانات PostgreSQL ووكيل Traefik إلى جانب الخدمة الرئيسية.
الموارد الدنيا الموصى بها
- Portainer 2.x: 1 vCPU، 512 ميغابايت RAM، Docker 20+ — يعمل على أصغر خادم VPS
- Dokploy: 2 vCPU، 2 غيغابايت RAM، Docker 24+ — يضيف PostgreSQL وTraefik نحو 400 ميغابايت عند الإطلاق
- نطاق أو نطاق فرعي يشير إلى خادمك (Dokploy يحتاجه للشهادات التلقائية)
- المنفذان 80 و443 مفتوحان إذا استخدمت Let's Encrypt عبر Traefik (Dokploy)
- وصول SSH بصلاحية root أو sudo للتثبيت الأولي
نشر Dokploy على خادم VPS (نسخة ≥ 0.29.13)
التثبيت عبر السكريبت الرسمي
الطريقة الأبسط والأكثر تحديثاً:
curl -sSL https://dokploy.com/install.sh | shيُثبّت السكريبت Docker إن لزم، ينشئ
docker-compose.ymlفي/etc/dokploy/، يولّدBETTER_AUTH_SECRETعشوائياً ويشغّل كل شيء.التحقق من BETTER_AUTH_SECRET
بعد التثبيت، تأكد من توليد المتغيرة بشكل صحيح:
grep BETTER_AUTH_SECRET /etc/dokploy/docker-compose.ymlيجب أن ترى سلسلة عشوائية من 64 حرفاً. إن كانت المتغيرة فارغة، ولّد قيمة جديدة وأعد التشغيل:
sed -i "s/BETTER_AUTH_SECRET=/BETTER_AUTH_SECRET=$(openssl rand -hex 32)/" /etc/dokploy/docker-compose.yml docker compose -f /etc/dokploy/docker-compose.yml up -dالوصول إلى الواجهة وإنشاء حساب المدير
Dokploy يستمع على المنفذ 3000 افتراضياً. افتح
http://<ip-خادمك>:3000في المتصفح. تطلب منك الزيارة الأولى إنشاء حساب المدير. افعل ذلك فوراً — الواجهة عامة حتى يوجد هذا الحساب.ضبط النطاق وتفعيل HTTPS
في إعدادات Dokploy → Server → Domain، أدخل FQDN (
dokploy.yourdomain.com). Traefik يسترد تلقائياً شهادة Let's Encrypt عبر ACME HTTP-01. يجب أن يشير DNS إلى الخادم قبل هذه الخطوة.تحديث Dokploy
Dokploy يعرض زر Update في إعداداته، أو استخدم السكريبت:
curl -sSL https://dokploy.com/install.sh | shالسكريبت متكرر الاستخدام (idempotent): يحدث الصورة دون حذف إعداداتك أو مشاريعك.
Portainer كبديل — التثبيت السريع
إذا فضّلت البقاء على Portainer (تثبيت قائم أو اختيار مقصود)، الأمر المرجعي:
docker run -d \
--name=portainer \
--restart=always \
-p 9443:9443 \
-v /var/run/docker.sock:/var/run/docker.sock \
-v portainer_data:/data \
portainer/portainer-ce:latestالوصول على https://<ip>:9443. استبدل latest بـ 2.41.0 لتثبيت الإصدار وتجنب التحديثات الصامتة.
Portainer 2.x مقابل Dokploy — مقارنة شاملة 2026
مرّر الجدول أفقيًا
| المعيار | Portainer 2.x | Dokploy |
|---|---|---|
| الترخيص | CE مجاني (Docker فقط) | مفتوح المصدر (Apache 2.0) |
| مستقبل CE | محدود — CE 3.0 لـKubernetes أو مدفوع | خارطة طريق فاعلة، مجتمع متنامٍ |
| ثغرات CVE الفاعلة | CVE-2026-44848 + 44849 (CVSS 9.4) إن كانت النسخة < 2.41.0 | CVE-2026-45631 (CVSS 10.0) إن كانت النسخة < 0.29.13 |
| RAM الدنيا | 512 ميغابايت | 2 غيغابايت (PostgreSQL + Traefik مضمّنان) |
| نشر من Git | لا (صور Docker فقط) | نعم (GitHub، GitLab، Gitea، Bitbucket) |
| شهادات TLS | يدوية (وكيل عكسي خارجي) | تلقائية عبر Let's Encrypt بواسطة Traefik |
| قوالب التطبيقات | نعم (مكتبة مدمجة) | نعم (Docker Compose مستورد) |
| سجل خاص | نعم | نعم |
| CI/CD مدمج | لا | Webhooks لـGit + إشعارات |
| Kubernetes | نعم (BE مدفوع) | لا (Docker Compose / Swarm) |
| متعدد الخوادم | نعم (نقاط النهاية) | نعم (وكلاء بعيدون) |
| الواجهة | ناضجة وشاملة | عصرية، موجّهة للمشاريع |
متى تبقى على Portainer، ومتى تنتقل إلى Dokploy؟
البقاء على Portainer 2.x منطقي في ثلاث حالات: تدير مجموعة Docker Swarm أو Kubernetes بإعدادات معقدة؛ لديك فرق تتقن الواجهة مع أدلة تشغيل موثقة؛ أو تحتاج مستوى التفصيل في الشبكات والأقراص الذي يعرضه Portainer نصاً.
في هذه الحالات، الشرط غير القابل للتفاوض هو وجود نسخة مصححة (2.33.8 أو 2.39.2 أو 2.41.0) وتقييد الوصول إلى الواجهة: لا تكشف المنفذ 9000/9443 مباشرة على الإنترنت، ضع Portainer خلف وكيل عكسي بمصادقة إضافية إن كان مستخدمون غير إداريين يصلون إليه.
الانتقال إلى Dokploy هو القرار الصحيح إذا: بدأت من صفر على خادم VPS جديد؛ تريد أن ينشر مطوروك من Git دون SSH؛ تدير نطاقات متعددة ولا تريد الحفاظ يدوياً على Nginx/Traefik؛ أو تبحث عن بديل بعد التغيير في CE 3.0 لاستخدامك في Docker.
الانتقال من Portainer إلى Dokploy: خطوات ملموسة
تصدير مخزون Portainer الخاص بك
قبل الانتقال، رتّب قائمة بالـstacks والحاويات الفاعلة:
docker ps --format 'table {{.Names}} {{.Image}} {{.Status}}' docker volume ls docker network ls --filter driver=bridgeلكل stack في Portainer، استرد
docker-compose.ymlمن الواجهة (Stacks → stack → Editor) أو من نظام الملفات.نسخ احتياطي لأقراص البيانات
تحتوي الأقراص المسماة على بيانات تطبيقاتك. انسخها احتياطياً قبل أي عملية:
docker run --rm \ -v <اسم_القرص>:/data \ -v $(pwd):/backup \ alpine tar czf /backup/<اسم_القرص>.tar.gz /dataكرر العملية لكل قرص حيوي.
تثبيت Dokploy على نفس الخادم VPS أو خادم مخصص
عند الانتقال على نفس المضيف، أوقف Portainer أولاً لتحرير المنافذ:
docker stop portainer && docker rm portainerثم شغّل تثبيت Dokploy (انظر الإجراء أعلاه). يستخدم Dokploy وكيل Traefik على المنفذين 80/443 — تحقق من أن لا خدمة أخرى تشغلهما.
إعادة إنشاء مشاريعك في Dokploy
في Dokploy، أنشئ Compose Project لكل stack في Portainer:
1. Projects → مشروع جديد
2. أضف خدمة من نوع Docker Compose
3. الصقdocker-compose.ymlأو أشر إلى مستودع Git
4. ضبط متغيرات البيئة من تبويب Environment
5. خصّص نطاقاً — يضبط Dokploy وكيل Traefik تلقائياًالتحقق وتبديل DNS
انشر أولاً على نطاق فرعي تجريبي (
test.yourdomain.com). بعد التحقق، حدّث إدخالات DNS لتشير إلى Dokploy. يصدر Traefik الشهادات تلقائياً حالما ينتشر DNS.
استكشاف الأخطاء: المشكلات الشائعة
Portainer — الواجهة لا يمكن الوصول إليها بعد التحديث
تحقق من تحميل القرص portainer_data بشكل صحيح. تحديث دون قرص مسمى يبدأ من قاعدة فارغة ويطلب إنشاء حساب المدير مجدداً.
Portainer — TLS handshake error على المنفذ 9443
ينشئ Portainer شهادة موقعة ذاتياً. متصفحك يحذرك بحق. ضع Portainer خلف وكيل عكسي (nginx، Caddy) بشهادة حقيقية للوصول الآمن في الإنتاج.
Dokploy — Traefik لا يولّد شهادة
السبب الأكثر شيوعاً: DNS لم ينتشر بعد نحو الخادم VPS. تحقق بـ dig +short yourdomain.com. يتوقف Traefik على استجابة DNS صالحة قبل إطلاق تحدي ACME. إن كان DNS صحيحاً، تحقق من فتح المنفذ 80 (ufw allow 80).
Dokploy — نشر Git يفشل بصمت
تحقق من سجلات الخدمة في الواجهة (Deployments → تبويب Logs). الخطأ الأكثر شيوعاً هو BETTER_AUTH_SECRET مفقود أو مفتاح SSH غير مضبوط للمستودعات الخاصة. يوفر Dokploy زر Generate SSH Key في إعدادات المشروع للمستودعات الخاصة على GitLab/GitHub.
الأداتان ليستا حصرية دائماً
يستطيع Portainer إدارة عدة نقاط نهاية Docker بعيدة من واجهة واحدة — بما فيها خادم VPS مثبت عليه Dokploy. بعض الفرق تحتفظ بـPortainer أداةً للمراقبة وبـDokploy أداةً للنشر. هذا ليس نمطاً مضاداً إن كانت الأدوار محددة بوضوح. الثمن: سطحان للتصحيح. إن اخترت هذه المعمارية، تأكد من أن الأداتين محدّثتان — راجع ثغرات CVE في مطلع المقالة.
للمزيد: البدائل لـPortainer CE 3.0، دليل النشر الكامل مع Dokploy والتحديث الحرج لثغرات CVE في Dokploy 2026.