فشل تسجيل الدخول بسبب "خطأ غير معروف"

مرحبًا،

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

خطوات التكرار #1:

  1. قم بتثبيت خادم Discourse جديد باتباع التعليمات الواردة في دليل التثبيت عبر Docker.
  2. بمجرد اكتمال معالج الإعداد، تأكد من قدرتك على تسجيل الخروج والدخول بنجاح.
  3. استمر في استخدام المنتدى بشكل طبيعي. فقط قم بإنشاء بعض التصنيفات والمنشورات. ربما قم بتغيير السمة الافتراضية.
  4. بعد بضعة أيام أو أسابيع من الاستخدام العادي، لن تتمكن من تسجيل الدخول مرة أخرى بعد تسجيل الخروج. يفشل تسجيل الدخول مع ظهور رسالة “خطأ غير معروف” (يتم عرضها في نموذج تسجيل الدخول).

خطوات التكرار #2:

  1. قم بتثبيت خادم Discourse جديد باتباع التعليمات الواردة في دليل التثبيت عبر Docker.
  2. بمجرد اكتمال معالج الإعداد، تأكد من قدرتك على تسجيل الخروج والدخول بنجاح.
  3. استعد نسخة احتياطية من مثيل Discourse آخر كان يفشل فيه تسجيل الدخول.
  4. أثناء عملية الاستعادة، تظهر رسالة منبثقة تفيد بأنك قمت بتسجيل الخروج. نجحت عملية الاستعادة، لكن تسجيل الدخول يفشل مع ظهور رسالة “خطأ غير معروف” (يتم عرضها في نموذج تسجيل الدخول).

لقد حاولت تصحيح المشكلة بنفسي، لكنني لم أتمكن من العثور على أي رسائل خطأ ذات صلة. هذا ما جربته حتى الآن:

cd /var/discourse
./launcher enter app
tail -F log/production_errors.log
tail -F log/production.log
tail -F log/unicorn.stderr.log
tail -F log/unicorn.stdout.log

لا تظهر أي رسالة خطأ في هذه السجلات أثناء فشل تسجيل الدخول. ما الذي يمكنني فعله للمساعدة في تشخيص هذه المشكلة؟ شكرًا مسبقًا.

هل تفحصت /logs في متصفح الويب عند تسجيل الدخول كمسؤول؟

حسناً، لقد توصلت إلى شيء ما. يفشل تسجيل الدخول فوراً بعد تمكين إعداد “فرض HTTPS”. تقع نسخة Discourse الخاصة بي خلف خادم وكيل مع إنهاء SSL. بمجرد تعطيل “فرض HTTPS”، يعمل تسجيل الدخول مرة أخرى. لذا، فمن المرجح أن هذه ليست مشكلة في Discourse، بل هي مشكلة في إعداد البنية التحتية الخاصة بي.

لقد قمت أيضاً بما اقترحته، لكن لم يظهر أي رسالة خطأ في السجلات.

تم العثور على الحل أخيرًا. يجب تعيين رأس X-Forwarded-Proto، والذي يُستخدم لتحديد البروتوكول (HTTP أو HTTPS) الذي استخدمه العميل للاتصال بالوكيل أو موازن الحمل الخاص بك.

بما أنني أستخدم HAProxy كخادم وكيل، فقد اضطررت لإضافة هذا السطر إلى تكوين HAProxy:

http-request set-header X-Forwarded-Proto https if { ssl_fc }

الآن يعمل تسجيل الدخول بشكل صحيح حتى عند تمكين “فرض https”.

أود أيضًا استخدام بروتوكول PROXY عبر أي اتصال يتم إنشاؤه مع خادم Discourse الخاص بي. يُعلم بروتوكول PROXY الطرف الآخر (أي خادم Discourse) بعنوان الاتصال الوارد، بحيث يمكنه معرفة عنوان العميل أو العنوان العام الذي تم الوصول إليه. بدون هذا التغيير، لن يعرف Nginx عنوان العميل وستحتوي جميع السجلات على عنوان خادم الـ reverse-proxy الخاص بك بدلاً من ذلك. تقوم التغييرات التالية بتحقيق ذلك:

root@talk3:/var/discourse# git diff
diff --git a/templates/web.template.yml b/templates/web.template.yml
index a60e6ef..55cb5f2 100644
--- a/templates/web.template.yml
+++ b/templates/web.template.yml
@@ -116,6 +116,19 @@ run:
       to: daemon off;

   - replace:
+      filename: /etc/nginx/nginx.conf
+      from: /# server_tokens off;/
+      to: |
+        server_tokens off;
+        real_ip_header proxy_protocol;
+        set_real_ip_from 192.168.1.19;  # عنوان خادم الوكيل
+
+  - replace:
+      filename: "/etc/nginx/conf.d/discourse.conf"
+      from: /listen 80;$/
+      to: "listen 80 proxy_protocol;"
+
+  - replace:
       filename: "/etc/nginx/conf.d/discourse.conf"
       from: /upstream[^\}]+\}/m
       to: "upstream discourse {

وأمر HAProxy بفرض استخدام بروتوكول PROXY مع هذا الخادم:

-    server server-1 192.168.1.27:80 check
+    server server-1 192.168.1.27:80 check send-proxy

أخيرًا، قم بتشغيل الأمر ./launcher rebuild app وتأكد من أنه يسجل الآن عناوين العملاء:

tail -F /var/discourse/shared/standalone/log/var-log/nginx/access.log