لماذا البروكسي العكسي ضروري مع Docker
بشكل افتراضي، تستمع كل حاوية Docker على منفذ عشوائي: Nextcloud على المنفذ 8080، وGitea على المنفذ 3000، وVaultwarden على المنفذ 8200. لا يمكنك عرض عشرة منافذ مباشرةً في بيئة الإنتاج. يحل البروكسي العكسي هذه المشاكل الثلاث دفعةً واحدة: يصبح نقطة الدخول العامة الوحيدة، ويوجّه حركة المرور بناءً على اسم المضيف، ويتولى إنهاء TLS. النتيجة: app1.your-domain.com وapp2.your-domain.com تشيران كلتاهما إلى المنفذ 443 لخادمك، والبروكسي يعرف إلى أي حاوية يُعيد توجيه كل طلب.
ما يمنحك إياه البروكسي العكسي عملياً
- إنهاء TLS مركزي — أداة واحدة تحصل على شهادات Let's Encrypt وتجدّدها لجميع نطاقاتك تلقائياً دون أي خطوات يدوية
- توجيه حسب اسم المضيف —
git.your-domain.comيذهب إلى Gitea، وcloud.your-domain.comيذهب إلى Nextcloud دون أي تعارض في المنافذ - جدار حماية مُبسَّط — المنفذان 80 و443 فقط مفتوحان للعموم، وجميع منافذ Docker الداخلية تبقى غير متاحة من الخارج
- إعادة توجيه HTTP إلى HTTPS تلقائياً — يُعاد توجيه كل حركة المرور غير المشفرة بـ 301 دون إعداد يدوي داخل كل تطبيق
- مراقبة مركزية — سجلات الوصول والأخطاء لجميع تطبيقاتك مجمّعة في مكان واحد لتسهيل تشخيص المشكلات
المتطلبات المشتركة للحلول الثلاثة
قبل اختيار أحد هذه البروكسيات الثلاثة وتثبيته، تأكد من أن خادم VPS الخاص بك يستوفي بعض المتطلبات الأساسية. يجب تثبيت Docker وDocker Compose. يجب أن تشير سجلات DNS الخاصة بك إلى IP العامة لخادمك قبل طلب الشهادة. يجب أن تكون المنفذان 80 و443 خاليَين: تحقق بـ ss -tlnp | grep -E ':80|:443'. أخيراً، أنشئ شبكة Docker مخصصة للبروكسي — docker network create proxy.
جدول المقارنة: Caddy مقابل Traefik مقابل Nginx Proxy Manager
| المعيار | Caddy | Traefik | Nginx Proxy Manager |
|---|---|---|---|
| سهولة الإعداد | ⭐⭐⭐⭐⭐ بسيط جداً | ⭐⭐⭐ متوسط | ⭐⭐⭐⭐⭐ بسيط جداً |
| TLS تلقائي (Let's Encrypt) | ✅ أصيل، بدون إعداد | ✅ عبر ACME | ✅ عبر الواجهة الرسومية |
| تكامل Docker | يدوي (وسوم أو إعداد) | ✅ وسوم أصيلة | ✅ عبر GUI |
| طريقة الإعداد | ملف Caddyfile مقروء | وسوم Docker + YAML | واجهة رسومية |
| إعادة التحميل بدون انقطاع | ✅ تلقائي | ✅ تلقائي | ✅ تلقائي |
| لوحة تحكم/واجهة ويب | ❌ لا | ✅ لوحة تحكم مدمجة | ✅ واجهة كاملة |
| استهلاك الذاكرة | ~30 ميغابايت | ~50 ميغابايت | ~100 ميغابايت (MariaDB مشمولة) |
| الأنسب لـ | مشاريع فردية/فرق صغيرة | الخدمات المصغرة، CI/CD | المبتدئون، الفرق المختلطة |
Caddy: الخيار الافتراضي لمعظم الحالات
رسّخ Caddy نفسه بوصفه الخيار الأبسط للمطورين الذين يستضيفون بين اثنين وعشرة تطبيقات على خادم VPS. فلسفته جذرية: TLS مفعَّل بشكل افتراضي لأي نطاق صالح، دون أي خيار لتفعيله. ملف الإعداد Caddyfile مصمم ليكون مقروءاً، قريباً من اللغة الطبيعية. Caddy مكتوب بـ Go ويضم عميل ACME الخاص به: يتصل بـ Let's Encrypt مباشرةً ويخزّن الشهادات في دليل بياناته ويجدّدها تلقائياً قبل انتهاء صلاحيتها. استهلاك الذاكرة يبقى حوالي 30 ميغابايت في وضع الراحة.
نشر Caddy كبروكسي عكسي لـ Docker
إنشاء شبكة Docker المشتركة
أولاً، أنشئ الشبكة التي ستشترك فيها Caddy وتطبيقاتك: docker network create proxy. تتيح هذه الشبكة المعزولة لـ Caddy الوصول إلى حاوياتك بالاسم دون كشف منافذها على المضيف.
كتابة ملف Caddyfile
أنشئ ملف Caddyfile في جذر مشروعك. لعرض تطبيق على app.your-domain.com إلى حاوية باسم myapp تستمع على المنفذ 3000: app.your-domain.com { reverse_proxy myapp:3000 }. يحصل Caddy على الشهادة تلقائياً عند أول تشغيل.
كتابة ملف docker-compose.yml لـ Caddy
أنشئ docker-compose.yml مع خدمة Caddy: ارفع Caddyfile للقراءة فقط، احفظ بيانات TLS في حجم مسمى، انشر المنفذين 80 و443، وأضف Caddy إلى شبكة proxy المُعلَنة خارجية.
ربط تطبيقاتك بشبكة البروكسي
في ملف docker-compose.yml لكل تطبيق، أضف شبكة proxy كشبكة خارجية وتوقف عن كشف المنافذ على المضيف (استخدم expose بدلاً من ports).
التشغيل والتحقق
شغّل Caddy بـ docker compose up -d، ثم تابع السجلات بـ docker compose logs -f caddy. يجب أن ترى certificate obtained successfully لكل نطاق. اختبر بـ curl -I https://app.your-domain.com.
إضافة تطبيق جديد
لكل تطبيق جديد، أضف كتلة في Caddyfile، أعد تحميل Caddy بدون انقطاع بـ docker exec caddy caddy reload --config /etc/caddy/Caddyfile، وأضف الحاوية الجديدة إلى شبكة proxy.
Traefik: متى تختار الاكتشاف التلقائي للخدمات
يتألق Traefik في السياقات التي يتغير فيها عدد الخدمات بشكل متكرر: بيئات CI/CD التي تنشئ الحاويات وتدمرها مع كل نشر، ومعماريات الخدمات المصغرة. آلية الاكتشاف التلقائي عبر تسميات Docker هي ميزته الرئيسية: عند تشغيل حاوية بالتسميات الصحيحة، يكتشفها Traefik فوراً ويُنشئ المسار ويطلب شهادة TLS دون الحاجة للمساس بإعداد Traefik نفسه.
نشر Traefik مع اكتشاف Docker التلقائي
إنشاء ملف الإعداد الثابت
أنشئ traefik.yml بنقاط الدخول، فعّل موفر Docker، اضبط محلل ACME بعنوان بريدك لـ Let's Encrypt، وفعّل لوحة التحكم في الوضع الآمن.
تشغيل Traefik مع Docker Compose
في docker-compose.yml لـ Traefik، ارفع مقبس Docker للقراءة فقط (/var/run/docker.sock:/var/run/docker.sock:ro)، ارفع traefik.yml، احفظ الشهادات في حجم، وانشر المنفذين 80 و443.
إضافة التسميات إلى حاوياتك
على كل خدمة تريد عرضها، أضف تسميات Traefik: traefik.enable=true، قاعدة الموجّه، نقطة الدخول، محلل TLS، ومنفذ الخدمة الداخلي.
التحقق من لوحة التحكم
ادخل إلى لوحة تحكم Traefik وتحقق من أن موجّهك يظهر باللون الأخضر بحالة Enabled. إن كان الموجّه غائباً، تحقق من وجود التسمية traefik.enable=true.
أمان حرج: لا ترفع مقبس Docker (/var/run/docker.sock) بدون قيود في بيئة متعددة المستخدمين — أي شخص يمكنه الكتابة في هذا المقبس يمكنه السيطرة الكاملة على المضيف. في الإنتاج، فضّل Traefik مع المقبس للقراءة فقط (ro) أو استخدم بروكسي مقبس مثل docker-socket-proxy.
Nginx Proxy Manager: الخيار بدون ملفات إعداد
Nginx Proxy Manager (NPM) هو الخيار الواضح لمن يشعر بعدم الارتياح تجاه ملفات الإعداد في سطر الأوامر. تتيح واجهته الرسومية إنشاء مضيف بروكسي بنقرات قليلة. في المقابل، يضم NPM قاعدة بيانات MariaDB لتخزين إعداداته، مما يرفع استهلاك الذاكرة إلى حوالي 100 ميغابايت — ما يقارب ثلاثة أضعاف Caddy.
استكشاف الأخطاء: الأخطاء الأكثر شيوعاً
الغالبية العظمى من المشكلات تندرج في أربع فئات. أولاً، حدود معدل Let's Encrypt: استخدم بيئة التدريج للاختبار ثم انتقل للإنتاج. ثانياً، تعارض المنافذ: حدّد العملية بـ ss -tlnp | grep :80 وأوقفها. ثالثاً، أخطاء شبكة Docker: تحقق بـ docker network inspect proxy. رابعاً، لـ Traefik: فعّل سجلات DEBUG بـ --log.level=DEBUG.
ملخص: أي بروكسي لأي ملف شخصي
- مطور فردي، 2 إلى 5 تطبيقات — Caddy: إعداد بسيط، TLS تلقائي، جاهز في أقل من عشر دقائق
- فريق DevOps، خدمات مصغرة، CI/CD — Traefik: اكتشاف تلقائي عبر التسميات، لوحة مراقبة
- مستخدم غير تقني أو فريق مختلط — Nginx Proxy Manager: واجهة رسومية بديهية، لا ملفات للتحرير
- VPS ذو ذاكرة محدودة — Caddy أو Traefik: تجنب NPM الذي يضم MariaDB
- انتقال تدريجي من Nginx — Caddy: يمكن تعلم صيغته في ساعة
الخلاصة: ابدأ بـ Caddy وطوّر عند الحاجة
لغالبية العظمى من المضيفين الذاتيين الذين يديرون تطبيقات Docker على خادم VPS، يعد Caddy أفضل نقطة انطلاق: بسيط وخفيف ويتحكم في TLS بشكل أفضل من أي بديل دون إعداد إضافي. إذا نمت بنيتك التحتية إلى أكثر من خمس خدمات مع نشر متكرر وآلي، يصبح Traefik أكثر ملاءمة.