Nginx proxy manager اسهل طريقه من اجل عمل webserver مخصص للحاويات(docker/podman)

السلام عليكم ورحمة الله وبركاته

اليوم سوف اشرح احد افضل برمجيات التي استخدمها لتشغيل العديد من خدمات الحاويات.
برنامج nginx proxy manager يقدم واجهه بسيطه لاداره العناوين والخدمات المربوطه بالخادم وايضا اداره شهادات SSL من Lets Encrypt.

nginx-proxy-manager

طريقة وصل الحاويات

هناك طريقتين لوصل الحاويات بخادم الويب

شبكة Docker/Podman

بدلا من كشف الخدمة محليا, بامكانك انشاء شبكة محليه للحاويات.
يمكن للحاويات التواصل بين بعضهم عبر اسماء الحاويات مع DNS.

فتح port الخدمات للخادم محليا

مثلا 127.0.0.1:8000:5000
في هذه الحاله الخدمة ستكشف port 8000 محليا على الجهاز, وهو port 5000 داخل الحاوية.

اذا تستخدم Podman

تاكد من تثبيت حزمة podman-plugins و dnsmasq من اجل تفعيل dns داخل الشبكة.
كامل التفاصيل في موضوع كيف تشغل docker-compose على Podman

معظم الوقت سوف تستخدم الطريقة الاولى, لانها اكثر امانا لانك لا تكشف شيء محليا, لكن في حاله كنت تشغل الحاويه بوضع Host من اجل اخذ افضل سرعه سوف تضطر لكشف الخدمات محليا.

في هذا الشرح سوف نتبع الطريقة الاولى.

أنشاء شبكة Web

سوف نقوم بانشاء شبكة لكل الخدمات التي ستكون موصوله بخادم Nginx

Docker

docker network create web

Podman

podman network create web

Docker-compose

انشى مجلد تحت اي اسم تريده, مثلا nginx

mkdir nginx
cd nginx

ثم انشئ ملف docker-compose.yml

networks:
  web:
    external: true

services:
  nginx:
    image: 'jc21/nginx-proxy-manager:latest'
    restart: always
    ports:
      # Public HTTP Port:
      - '80:80'
      # Public HTTPS Port:
      - '443:443'
      # لوحه التحكم Port:
      - '127.0.0.1:81:81'
    environment:
      DB_SQLITE_FILE: "/data/database.sqlite"
      # اذا كنت تريد تعطيل ipv6 فعل هذا الخيار
      # DISABLE_IPV6: 'true'
    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt
    healthcheck:
      test: ["CMD", "/bin/check-health"]
      interval: 10s
      timeout: 3s
      retries : 3
    networks:
      web:

قم بتشغيل الخدمه عبر امر

V1

docker-compose up -d

V2

docker compose up -d

دخول للوحة التحكم

لوحه التحكم موجوده على port 81 محليا داخل الخادم لذلك ستحتاج لأستخدام ssh tunnel.

ssh -N -L 8080:127.0.0.1:81 user@server

وستظهر لك اللوحه على localhost:8080 في المتصفح.

الحساب الافتراضي هو
User: admin@example.com
Password: changeme

اصدار شهادة SSL

توجه لقسم SSL Certificates وثم اضغط على زر add SSL Certificate ثم اختر Lets encrypt.

طريقة Dns Challange

في حاله كان خادمك غير مكشوف للانترنت(خادم منزلي مثلا) او كنت تريد اصدار شهادة واحده لكل الخدمات بدلا من شهاده لكل عنوان فرعي.

فاذا كان مقدم ال dns الخاص بك يدعم Lets encrypt dns challenge بامكانك اصدار شهاده عبر مقدم ال dns بدون الحاجه لكشف الخادم, و الحصول على شهداه عامه لكل العناوين الفرعيه(wildcard).

مقدمين DNS المدعومين في Lets encrypt انا انصح ب Desec.io لانها منظمة غير ربحية وتدعم dynamic dns.

قم بوضع العنوان + *.عنوان.tld بحيث تصبح الشهاده تشمل العنوان الاساسي وجميع العنواين الفرعية.
بعدها اختار مقدم ال DNS الخاص بك و سيطلب منك api token, ويعتمد طريقه الحصول عليها على حسب كل مقدم.

بعد ذلك اضغط save واذا كان كل شيء صحيح ستظهر لك شهاده تشمل كل العنوان الخاص بك, بدون الحاجه لكشف خادمك!.

طريقه ACME challenge

سيظهر لك هذا المربع عن تفاصيل الشهادة.
يجب ان يكون الدومين(DNS) موجه لخادمك من قبل

حدد العناوين التي تريد الشهادة ان تشملها(يجب ان تكون كلها موجهه لخادمك).
ثم ضع بريدك و ووافق على الشروط ثم اضغط على زر save.

هذه الطريقة اليدويه التي تعطيك شهاده على خادم مكشوف الانترنت مباشرة.

اضافة الخدمات

بعد ذلك توجه ل proxy hosts وقم باضافه اول خدمه لك

ضع الدومين
ثم اسم الحاويه, تاكد من تحديد container name, واخذ هذا الاسم وضعه في hostname
ثم حدد ال port. بعض الخدمات تستخدم https داخليا لكن معظم الوقت http.

اذهب لصفحه SSL, اختار الشهاده التي تطبق على العنوان المستخدم, و اذا كنت تريد ان يستخدم Https بشكل افتراضي لتشفير جميع الاتصالات, قم باختيار Force ssl.

وهكذا اصبح لديك خادم Nginx جاهز وسهل لكل حاويات دوكر/بودمان.

7 إعجابات

رائع … كنت أبحث عنه :slight_smile:

فيديو شرح Nginx proxy Manager بالتفصيل

إعجابَين (2)

تعديل

استطعت حل المشكلة باستخدام اسم الحاوية مباشرة ، ولا أعلم لماذا لم تكن تعمل من قبل!


التعليق الأصلي

جزاك الله خيرا ، الشرح ممتاز لكن لدي مشكلة.
جربت تثبيت حاوية syncthing من خلال هذا الملف:

version: "3"
services:
  syncthing:
    image: syncthing/syncthing
    container_name: syncthing
    hostname: st
    environment:
      - PUID=1000
      - PGID=1000
    volumes:
      - ./data:/var/syncthing
    ports:
      - 127.0.0.1:8384:8384 # Web UI
      - 127.0.0.1:22000:22000/tcp # TCP file transfers
      - 127.0.0.1:22000:22000/udp # QUIC file transfers
      - 127.0.0.1:21027:21027/udp # Receive local discovery broadcasts
    restart: unless-stopped
    networks:
      - web

networks:
  web:
    external: true

لكن لما أردت وضعها في nginx proxy manager لم أعلم ماذا ينبغي أن أكتب داخل Forward Hostname / IP*
جربت عنوان 127.0.0.1 لكن لم يعمل ، جربت اسم الحاوية syncthing ولم تعمل كذلك.

بالنهاية جربت أمر docker network inspect web لأحصل على عنوان ip الخاص بالحاوية syncthing وكان عبارة عن "IPv4Address": "172.16.32.2/20" ومن هنا نسخت العنوان 172.16.32.2 في NPM واشتغل بشكل ممتاز.

المشكلة عندما قمت بإعادة تشغيل السيرفر للتأكد من ثبات كل شيء، وجدت أن العنوان تغير وبالتالي أعطاني خطأ ٥٠٢ بسبب عدم عثور سيرفر nginx على الحاوية.

كيف أحل تلك المشكلة؟

لا داعي لكشف منفذ واجهه الويب, لانه ستكون موصوله بNGINX عبر شبكة Docker على اي حال.
بقية المنافذ احذف 127.0.0.1 لان سوف تحتاج ان تكون مكشوف للجميع, او استبدله بعنوان IP عام/يمكن للاجهزه الاخرى الوصول له.
الا اذا استخدامك فقط مزامنه على نفس الجهاز.

بقية المنافذ احذف 127.0.0.1 لان سوف تحتاج ان تكون مكشوف للجميع, او استبدله بعنوان IP عام/يمكن للاجهزه الاخرى الوصول له.

لم أفهم ذلك جيدا ، هل سيمر هذا المنفذ عبر nginx ؟

حاليا المزامنة تعمل بشكل سليم والمنفذ مغلق على locahost ومغلق من جدار الحماية نفسه.

انت تكشف منفذ 8384, لكن لا داعي لكشفه لان nginx يعمل داخل شبكة دوكر, ويمكنه وصول للمنافذ دون كشفها للجهاز نفسه.

نعم حذفت السطر الخاص بمنفذ ٨٣٨٤ وأعدت تثبيت الحاوية ، والبرمجية تعمل بشكل جيد.

لكن سؤالي كان عن تعليقك على باقي المنافذ ٢٢٠٠٠ و ٢١٠٢٧ ، هل من اللازم كشفها للانترنت ؟

اذا فقط مزامنه محليه لا, الفكرة فقط كشفها من اجل تصل لها الأجهزة الأخرى للمزامنة.

الجوال كان يستطيع الربط ومزامنة الملفات على تلك الإعدادات !

انت فقط قمت بعمل proxy لمنفذ 8384 صحيح؟
اذا هو يستخدم هذا المنفذ, غير ذلك لن يمكنه الوصول لان جميع المنافذ فقط localhost.

نعم منفذ ٨٣٨٤ فقط هو ما يحول إليه nginx كافة الاتصالات الواردة باسم المضيف.

إذن syncthing يمكنه عمل مزامنة عبر هذا المنفذ كخطة احتياطية في حالة عدم القدرة على استخدام باقي المنافذ المخصصة للمزامنة … صحيح ؟

لا اعلم, لم استخدمه.
اذا بقي مِلَفّ compose كما أرسلت, المفروض أن لا يمكن الوصول للمنافذ.
لذلك على الأغلب يستخدم منفذ 443/ نفس منفذ الواجهه الرسومية.

شكرا على الشرح الرائع، بس ودي اعرف كيف اضيف upstream حاولت اسوي بروكسي ل mysql serevr بس للاسف م يقبل، اعتقد م تدعمها.

اتوقع تقصد Stream.
الصراحة لم اجربه ولم ابحث عن طريقة عمله.
المفروض انه ممكن.

بكل بساطة يتم فتح البورت الخاص بالحاوية ويتم تفعيل upstream مباشرة :+1:t2:.

إعجاب واحد (1)

حاليا عندي خدمة شغاله ضمن السيرفر باستخدام nodejs كيف اقدر اضيفها ووش hostname الي احطه لها

داخل دوكر؟

لا المشروع شغال بدون دوكر

تاكد انه شغال تحت وضع host ثم استخدم localhost بالاضافة للمنفذ المستخدم