أقوم بتشغيل نسخة خاصة من Discourse قمت بتثبيتها باتباع دليل التثبيت عبر Docker الأساسي. المشكلة التي أواجهها هي أنه بعد بضعة أيام من استخدام المنتدى، يتوقف تسجيل الدخول عن العمل تمامًا. تجدر الإشارة إلى أنني المستخدم الوحيد في هذا المنتدى. لكن للأسف، لا أعرف ما الذي يسبب هذه الخلل.
خطوات التكرار #1:
قم بتثبيت خادم Discourse جديد باتباع التعليمات الواردة في دليل التثبيت عبر Docker.
بمجرد اكتمال معالج الإعداد، تأكد من قدرتك على تسجيل الخروج والدخول بنجاح.
استمر في استخدام المنتدى بشكل طبيعي. فقط قم بإنشاء بعض التصنيفات والمنشورات. ربما قم بتغيير السمة الافتراضية.
بعد بضعة أيام أو أسابيع من الاستخدام العادي، لن تتمكن من تسجيل الدخول مرة أخرى بعد تسجيل الخروج. يفشل تسجيل الدخول مع ظهور رسالة “خطأ غير معروف” (يتم عرضها في نموذج تسجيل الدخول).
خطوات التكرار #2:
قم بتثبيت خادم Discourse جديد باتباع التعليمات الواردة في دليل التثبيت عبر Docker.
بمجرد اكتمال معالج الإعداد، تأكد من قدرتك على تسجيل الخروج والدخول بنجاح.
استعد نسخة احتياطية من مثيل Discourse آخر كان يفشل فيه تسجيل الدخول.
أثناء عملية الاستعادة، تظهر رسالة منبثقة تفيد بأنك قمت بتسجيل الخروج. نجحت عملية الاستعادة، لكن تسجيل الدخول يفشل مع ظهور رسالة “خطأ غير معروف” (يتم عرضها في نموذج تسجيل الدخول).
لقد حاولت تصحيح المشكلة بنفسي، لكنني لم أتمكن من العثور على أي رسائل خطأ ذات صلة. هذا ما جربته حتى الآن:
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
لا تظهر أي رسالة خطأ في هذه السجلات أثناء فشل تسجيل الدخول. ما الذي يمكنني فعله للمساعدة في تشخيص هذه المشكلة؟ شكرًا مسبقًا.
حسناً، لقد توصلت إلى شيء ما. يفشل تسجيل الدخول فوراً بعد تمكين إعداد “فرض 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 الخاص بك بدلاً من ذلك. تقوم التغييرات التالية بتحقيق ذلك: