حافظ على جلسات المستخدم عند الترحيل إلى مضيف جديد

متابعة للنقاش من نقل مثيل Discourse إلى خادم مختلف:

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

  • قد يُثبط بعض المستخدمين عن المشاركة إذا واجهوا صعوبة في إعادة تسجيل الدخول.
  • قد يحتاج بعض المستخدمين إلى مساعدة لاستعادة كلمات مرورهم.
  • قد ينشئ بعض المستخدمين حسابات جديدة، مما يؤدي إلى فصل سجل مشاركاتهم وملاحظات المستخدمين عنهم، تاركين وراءهم حسابًا “زومبي”.

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

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

ومع ذلك، عند نقل مثيل Discourse، يمكن تجاوز هذه المشكلة باتباع الخطوات التالية لنسخ المفتاح السري، مما يتيح نقل المضيف مع استمرار جلسات المستخدمين.

الخطوة 1: استرجاع المفتاح السري

ادخل إلى مثيل Discourse الحالي، وقم بتشغيل وحدة تحكم Rails، ثم احصل على المفتاح السري:

admin@host:/var/discourse$ ./launcher enter app
root@host:/var/www/discourse# rails console
[1] pry(main)> GlobalSetting.safe_secret_key_base
=> "90.......fed"

لاحظ القيمة المطبوعة في السطر الأخير واحفظها بشكل آمن.

الخطوة 2: تعيين المفتاح السري في المثيل الجديد

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

env:
  DISCOURSE_SECRET_KEY_BASE: "90.......fed"

بعد إضافة هذا، أعد بناء المثيل:

admin@newhost $ launcher rebuild app

الخطوة 3: التحقق من المفتاح السري في المثيل الجديد

هذه الخطوة مماثلة للخطوة 1، باستثناء تشغيل الأوامر على المضيف الجديد:

admin@newhost:/var/discourse$ ./launcher enter app
root@newhost:/var/www/discourse# rails console
[1] pry(main)> GlobalSetting.safe_secret_key_base
=> "90.......fed"

يجب أن يكون المفتاح السري المطبوع مطابقًا تمامًا للمفتاح في الخطوة 1.

الخطوة 4: المتابعة في عملية النقل

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

يجب أن تستمر الجلسات المسجلة سابقًا الآن على المضيف الجديد.

تحذير

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

كما هو الحال دائمًا، قم بتجربة الخطوات المذكورة أعلاه والتحقق منها على مثيل sandbox أو تثبيتات اختبارية قبل العمل على مثيل Discourse حقيقي. استعد للنجاح!

وأخيرًا وليس آخرًا، شكرًا جزيلاً لـ @david على وصفه لهذه الطريقة - لقد قمت أنا فقط باختبارها وكتبتها هنا (ولا تتردد في تحريرها أو تحسينها!).

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