لماذا تستضيف واجهة نشر على خادم 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 (الإصدار المجتمعي) المرجع لسنوات. مع Portainer 3، أوقفت الشركة الإصدار المجتمعي: لا يوجد إصدار CE في Portainer 3، وCE 2.45 هو آخر إصدار مجتمعي. يُوزَّع Portainer 3 بصيغة Business Edition (مجانًا حتى ثلاث عقد عبر ترخيص «3 Nodes Free»)، ويمنح الأولوية لـKubernetes في الميزات الجديدة مع الإبقاء على Docker وSwarm وPodman. تواصل نسخ CE 2.45 العمل وتتلقى تصحيحات 2.45 LTS حتى أغسطس 2027، لكن دون أي ميزة جديدة.
لهذا التحول نتائج عملية متعددة. أولًا، عمليات التثبيت الجديدة التي تبحث عن واجهة Docker مجانية لا تجد خارطة طريق لـCE. ثانيًا، صور portainer/portainer-ce لا تزال موجودة وتتلقى تصحيحات الفرع 2.45، لكنها لن تتطور بعد الآن. وبشكل حاسم — تراكمت على Portainer 2.x ثغرات حرجة، منها ثغرتا CVE بدرجة 9.4، تبقى قابلة للاستغلال على أي تثبيت غير محدّث.
إن كنت لا تزال تشغّل Portainer 2.x، فالسؤال ليس «هل أنتقل بالمبدأ»: بل «هل نسختي محدّثة، وهل المخاطرة مقبولة؟»
ثغرات CVE الحرجة في Portainer 2.x: التحقق والتصحيح
تؤثر ثغرتان على جميع فروع Portainer حتى النسخ المصححة أدناه (النسخ السابقة لـ2.33.0 منتهية الدعم ولن تُصحَّح):
CVE-2026-44848 (CVSS 9.4) — نقاط النهاية /plugins/* في واجهة Docker API التي يمررها Portainer تفلت من فحص الصلاحيات. يستطيع مستخدم عادي (غير مدير) لديه وصول إلى بيئة Docker تثبيت ملحق Docker وتفعيله، فيعمل بصلاحيات root على مضيفك.
CVE-2026-44849 (CVSS 9.4) — يمكن تجاوز آلية قيود Swarm: مستخدم Portainer بصلاحيات مخفضة قادر على تنفيذ إجراءات محجوزة للمدير على مجموعة Swarm.
النسخ المصححة: 2.33.8، 2.39.2، 2.41.0. نُشرت منذ ذلك الحين ثغرات حرجة أخرى، صُحّحت في 2.45.2 و2.45.3 ولا تصحيح لها في الفرع 2.39: استهدف 2.45.3 LTS، آخر إصدار منشور في 7 نوفمبر 2026.
للتحقق من نسختك:
docker exec portainer /portainer --versionللتحديث:
docker pull portainer/portainer-ce:lts
docker stop portainer
docker rm portainer
docker run -d \
--name=portainer \
--restart=always \
-p 127.0.0.1:9443:9443 \
-v /var/run/docker.sock:/var/run/docker.sock \
-v portainer_data:/data \
portainer/portainer-ce:ltsإن كنت دون 2.45.3، حدّث قبل الاستمرار في استخدام التثبيت. هذا الأمر ينشر الواجهة على 127.0.0.1 فقط: ادخل إليها عبر نفق SSH (ssh -L 9443:127.0.0.1:9443 user@your-vps ثم https://localhost:9443) أو عبر وكيل عكسي. أضف -p 8000:8000 فقط إن كنت تستخدم وكلاء Edge. Portainer المكشوف على الإنترنت دون تصحيح يمثل ناقل اختراق مباشر لمضيف Docker لديك.
ثغرة CVE في Dokploy: السر المضمّن في الكود (< 0.29.3)
Dokploy ليس بمنأى عن الثغرات. CVE-2026-45631 (CVSS 10.0) أثّرت على التثبيتات الافتراضية السابقة لـ0.29.3: عندما لا يكون المتغير BETTER_AUTH_SECRET معرّفًا — ولم يكن سكريبت التثبيت يعرّفه —، كان الكود يلجأ إلى قيمة مضمّنة ثابتة، متطابقة في جميع التثبيتات. كان بإمكان أي شخص تزوير رمز والاستيلاء على حساب المدير دون مصادقة.
وصل التصحيح في 0.29.3، مع سكريبت ترحيل يُشغَّل بعد التحديث. وصُحّحت ثغرات حرجة كثيرة أخرى (حقن أوامر، غياب ضوابط الوصول) حتى 0.29.13: لا تبقَ دونها، واستهدف آخر إصدار (0.31.0 في 7 نوفمبر 2026). للتحقق والتحديث:
# التحقق من الإصدار المثبت (وسم صورة الخدمة)
docker service inspect dokploy --format '{{.Spec.TaskTemplate.ContainerSpec.Image}}'
# التحديث عبر السكريبت الرسمي
curl -sSL https://dokploy.com/install.sh | sh -s updateمنذ 0.29.3، يقرأ Dokploy قيمة BETTER_AUTH_SECRET من سر Docker (المتغير BETTER_AUTH_SECRET_FILE). بعد التحديث، تحقق من أن الخدمة تستخدمه:
docker service inspect dokploy --format '{{range .Spec.TaskTemplate.ContainerSpec.Env}}{{println .}}{{end}}' | grep BETTER_AUTH_SECRET_FILEإن غاب السطر، شغّل سكريبت الأمان الرسمي المنشور مع 0.29.3: يولّد سرًا فريدًا ويحدّث الخدمة.
curl -sSL https://dokploy.com/security/0.29.3.sh | bashالمتطلبات الأساسية لاستضافة Portainer أو Dokploy
كلا الأداتين تعملان على Docker. يحتاج Dokploy إلى موارد أكثر قليلاً لأنه يتضمن قاعدة بيانات PostgreSQL ووكيل Traefik إلى جانب الخدمة الرئيسية.
الموارد الدنيا الموصى بها
- Portainer 2.x: لا تنشر الشركة حدًا أدنى للعتاد؛ الإصدار 2.45.3 معتمد مع Docker 28.5.1 و29.8.1 — يعمل على خادم VPS صغير
- Dokploy: 2 غيغابايت RAM و30 غيغابايت قرص على الأقل وفق الوثائق الرسمية — يعمل PostgreSQL وTraefik إلى جانب الخدمة الرئيسية
- نطاق أو نطاق فرعي يشير إلى خادمك (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 Swarm، وينشئ الخدمتين
dokployوdokploy-postgresوالحاويةdokploy-traefik(الإعدادات في/etc/dokploy/)، ويولّدBETTER_AUTH_SECRETعشوائيًا يُخزَّن في سر Docker، ثم يشغّل كل شيء.التحقق من BETTER_AUTH_SECRET
بعد التثبيت، تأكد من أن الخدمة تقرأ سرّها:
docker service inspect dokploy --format '{{range .Spec.TaskTemplate.ContainerSpec.Env}}{{println .}}{{end}}' | grep BETTER_AUTH_SECRET_FILEيجب أن ترى سطرًا
BETTER_AUTH_SECRET_FILE=/run/secrets/...: تبقى القيمة (64 حرفًا ست عشريًا يولّدهاopenssl rand -hex 32) داخل سر Docker ولا تظهر بنص واضح أبدًا. إن غاب السطر (تثبيت قديم)، شغّل سكريبت الأمان الرسمي:curl -sSL https://dokploy.com/security/0.29.3.sh | bashالوصول إلى الواجهة وإنشاء حساب المدير
Dokploy يستمع على المنفذ 3000 افتراضياً. افتح
http://<ip-خادمك>:3000في المتصفح. تطلب منك الزيارة الأولى إنشاء حساب المدير. افعل ذلك فوراً — الواجهة عامة حتى يوجد هذا الحساب.ضبط النطاق وتفعيل HTTPS
في Settings → Web Server → Server Domain، أدخل FQDN (
dokploy.yourdomain.com). Traefik يسترد تلقائيًا شهادة Let's Encrypt عبر ACME HTTP-01. يجب أن يشير DNS إلى الخادم قبل هذه الخطوة. بعد أن تُقدَّم الواجهة عبر HTTPS، أغلق المنفذ 3000 أمام الإنترنت كما يوصي دليل تقوية Dokploy: ufw وحده لا يرشّح المنافذ التي ينشرها Docker، فاستخدمufw-dockerأو جدار الحماية لدى مزوّدك.تحديث Dokploy
Dokploy يعرض زر تحديث في Settings → Web Server، أو استخدم السكريبت:
curl -sSL https://dokploy.com/install.sh | sh -s updateمع الوسيط
update، يسحب السكريبت صورة آخر إصدار ويحدّث الخدمةdokployدون المساس بإعداداتك أو مشاريعك. ودون هذا الوسيط، يعيد تثبيتًا كاملًا يفشل على خادم مثبَّت مسبقًا (المنافذ 80 و443 و3000 مشغولة).
Portainer كبديل — التثبيت السريع
إذا فضّلت البقاء على Portainer (تثبيت قائم أو اختيار مقصود)، الأمر المرجعي:
docker run -d \
--name=portainer \
--restart=always \
-p 127.0.0.1:9443:9443 \
-v /var/run/docker.sock:/var/run/docker.sock \
-v portainer_data:/data \
portainer/portainer-ce:ltsالوصول عبر نفق SSH (ssh -L 9443:127.0.0.1:9443 user@your-vps ثم https://localhost:9443) أو عبر وكيل عكسي. استبدل lts بـ 2.45.3 لتثبيت الإصدار وتجنب التحديثات الصامتة.
Portainer 2.x مقابل Dokploy — مقارنة شاملة 2026
مرّر الجدول أفقيًا
| المعيار | Portainer 2.x | Dokploy |
|---|---|---|
| الترخيص | CE مجاني (ترخيص zlib) | Apache 2.0 (باستثناء المجلد /proprietary) |
| مستقبل CE | CE يتوقف عند 2.45 (تصحيحات حتى أغسطس 2027) | خارطة طريق فاعلة، مجتمع متنامٍ |
| ثغرات CVE الفاعلة | CVE-2026-44848 + 44849 (CVSS 9.4) وتنبيهات لاحقة: استهدف 2.45.3 | CVE-2026-45631 (CVSS 10.0) إن كانت النسخة < 0.29.3؛ استهدف ≥ 0.29.13 |
| RAM الدنيا | غير منشورة (أداة خفيفة) | 2 غيغابايت (PostgreSQL + Traefik مضمّنان) |
| نشر من Git | نعم (stacks Compose من مستودع Git) | نعم (GitHub، GitLab، Gitea، Bitbucket) |
| شهادات TLS | يدوية (وكيل عكسي خارجي) | تلقائية عبر Let's Encrypt بواسطة Traefik |
| قوالب التطبيقات | نعم (مكتبة مدمجة) | نعم (Docker Compose مستورد) |
| سجل خاص | نعم | نعم |
| CI/CD مدمج | تحديثات GitOps (polling أو webhook) | Webhooks لـGit + إشعارات |
| Kubernetes | نعم (CE وBE) | لا (Docker Compose / Swarm) |
| متعدد الخوادم | نعم (نقاط النهاية) | نعم (خوادم بعيدة عبر SSH) |
| الواجهة | ناضجة وشاملة | عصرية، موجّهة للمشاريع |
متى تبقى على Portainer، ومتى تنتقل إلى Dokploy؟
البقاء على Portainer 2.x منطقي في ثلاث حالات: تدير مجموعة Docker Swarm أو Kubernetes بإعدادات معقدة؛ لديك فرق تتقن الواجهة مع أدلة تشغيل موثقة؛ أو تحتاج مستوى التفصيل في الشبكات والأقراص الذي يعرضه Portainer نصاً.
في هذه الحالات، الشرط غير القابل للتفاوض هو وجود نسخة محدّثة (2.45.3 في 7 نوفمبر 2026) وتقييد الوصول إلى الواجهة: لا تكشف المنفذ 9000/9443 مباشرة على الإنترنت، ضع Portainer خلف وكيل عكسي بمصادقة إضافية إن كان مستخدمون غير إداريين يصلون إليه.
الانتقال إلى Dokploy هو القرار الصحيح إذا: بدأت من صفر على خادم VPS جديد؛ تريد أن ينشر مطوروك من Git دون SSH؛ تدير نطاقات متعددة ولا تريد الحفاظ يدويًا على Nginx/Traefik؛ أو تبحث عن بديل بعد نهاية CE (لا يوجد إصدار مجتمعي في Portainer 3) لاستخدامك في 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). في مستودع خاص، سبب شائع هو غياب مفتاح SSH أو عدم السماح له في المستودع. يتيح Dokploy إنشاء مفتاح في Settings → SSH Keys (زر Create SSH Key) لإضافته كمفتاح نشر في المستودع؛ أما مع GitHub أو GitLab أو Gitea أو Bitbucket فيمكنك أيضًا ربط المزوّد في إعدادات Git في Dokploy.
الأداتان ليستا حصرية دائماً
يستطيع Portainer إدارة عدة نقاط نهاية Docker بعيدة من واجهة واحدة — بما فيها خادم VPS مثبت عليه Dokploy. بعض الفرق تحتفظ بـPortainer أداةً للمراقبة وبـDokploy أداةً للنشر. هذا ليس نمطاً مضاداً إن كانت الأدوار محددة بوضوح. الثمن: سطحان للتصحيح. إن اخترت هذه المعمارية، تأكد من أن الأداتين محدّثتان — راجع ثغرات CVE في مطلع المقالة.
للمزيد: البدائل لـPortainer CE، دليل النشر الكامل مع Dokploy والتحديث الحرج لثغرات CVE في Dokploy 2026.