تثبيت جديد يُرجع 502 Bad Gateway

مرحباً بالجميع،

لقد قمت بإعداد Discourse مرتين، مرة في حاوية ومرة حاليًا في جهاز افتراضي. في كلا التثبيتين، لا يمكن الوصول إلى Discourse. لست متأكدًا تمامًا مما قد يكون خطأ.

جهاز Discourse الافتراضي:

  • النوى 4
  • ذاكرة الوصول العشوائي 6 جيجابايت
  • مساحة التخزين 50 جيجابايت
  • نظام التشغيل: Ubuntu 22.04.3

أوامر تثبيت نظام التشغيل النظيف بعد:

apt update -y && apt upgrade -y && apt wget curl zip git docker.io -y && reboot

بعد ذلك، اتبعت الدليل التالي: discourse/docs/INSTALL-cloud.md at main · discourse/discourse · GitHub

بمجرد الانتهاء، يمكنني رؤية أن الحاوية قيد التشغيل ولكنها تُرجع 502 Bad Gateway.

كيف قمت بإعداده: Nginx Reverse Proxy (يتضمن SSL) → الجهاز الافتراضي. هذا لا يعمل.
لا يتم تحميله حتى عندما أقوم بإضافته مباشرة في ملف المضيفين الخاص بي.

من الأسطر الأخيرة للتثبيت، يمكنني رؤية أن Docker أنشأ شبكة جديدة:

DOCKER_HOST_IP=172.17.0.1 --name app -t -p 80:80 -p 443:443

كيف يمكنني جعله يستخدم عنوان IP الخاص بالجهاز المضيف؟
لا أحتاج إلى شبكة أخرى داخل شبكة. أنا سعيد للسماح لـ Docker باستخدام عنوان IP الخاص بالجهاز المضيف نظرًا لأنه الخدمة الوحيدة على هذا الجهاز الافتراضي.

سأكون ممتنًا لأي مساعدة!

هل هناك طريقة رسمية للتثبيت بدون Docker؟

إعجابَين (2)

هل الحاوية موجودة على جهاز لديه عنوان IP عام؟ هل لهذا العنوان IP العام اسم نطاق معين؟

هل قمت بتشغيل discourse-setup؟ هل تجاوزت الجزء الذي يتحقق مما إذا كان نظام أسماء النطاقات الخاص بك صالحًا والجهاز المضيف متاحًا؟

هل قمت بتشغيل الكثير من عمليات إعادة البناء بحيث تم تحديد معدل وصولك بواسطة Let’s Encrypt ولا يمكنك تعيين شهادة؟

لا، هذا الجهاز لديه عنوان IP محلي ويتم توجيه حركة المرور إلى عنوان IP المحلي عبر جدار الحماية الخاص بي. هذه ليست المشكلة.
عنوان IP العام لديه سجل A للخادم ويتم توجيهه بشكل صحيح. forum.somedomain.com يشير –\u003e إلى الخادم الصحيح.

نعم، لقد تجاوزت التثبيت. أكملته بنسبة 100٪ (3 مرات) حتى وصلت إلى نقطة تشغيل الحاوية.
لقد تجاوزت جميع فحوصات النطاق/نظام أسماء النطاقات. يذكر أنها صالحة.

لا، لا يمكن تحديد معدل لهذا لأنه يتم إصدار شهادة SSL عبر الوكيل العكسي الخاص بي. لدي الشهادة.

هذا التثبيت مكتمل بنسبة 100٪. المشكلة هي أن Docker ينشئ شبكة جديدة 172.17.0.1 وهي غير ضرورية لأنني أرغب في استخدام عنوان IP المحلي للخادم 192.xx.xx.xx
الحاوية قيد التشغيل ولكن على شبكة مختلفة. لا يمكنني جعلها تعمل على عنوان IP للخادم.

يجب أن يكون عنوان IP لخادم Docker هو عنوان IP للخادم المضيف (192.xxx.xxx.xxx) وليس شبكة جديدة. من المحتمل أنها تعمل ولكن على تلك الشبكة.
كيف أخبر التثبيت باستخدام عنوان IP المحلي الخاص بي وليس 172.17.0.1

@pfaffman شيء مثل هذا. من تعليق أدليت به

كيف أقوم بتعيين ./discourse-setup لاستخدام عنوان IP للمضيف 192.168.1.X والشبكة عند التثبيت؟

لا يمكنك استخدام discourse-setup مع وكيل عكسي. سيتعين عليك تعديل ملف yml بنفسك. هناك بعض المواضيع حول تشغيل discourse مع مواقع أخرى على نفس الجهاز.

ستحتاج إلى إزالة قوالب ssl و let's encrypt إذا كنت تستخدم وكيلًا عكسيًا يقوم بإدارة شهادات SSL.

هذا هو الشيء، أنا لا أقوم بتشغيل أي خدمات أخرى على هذا الجهاز. إنها آلة افتراضية مستقلة.

أعتقد أن هناك سوء فهم.

يقوم ./docker-setup بالتثبيت بنجاح. يقوم بإنشاء شبكة خاصة به للتطبيق 172.17.0.1.

كيف أجعل التثبيت أو حاوية دوكر تستخدم عنوان IP الخاص بالمضيف 192.168.1.X كما في استخدام شبكة جسرية بدلاً من إنشاء شبكتها الخاصة.

ولكنك قلت هذا:

إذا كنت تستخدم وكيلًا عكسيًا، فلا يمكنك استخدام discourse-setup.

نعم، الوكيل العكسي موجود على خادم آخر ولكني أفهم ما تقوله.

لدي فكرة. سأقوم فقط بتوجيه كل حركة المرور من شبكتي إلى شبكة حاويات docker.

هل يوجد دليل تثبيت لتشغيل discourse خلف وكيل عكسي nginx؟

أو طريقة يمكنني من خلالها بناء discourse بنفسي؟

هذا أمر تافه للغاية. أنت تسمح بمنفذ http في ملف app.yml حيث يرسل Ngix حركة المرور. وتم تعطيل SSL. هذان هما الشيئان الوحيدان اللذان يجب عليك إصلاحهما. بالطبع، عليك تحديد عنوان IP الحقيقي، ولكن يجب عليك القيام بذلك في كل مرة يكون لديك فيها Discourse أو Moodle أو WordPress في الواجهة الخلفية، بغض النظر عن ماهيتها. يحاول UFW تقييد الوصول فقط بين الواجهة الأمامية والخلفية لأنه لا داعي للسماح بالوصول المباشر إلى الواجهة الخلفية.

إذا كنت أتذكر بشكل صحيح، فهنا توجد وثائق حول كيفية إعداد Apache2. Nginx يفعل الشيء نفسه، ولكن بطريقته الخاصة بالطبع.

أم ما الذي فاتني الآن؟

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

دعني أبدأ من البداية حتى تتمكن من معرفة أنني أغفل شيئًا بسيطًا.

لدي Nginx Reverse Proxy. يقوم بتشغيل وإدارة عنوان IP العام وتوجيه الخدمات.

مثال: يطلب العميل cloud.domain.com → Nginx Reverse Proxy (يتعامل مع SSL) → يشير إلى cloud.domain.com

الآن قمت بإعداد جهاز افتراضي لـ discourse واستخدمت ما يلي:
Ubuntu 23.04. أوامر ما بعد تثبيت نظام التشغيل:

apt update -y \
apt upgrade -y \
apt install wget curl zip git docker.io -y

ثم اتبعت هذا الدليل من Discourse discourse/docs/INSTALL-cloud.md at main · discourse/discourse · GitHub

يكتمل التثبيت بنجاح ثم تبدأ المشاكل.

لا يمكنني الوصول إلى حاوية docker من المضيف بسبب شبكة docker0. يمكنني ping 172.17.0.2 وهي تعمل ولكن من الجهاز المضيف 192.168.1.10:80/443 لا تمرر حركة المرور إلى الحاوية.

كل ما أريده هو أن تستخدم حاوية docker شبكة المضيف لأن الحاوية لديها منافذ 80 و 443 مكشوفة.

يقوم وكيل Nginx العكسي الأول بالتعامل مع حركة المرور من الخارج ويمررها إلى الجهاز الافتراضي بشكل صحيح. إذا لم يفعل ذلك، فلن يتمكن ./discourse-setup من التقاط اسم النطاق بشكل صحيح ولن يتمكن من استرداد شهادات SSL للحاوية.

في النهاية. أعلم أن الحاوية تعمل بنسبة 100٪، لا يمكنني الوصول إليها إلا بسبب شبكة docker.

إذا كنت بحاجة إلى أي معلومات، فيرجى إخباري.

هناك طريقة أخرى لمعالجة هذا وهي استخدام صورة discourse الأساسية
https://hub.docker.com/r/discourse/base
وإنشاء التنسيق الخاص بك باستخدام docker compose (مع تذكر أنك بحاجة إلى بعض الخدمات الأخرى مثل redis و postgres)

يمكنني القيام بذلك باستخدام Nginx أو Nginx+Varnish لتوجيه Discourse إلى نفس خادم VPS أو خادم VPS بعنوان IP مختلف. أنت لا تخبرني بما تفعله بالفعل باستخدام Nginx الخاص بك الذي يعمل كوكيل عكسي. أمثلتك صعبة بعض الشيء لأنه لا توجد طريقة لمعرفة ما إذا كانت هذه أمثلة أم أنك تحاول بالفعل استخدام شبكة خاصة.

لكن:

بالطبع لا، لأن ذلك يعتني بحركة المرور الواردة. يجب عليك استخدام منفذ آخر للواجهة الخلفية.

شيء مثل هذا (يتم استخدامه بالفعل مع Varnish، ولكن المبدأ هو نفسه تمامًا، وهو مستوى 101 للغاية):

proxy_pass http://127.0.0.1:8080;
proxy_set_header X-Real-IP  $remote_addr;
proxy_set_header X-Forwarded-For
 $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Forwarded-Port 443;
proxy_set_header Host $host;
proxy_pass_header Server;

مفهوم، شكراً لكونك محدداً :).

لست متأكداً من ماذا لأن شبكة دوكر هذه مربكة.

بالتأكيد لهذا السبب أشعر بالإحباط من دوكر هههه

أدناه هو بالضبط كيف تمر شبكة WAN وتوجه حركة المرور من وكيل Nginx العكسي الخاص بي إلى المضيف الصحيح.

map $scheme $hsts_header {
    https   "max-age=63072000;includeSubDomains; preload";
}

server {
  set $forward_scheme https;
  set $server         "10.10.1.38";
  set $port           443;

  listen 80;
listen [::]:80;

  listen 443 ssl http2;
listen [::]:443 ssl http2;


  server_name forum.domainname.com;

  # Let's Encrypt SSL
  include conf.d/include/letsencrypt-acme-challenge.conf;
  include conf.d/include/ssl-ciphers.conf;
  ssl_certificate /srv/ssl/domainname.pem;
  ssl_certificate_key /srv/ssl/domainname-ke.pem;


# Asset Caching
include conf.d/include/assets.conf;

# Block Exploits
include conf.d/include/block-exploits.conf;

# HSTS (ngx_http_headers_module is required) (63072000 seconds = 2 years)
add_header Strict-Transport-Security $hsts_header always;

# Force SSL
include conf.d/include/force-ssl.conf;

proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $http_connection;
proxy_http_version 1.1;


access_log /var/logs/domainname-access.log proxy;
error_log /var/logs/domainame_error.log warn;

proxy_set_header  X-Real-IP $remote_addr;
proxy_set_header  X-Forwarded-For $http_x_forwarded_for;
proxy_set_header  X-Forwarded-Proto $scheme;

location / {

  # HSTS (ngx_http_headers_module is required) (63072000 seconds = 2 years)
  add_header Strict-Transport-Security $hsts_header always;

    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $http_connection;
    proxy_http_version 1.1;
    
    # Proxy!
    include conf.d/include/proxy.conf;
  }
}

الغريب، لقد قمت بإعداد حاوية دوكر مرة واحدة لعميل أراد مدير وكيل Nginx العكسي وكان الأمر بسيطًا للغاية.

docker-compose up -d
كان هذا كل شيء. كان بإمكان IP الخاص 192.168.1.3 الوصول إلى منافذ 80/443 المكشوفة للحاويات وتم توجيه حركة المرور الصادرة بشكل صحيح إلى 192.168.1.3.

إنها مربكة لأنها نظام تغليف يلعب في صندوقه الرملي الخاص. في الأساس هذا هو.

لكن فهم دوكر شيء مختلف عن استخدامه (والآن بدأت مجموعة من المطورين في البكاء :rofl:) وكيلك العكسي يرسل حركة المرور إلى عنوان IP عبر جدار الحماية وعليك إخبار عنوان IP هذا ومنفذ الاستماع. ولديك Discourse، المعروف أيضًا باسم دوكر، على عنوان IP هذا، والمنفذ الذي تخبره في app.yml. يتولى Nginx الداخلي الذي يعمل مع Discourse نفسه الباقي.

لا ينبغي لـ Discourse الاستماع إلى 443 لأنك أنهيت بالفعل SSL.

وبشكل أساسي لا يمكنك استخدام التخزين المؤقت على الوكيل العكسي. الواجهة الخلفية، Discourse، ليست صفحة ويب. إنها تطبيق ويب يرسل جافاسكريبت وجيسون.

لقد فهمت ذلك نوعًا ما.

هذا شيء يمكنني الاتفاق عليه. لا أقول بكاء، بل هو عديم الفائدة لمسؤولي الأنظمة والمطورين الذين يعرفون طريقهم في لينكس. إنشاء LxC أو VM معزولة ثم السماح لدوكر بإنشاء بيئة معزولة أخرى هو أمر زائد عن الحاجة ولا طائل منه.

هذا هو الجزء المربك. يكشف app.yml عن 80:80 و 443:443 على 172.17.0.2 وهو على شبكة دوكر 172.17.0.1/16 مع عنوان IP الخاص بالجهاز الظاهري على 10.10.1.38.

كيف أجعل Discourse/docker يسمح لكل حركة المرور الواردة إلى 10.10.1.38 بالمرور إلى 172.17.0.2 ويجب تمرير كل حركة المرور الصادرة إلى 10.10.1.38. هذا كل ما هو مطلوب لحل هذه المشكلة. حرفيًا.

سيتعامل وكيل العكسي الخاص بي مع التوجيه من WAN إلى forum.domainname.com

تمت إزالة التخزين المؤقت.

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

فقط إذا لم تقم بتغييرها. كما يجب عليك استخدام منفذ واحد فقط.

80:80 و 443:443 هي الإعدادات الافتراضية وتستخدم بحد ذاتها فقط عندما لا يوجد وكيل عكسي، أو أي شيء آخر، يعمل كواجهة أمامية.

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

لقد أعطيتني فكرة.

كنت مشغولاً بالتحقق من جميع الملفات الأساسية وأعتقد أنني اكتشفت الأمر.

بسيط جداً ههه. أنا مشغول بإعادة البناء، قد ينجح هذا بنسبة 100% باستخدام طرق التثبيت القياسية المدعومة رسمياً.

نجاح تم تثبيت المنتدى الآن وهو يعمل.

باستخدام الطريقة القياسية والمدعومة للتثبيت :smiley:


إعجابَين (2)

@pfaffman يمكنك نقل هذا إلى التثبيت لأنه أصبح الآن تثبيتًا مدعومًا.

إنه موجود. إنه مُصنّف على أنه غير مدعوم :smirking_face:

ما كانت مشكلتك في المقام الأول ولماذا لم تبدأ التثبيت بدون وكيل عكسي؟ أنا فقط فضولي.