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

**URL:** <https://discourse.aosus.org/t/topic/2148>\
**Category:** شبكات وخوادم واستضافة الخدمات المحلية\
**Tags:** podman, حاويات, docker\
**Created:** [9 أكتوبر 2021، 2:05م UTC](https://discourse.aosus.org/t/topic/2148 "2021-10-09T14:05:06Z")\
**Posts on this page:** 20\
**Page:** 1

<div class="post-metadata">

**Author:** ![FarisZR](https://discourse.aosus.org/user_avatar/discourse.aosus.org/fariszr/32/9292_2.png) [@FarisZR](https://discourse.aosus.org/u/FarisZR)\
**Post date:** [9 أكتوبر 2021، 2:05م UTC](https://discourse.aosus.org/t/topic/2148/1 "2021-10-09T14:05:06Z")

</div>

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

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

[![nginx-proxy-manager](https://cdn-cf-discourse.aosus.org/original/2X/e/eea4aae37dd5c7c3f113a4a12b01d4d9ff592683.jpeg)](https://nginxproxymanager.com/)

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

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

### شبكة Docker/Podman

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

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

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

> **اذا تستخدم Podman**
>
> تاكد من تثبيت حزمة `podman-plugins` و `dnsmasq` من اجل تفعيل dns داخل الشبكة.  
> كامل التفاصيل في موضوع [كيف تشغل docker-compose على Podman](https://discourse.aosus.org/t/topic/2140)

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

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

## أنشاء شبكة Web

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

### Docker

```auto
docker network create web

```

### Podman

```auto
podman network create web

```

## Docker-compose

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

```auto
mkdir nginx
cd nginx

```

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

```auto
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

```auto
docker-compose up -d

```

### V2

```auto
docker compose up -d

```

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

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

```auto
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](https://community.letsencrypt.org/t/dns-providers-who-easily-integrate-with-lets-encrypt-dns-validation/86438) انا انصح ب [Desec.io](http://Desec.io) لانها منظمة غير ربحية وتدعم dynamic dns.

 ![image](https://cdn-cf-discourse.aosus.org/original/2X/d/d1fd056e599f83a08a79fe1155001e2111017420.png)

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

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

## طريقه ACME challenge

 ![image](https://cdn-cf-discourse.aosus.org/original/2X/6/67603257dafdc8ba6622f20493d4269656bab870.png)

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

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

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

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

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

 ![add host](https://cdn-cf-discourse.aosus.org/original/2X/6/685dca64d0d1d1b4c8399d48d3b42effc41708ca.png)

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

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

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

---

<div class="post-metadata">

**Author:** ![islamux](https://discourse.aosus.org/user_avatar/discourse.aosus.org/islamux/32/3221_2.png) [@islamux](https://discourse.aosus.org/u/islamux)\
**Post date:** [14 يناير 2022، 8:17ص UTC](https://discourse.aosus.org/t/topic/2148/2 "2022-01-14T08:17:55Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![Mohammed\_Omar](https://discourse.aosus.org/user_avatar/discourse.aosus.org/mohammed_omar/32/3566_2.png) [@Mohammed\_Omar](https://discourse.aosus.org/u/Mohammed_Omar)\
**Post date:** [25 يناير 2022، 7:44ص UTC](https://discourse.aosus.org/t/topic/2148/3 "2022-01-25T07:44:32Z")

</div>

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

> **[Nginx Proxy Manager شرح لاداة ال](https://www.momar.tech/2022/01/how-to-connect-to-your-network-from-outside-the-office.html)**
>
> Nginx Proxy Manager هي أداة تسهل إعداد وإدارة خادم الوكيل (proxy server) باستخدام خادم Nginx. تعمل هذه الأداة كواجهة مستخدم بسيطة وسهلة الاستخدام لتكو

---

<div class="post-metadata">

**Author:** ![akkk33](https://discourse.aosus.org/user_avatar/discourse.aosus.org/akkk33/32/5174_2.png) [@akkk33](https://discourse.aosus.org/u/akkk33)\
**Post date:** [28 يوليو 2022، 7:06م UTC](https://discourse.aosus.org/t/topic/2148/4 "2022-07-28T19:06:54Z")

</div>

# تعديل

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

* * *

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

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

```yaml
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 على الحاوية.

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

---

<div class="post-metadata">

**Author:** ![FarisZR](https://discourse.aosus.org/user_avatar/discourse.aosus.org/fariszr/32/9292_2.png) [@FarisZR](https://discourse.aosus.org/u/FarisZR)\
**Post date:** [28 يوليو 2022، 10:24م UTC](https://discourse.aosus.org/t/topic/2148/5 "2022-07-28T22:24:31Z")

</div>

> [@akkk33](#):
>
> ```auto
> - 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
> 
> ```

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

---

<div class="post-metadata">

**Author:** ![akkk33](https://discourse.aosus.org/user_avatar/discourse.aosus.org/akkk33/32/5174_2.png) [@akkk33](https://discourse.aosus.org/u/akkk33)\
**Post date:** [28 يوليو 2022، 10:50م UTC](https://discourse.aosus.org/t/topic/2148/6 "2022-07-28T22:50:00Z")

</div>

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

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

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

---

<div class="post-metadata">

**Author:** ![FarisZR](https://discourse.aosus.org/user_avatar/discourse.aosus.org/fariszr/32/9292_2.png) [@FarisZR](https://discourse.aosus.org/u/FarisZR)\
**Post date:** [28 يوليو 2022، 10:52م UTC](https://discourse.aosus.org/t/topic/2148/7 "2022-07-28T22:52:04Z")

</div>

> [@akkk33](#):
>
> لم أفهم ذلك جيدا ، هل سيمر هذا المنفذ عبر nginx ؟

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

---

<div class="post-metadata">

**Author:** ![akkk33](https://discourse.aosus.org/user_avatar/discourse.aosus.org/akkk33/32/5174_2.png) [@akkk33](https://discourse.aosus.org/u/akkk33)\
**Post date:** [28 يوليو 2022، 10:54م UTC](https://discourse.aosus.org/t/topic/2148/8 "2022-07-28T22:54:03Z")

</div>

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

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

---

<div class="post-metadata">

**Author:** ![FarisZR](https://discourse.aosus.org/user_avatar/discourse.aosus.org/fariszr/32/9292_2.png) [@FarisZR](https://discourse.aosus.org/u/FarisZR)\
**Post date:** [28 يوليو 2022، 10:54م UTC](https://discourse.aosus.org/t/topic/2148/9 "2022-07-28T22:54:47Z")

</div>

> [@akkk33](#):
>
> لكن سؤالي كان عن تعليقك على باقي المنافذ ٢٢٠٠٠ و ٢١٠٢٧ ، هل من اللازم كشفها للانترنت ؟

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

---

<div class="post-metadata">

**Author:** ![akkk33](https://discourse.aosus.org/user_avatar/discourse.aosus.org/akkk33/32/5174_2.png) [@akkk33](https://discourse.aosus.org/u/akkk33)\
**Post date:** [28 يوليو 2022، 10:55م UTC](https://discourse.aosus.org/t/topic/2148/10 "2022-07-28T22:55:39Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![FarisZR](https://discourse.aosus.org/user_avatar/discourse.aosus.org/fariszr/32/9292_2.png) [@FarisZR](https://discourse.aosus.org/u/FarisZR)\
**Post date:** [28 يوليو 2022، 10:56م UTC](https://discourse.aosus.org/t/topic/2148/11 "2022-07-28T22:56:36Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![akkk33](https://discourse.aosus.org/user_avatar/discourse.aosus.org/akkk33/32/5174_2.png) [@akkk33](https://discourse.aosus.org/u/akkk33)\
**Post date:** [28 يوليو 2022، 10:58م UTC](https://discourse.aosus.org/t/topic/2148/12 "2022-07-28T22:58:15Z")

</div>

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

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

---

<div class="post-metadata">

**Author:** ![FarisZR](https://discourse.aosus.org/user_avatar/discourse.aosus.org/fariszr/32/9292_2.png) [@FarisZR](https://discourse.aosus.org/u/FarisZR)\
**Post date:** [28 يوليو 2022، 10:59م UTC](https://discourse.aosus.org/t/topic/2148/13 "2022-07-28T22:59:24Z")

</div>

> [@akkk33](#):
>
> إذن syncthing يمكنه عمل مزامنة عبر هذا المنفذ كخطة احتياطية في حالة عدم القدرة على استخدام باقي المنافذ المخصصة للمزامنة … صحيح ؟

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

---

<div class="post-metadata">

**Author:** ![ammar\_alzhrani](https://discourse.aosus.org/user_avatar/discourse.aosus.org/ammar_alzhrani/32/4814_2.png) [@ammar\_alzhrani](https://discourse.aosus.org/u/ammar_alzhrani)\
**Post date:** [22 أغسطس 2022، 5:56ص UTC](https://discourse.aosus.org/t/topic/2148/14 "2022-08-22T05:56:50Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![FarisZR](https://discourse.aosus.org/user_avatar/discourse.aosus.org/fariszr/32/9292_2.png) [@FarisZR](https://discourse.aosus.org/u/FarisZR)\
**Post date:** [24 أغسطس 2022، 10:34م UTC](https://discourse.aosus.org/t/topic/2148/15 "2022-08-24T22:34:28Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![ammar\_alzhrani](https://discourse.aosus.org/user_avatar/discourse.aosus.org/ammar_alzhrani/32/4814_2.png) [@ammar\_alzhrani](https://discourse.aosus.org/u/ammar_alzhrani)\
**Post date:** [21 ديسمبر 2022، 7:19ص UTC](https://discourse.aosus.org/t/topic/2148/16 "2022-12-21T07:19:56Z")

</div>

بكل بساطة يتم فتح البورت الخاص بالحاوية ويتم تفعيل upstream مباشرة 👍🏻.

---

<div class="post-metadata">

**Author:** ![salemkode](https://discourse.aosus.org/user_avatar/discourse.aosus.org/salemkode/32/3700_2.png) [@salemkode](https://discourse.aosus.org/u/salemkode)\
**Post date:** [9 مايو 2024، 6:16م UTC](https://discourse.aosus.org/t/topic/2148/17 "2024-05-09T18:16:45Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![FarisZR](https://discourse.aosus.org/user_avatar/discourse.aosus.org/fariszr/32/9292_2.png) [@FarisZR](https://discourse.aosus.org/u/FarisZR)\
**Post date:** [9 مايو 2024، 7:36م UTC](https://discourse.aosus.org/t/topic/2148/18 "2024-05-09T19:36:44Z")

</div>

داخل دوكر؟

---

<div class="post-metadata">

**Author:** ![salemkode](https://discourse.aosus.org/user_avatar/discourse.aosus.org/salemkode/32/3700_2.png) [@salemkode](https://discourse.aosus.org/u/salemkode)\
**Post date:** [10 مايو 2024، 7:25ص UTC](https://discourse.aosus.org/t/topic/2148/19 "2024-05-10T07:25:16Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![FarisZR](https://discourse.aosus.org/user_avatar/discourse.aosus.org/fariszr/32/9292_2.png) [@FarisZR](https://discourse.aosus.org/u/FarisZR)\
**Post date:** [10 مايو 2024، 8:14م UTC](https://discourse.aosus.org/t/topic/2148/20 "2024-05-10T20:14:15Z")

</div>

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