تحرير: أعاد @pfaffman كتابة هذا المنشور كموضوع مستقل بناءً على ما كتبه @tophee سابقًا. لم أجرب هذا بعد بنفسي، وقد قمت بإعادة ترتيب كلمات Chris، لذا فإن أي أخطاء محتملة هي على الأرجح من @pfaffman.
هل هناك أي أسباب لعدم استخدام NGINX Proxy Manager بدلاً من القيام بذلك يدويًا كما هو موصوف في https://meta.discourse.org/t/running-other-websites-on-the-same-machine-as-discourse/17247؟
أنا أستخدمه بالفعل. لقد كان موجودًا على خادم منزلي لفترة من الوقت، وعندما قمت بنقل مثيل Discourse الخاص بي إلى سحابة جديدة، أدركت أنني نسيت معظم إعدادات الـ NGINX العكسي التي قمت بها قبل 4 سنوات على الخادم القديم، لذا فكرت: لماذا لا أفعل ذلك باستخدام NGINX Proxy Manager؟ وإلى دهشتي، وجدت أنه تم ذكره نادرًا هنا على Meta، لذا بدأت أتساءل عما إذا كانت هناك بعض العيوب التي قد تكون فاتتني…
في الواقع، تطلب ذلك بعض التجربة والخطأ، لكنني نجحت في جعله يعمل على النحو التالي (لا توجد ضمانات بأن هذه هي أفضل طريقة للقيام بذلك - في الواقع، أعرف أنه يجب أن تكون هناك طريقة أفضل - لذا فإن التصحيحات والتحسينات موضع ترحيب كبير):
للبداية، هناك طريقتان للوصول إلى مثيل Discourse: 1. عن طريق تعريض منفذ، 2. عبر Websocket. أعتقد أنني تعلمت في مكان ما على هذا المنتدى أن Websocket أسرع/أكثر كفاءة، لذا هذا ما أستخدمه، لكن تعريض المنفذ يجب أن يكون أسهل بكثير، لذا إذا لم تتمكن من جعل الـ Socket يعمل، جرب تعريض منفذ. لذا، لتجنب الارتباك: للوصول إلى Discourse عبر منفذ، اتبع الخطوات 0، 1، 2، 3، 4، و 8 أدناه. إذا كنت تريد استخدام Websocket، فاتبع الخطوات 0، 1، 5، 6، 7، 8، و 9.
0. نقطة البداية
لنفترض إذن أنك أكملت التثبيت القياسي لمدة 30 دقيقة ولنفترض أنك لم تسمح لـ Discourse بالحصول على شهادة lets encrypt بعد - لأنك لا تحتاج إليها عند استخدام وكيل عكسي. سيتولى NGINX Proxy Manager ذلك. لا يهم، مع ذلك، إذا كان لديك شهادة بالفعل. سيحصل NGINX Proxy Manager ببساطة على واحدة جديدة.
1. تثبيت NGINX Proxy Manager
الخطوة التالية هي تثبيت NGINX Proxy Manager بحيث يكون لديك حاويتا Docker إضافيتان تعملان (NGINX Proxy Manager وحاوية قاعدة البيانات الخاصة به).
التالي هو الجزء الصعب الذي تسأل عنه.
العقبة الأولى هي أن Discourse يعمل على شبكة bridge الافتراضية الخاصة بـ Docker بينما يعمل NGINX Proxy Manager افتراضيًا على شبكة “تم إنشاؤها بواسطة المستخدم” (تسمى npm_default في حالتي)، مما يعني أن NGINX Proxy Manager لا يمكنه رؤية Discourse. ![]()
2. جلب جميع الحاويات إلى شبكة الجسر الافتراضية
لذا، طالما أنني لا أعرف ما إذا كان يمكن نقل Discourse إلى شبكة مخصصة وكيف يمكن ذلك، يجب علينا نقل NGINX Proxy Manager إلى شبكة bridge الافتراضية. يمكننا القيام بذلك عن طريق إضافة network_mode: bridge إلى حاويتي NGINX Proxy Manager في ملف docker compose.
3. استخدام عنوان IP بدلاً من اسم الخدمة
المشكلة التالية هي أن ملف docker compose القياسي لن يعمل بعد الآن إذا قمت بنقله ببساطة إلى شبكة bridge. لن يتمكن NGINX Proxy Manager من العثور على حاوية قاعدة البيانات الخاصة به بعد الآن. وذلك لأن حل أسماء الخدمات الداخلي (الذي يعتمد عليه ملف docker-compose) متاح فقط على الشبكات التي تم إنشاؤها بواسطة المستخدم، وليس على شبكات Docker الافتراضية. لذا يجب أن نلجأ إلى عناوين IP ثابتة (وهو السبب في أن هذا بالتأكيد ليس الحل الأمثل لأنه سينكسر إذا تغيرت عناوين IP الخاصة بحاوياتك). لذا تحتاج إلى بدء الحاوية على الرغم من أنك تعرف أنها لن تعمل، وملاحظة عنوان IP الخاص بحاوية قاعدة بيانات NGINX Proxy Manager، واستبدال DB_MYSQL_HOST: "db" في ملف docker compose الخاص بك بـ DB_MYSQL_HOST: "<db_container_IP>".
لذا الآن يجب أن تكون جميع الحاويات على شبكة bridge الافتراضية بحيث يمكن لـ NGINX Proxy Manager رؤية كل من Discourse وقاعدة البيانات الخاصة به.
4. جعل Discourse قابلاً للوصول
لكن “رؤية” Discourse والقدرة على الوصول إليها ليستا نفس الشيء. لذا تحتاج إلى التأكد من أن Discourse سيقبل أي حركة مرور يقوم NGINX Proxy Manager بتوجيهها إليها. إذا لم تكن تهتم باستخدام Websocket، فأعتقد أنه يمكنك ببساطة توجيه NGINX Proxy Manager إلى المنفذ 80 (وليس 443) من عنوان IP الخاص بحاوية Discourse، مثل هذا:
لم أختبر هذا، على الرغم من ذلك. كما ذكرت، أنا أستخدم إعداد Websocket، والذي يتطلب بعض الخطوات الإضافية. لاحظ أن اسم المضيف/عنوان IP والمنفذ أعلاه سيتم تجاهلهما عند استخدام Websocket.
5. تكوين app.yml لاستخدام Websocket
هذا موضح في المنشور الأصلي، لذا لن أدخل في التفاصيل.
6. تركيب Websocket في حاوية NGINX Proxy Manager
نحتاج إلى منح NGINX Proxy Manager الوصول إلى Websocket عن طريق تركيبه كحجم: - /var/discourse/shared/standalone/nginx.http.sock:/var/discourse/shared/standalone/nginx.http.sock. هذا هو التغيير النهائي على ملف docker compose الافتراضي لـ NGINX Proxy Manager، لذا إليك النسخة النهائية التي تعمل معي:
version: '3'
services:
app:
image: 'jc21/nginx-proxy-manager:latest'
restart: unless-stopped
network_mode: bridge
ports:
- '80:80'
- '81:81'
- '443:443'
environment:
DB_MYSQL_HOST: "172.17.0.6"
DB_MYSQL_PORT: 3306
DB_MYSQL_USER: "npm"
DB_MYSQL_PASSWORD: "my-super-safe-pwd"
DB_MYSQL_NAME: "npm"
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
- /var/discourse/shared/standalone/nginx.http.sock:/var/discourse/shared/standalone/nginx.http.sock
db:
image: 'jc21/mariadb-aria:latest'
restart: unless-stopped
network_mode: bridge
environment:
MYSQL_ROOT_PASSWORD: 'my-super-safe-pwd'
MYSQL_DATABASE: 'npm'
MYSQL_USER: 'npm'
MYSQL_PASSWORD: 'my-super-safe-pwd'
volumes:
- ./data/mysql:/var/lib/mysql
7. تكوين NGINX Proxy Manager لاستخدام Websocket
الخطوة الأخيرة: أخبر NGINX Proxy Manager باستخدام Websocket. насколько я помню، لم يكن كافيًا مجرد تشغيل “دعم Websockets”، لذا قمت بنسخ موقع NGINX من المنشور الأصلي إلى علامة التبويب “متقدم”، مثل هذا:
لم أتمكن من جعل هذا يعمل تحت علامة التبويب “المواقع المخصصة”.
8. لا تنس تفعيل SSL
لم أذكر تكوين SSL في NGINX Proxy Manager لأنه يبدو واضحًا بحد ذاته ولا أعتقد أن الأمر يهم في أي نقطة من العملية تقوم بتفعيله. لذا إذا لم تكن قد فعلت ذلك بعد، فهذا ما يبدو عليه:
9. تحذير
tl;dr كلما قمت بإعادة تشغيل حاوية Discourse، تحتاج أيضًا إلى إعادة تشغيل حاوية NGINX Proxy Manager الرئيسية (لا حاجة لإعادة تشغيل قاعدة البيانات).
إذا كنت تصل إلى Discourse عبر Websocket، فيجب أن تدرك أنه عند إعادة بناء حاوية Discourse الخاصة بك (كما هو مطلوب كل بضعة أشهر لتحديث صورة الأساس)، سيتم حذف Websocket السابق وإنشاء واحد جديد. نتيجة لذلك، سيفقد NGINX Proxy Manager الاتصال بمثيل Discourse الخاص بك ويرمي خطأ 502. ربما سيكون تحديث مستقبلي لـ NGINX Proxy Manager قادرًا على العثور على Websocket الجديد تلقائيًا، لكن حاليًا (يناير 2022) لن يجد NGINX Proxy Manager حاوية Discourse المعاد بناؤها الخاصة بك ما لم تقم بإعادة تشغيل NGINX Proxy Manager.
الشرح
إذا كنت تتساءل عن سبب دمج التعليمات أعلاه لـ Websocket مع المنافذ، فإن السبب البسيط هو أنه، بينما كنت أكتب هذا المنشور، خطر لي فجأة أن NGINX Proxy Manager و Discourse ربما لا يحتاجان حتى إلى أن يكونا على نفس شبكة Docker عندما نستخدم Websocket. وعندما تم تأكيد ذلك، لم يشعر أحد بالرغبة في إعادة كتابة التعليمات بالكامل.
هذا هو الجانب الأكثر إثارة للاهتمام في منتديات الدعم: القيام بعمل جيد في وصف مشكلتك غالبًا ما يقودك إلى الحل دون حتى نشر سؤالك. وفي هذه الحالة، كنت أجيب على سؤال شخص آخر ولكن قد يكون أيضًا وجدت الإجابة على سؤالي الخاص. ![]()



