هذا دليل لنقل مثيل Discourse الخاص بك من خادم إلى آخر، بما في ذلك جميع الإعدادات والبيانات. ينطبق هذا الدليل على مثيلات Discourse المستضافة ذاتيًا والتي تستخدم Docker.
مستوى المستخدم المطلوب: مسؤول النظام
يتضمن هذا الإجراء تغييرات في النطاق ونظام أسماء النطاقات (DNS). تأكد من حصولك على حق الوصول إلى كل من الخادم المصدر والخادم الوجهة.
يرشدك هذا الدليل خلال عملية ترحيل مثيل Discourse الخاص بك من خادم إلى آخر، مما يضمن الحفاظ على بياناتك وإعداداتك وتكوينك.
هذه التعليمات لا تعمل بشكل جيد الآن لأنك تستخدم https و Let’s Encrypt، مما يتطلب أن يشير نظام أسماء النطاقات (DNS) إلى الخادم الجديد حتى يتمكن من طلب المفاتيح. ما أوصي به هو اتباع نقل موقع Discourse إلى خادم افتراضي خاص آخر باستخدام rsync (ربما باستخدام --exclude postgres* ثم عمل نسخة احتياطية واستعادة قاعدة البيانات من سطر الأوامر.) هذا مفيد لأنه إذا كنت تعرف كيف، يمكنك تعديل نظام أسماء النطاقات المحلي الخاص بك للإشارة إلى الخادم الجديد حتى تتمكن من اختبار عمله بينما لا يزال باقي الإنترنت يرى الموقع القديم.
الملخص
ستقوم بتنفيذ الخطوات الرئيسية التالية في هذا الدليل:
عمل نسخة احتياطية لمثيل Discourse الحالي الخاص بك (الخادم المصدر).
نقل ملف النسخ الاحتياطي إلى مثيل Discourse الهدف الخاص بك (الخادم الوجهة).
استعادة النسخة الاحتياطية على الخادم الوجهة.
تحديث إعدادات نظام أسماء النطاقات (DNS) (إذا كان ذلك قابلاً للتطبيق).
تعديل إعدادات نظام أسماء النطاقات (DNS) (عند الضرورة)
إذا كنت تستخدم نفس النطاق للخادم الجديد، فقم بتقليل زمن البقاء (TTL) لسجل DNS الخاص بك مقدمًا. يضمن هذا الحد الأدنى من وقت التوقف أثناء انتشار سجلات DNS المحدثة. إذا كنت ستستخدم نطاقًا جديدًا، يمكن تخطي هذه الخطوة.
تسجيل الدخول وإعداد الخادم المصدر
سجل الدخول إلى مثيل Discourse المصدر الخاص بك باستخدام حساب لديه صلاحيات المسؤول.
تأكد من أن كل من الخادم المصدر والخادم الوجهة يستخدمان:
نفس إصدار Discourse.
نفس مجموعة المكونات الإضافية (Plugins).
قم بترقية إصدار Discourse على كلا الخادمين عن طريق زيارة /admin/upgrade.
تجنب استعادة نسخة احتياطية أحدث على إصدار Discourse أقدم، أو إصدارات PostgreSQL غير المتوافقة، حيث قد يؤدي ذلك إلى حدوث أخطاء.
إنشاء النسخة الاحتياطية وتنزيلها
انتقل إلى /admin/backups على مثيل Discourse المصدر الخاص بك.
قبل المتابعة، راجع ملف app.yml الخاص بك للتأكد من أن أي إعدادات اختيارية، مثل تكوينات شبكة توصيل المحتوى (CDN)، أو المكونات الإضافية المثبتة، أو دعم HTTPS، متسقة بين الخوادم المصدر والوجهة.
استعادة النسخة الاحتياطية على الخادم الوجهة
لاستعادة النسخة الاحتياطية عبر سطر الأوامر، راجع التوثيق ذي الصلة.
سجل الدخول كمسؤول إلى مثيل Discourse الوجهة الخاص بك.
انتقل إلى /admin/backups/settings، وقم بتمكين الإعداد allow restore.
انتقل إلى /admin/backups وانقر فوق علامة التبويب Backup files. قم بتحميل ملف النسخ الاحتياطي الذي قمت بتنزيله سابقًا بالنقر فوق الزر Upload:
ستبدأ عملية الاستعادة. قد يستغرق هذا بعض الوقت اعتمادًا على حجم قاعدة البيانات الخاصة بك. بعد اكتمال العملية، سيتم تسجيل خروجك تلقائيًا.
الانتهاء وتسجيل الدخول
سجل الدخول إلى مثيل Discourse الوجهة الخاص بك باستخدام بيانات اعتماد المسؤول الخاصة بك.
إذا تم عمل نسخة احتياطية للموقع باستخدام HTTPS، فتأكد من تمكين HTTPS على الخادم الجديد. إذا لم يتم تكوينه بشكل صحيح، استخدم وحدة تحكم Rails لتعطيل الإعداد “force https” مؤقتًا.
أعد تمكين أي تكوينات اختيارية عن طريق تعديل ملف app.yml وإعادة بناء المثيل الخاص بك. قد يشمل ذلك:
تمكين دعم شبكة توصيل المحتوى (CDN).
تثبيت مكونات إضافية إضافية.
تعيين تكوينات HTTPS.
المشاكل والحلول الشائعة
فشل استعادة ملف النسخ الاحتياطي
تحقق من تطابق إصدارات Discourse و PostgreSQL بين الخوادم المصدر والوجهة.
عدم القدرة على تسجيل الدخول بعد الاستعادة (مع تمكين HTTPS)
استخدم وحدة تحكم Rails لتعطيل force https مؤقتًا عن طريق تشغيل:
من أعتقد أنه من الصواب أن أقلق وأسأل عما إذا كان هذا مثل الوثائق. لقد قمت مؤخرًا بترقية منتدى Discourse الخاص بي وواجهت بعض المشكلات التي أدت إلى تعطل النظام، كنت أقوم فقط بالترقية من إصدار إلى أحدث إصدار. شيء ما عن المكونات الإضافية الجديدة التي أصبحت الآن جزءًا من النظام الأساسي لـ Discourse.
أعتقد أن الانتقال إلى مثيل مختلف بنظام تشغيل أحدث هو تغيير كبير. إذا كنت سأجرب هذا النهج، فسأحب الحصول على كل التعليقات الممكنة.
أعتقد ذلك، على الرغم من أنني لم ألقِ نظرة فاحصة. لا. سيفشل الموقع الجديد في الحصول على المفاتيح من Let’s Encrypt إذا لم يكن نظام أسماء النطاقات (DNS) يشير إليه. لذلك ستحتاج إلى عمل نسخة احتياطية، ونقل النسخة الاحتياطية، وتبديل نظام أسماء النطاقات (DNS) إلى الخادم الجديد، ثم إعادة البناء.
ما لم تكن قد قمت بالترقية إلى Postgres 15 بالفعل (وربما حتى في هذه الحالة)، فما أوصي به (وما أفعله) هو --exclude postgres*، وإعادة البناء، ثم عمل نسخة احتياطية للموقع الرئيسي واستعادة تلك النسخة الاحتياطية على الخادم الجديد. عند استعادتها، قم بتبديل نظام أسماء النطاقات (DNS). تتضمن تعليمات rsync إيقاف تشغيل قاعدة البيانات حتى تتمكن من نسخ ملفات قاعدة البيانات الخام. هناك بعض الحالات التي لن يعمل فيها هذا بشكل جيد، لذلك في الغالب أقوم بإنشاء نسخة احتياطية لقاعدة البيانات فقط واستعادتها.
شكراً جاي! لقد تساءلت لماذا واجهت بعض الصعوبات في مسألة عنوان URL / DNS / LetsEncrypt في الماضي (القريب) عند محاولة اتباع التعليمات الواردة في المنشور الأصلي.
لقد نجحت في النهاية باستخدام نطاق فرعي للموقع الجديد، والتأكد من أن موقعي المستعاد على الخادم الجديد كان يعمل، ثم إجراء تبديل سريع لنظام أسماء النطاقات / عناوين URL. لكن كل ذلك كان صعبًا ومؤلمًا بعض الشيء (خاصة إعادة التعيين لاحقًا!).
الآن أصبح من المنطقي سبب حاجتي إلى القيام بكل ذلك. ومن الجيد معرفة أن rsync يمكن أن يتجاوز بعض نقاط الألم.
أعتقد أن بعض التعليمات الواضحة هنا ستساعد الآخرين حقًا، حيث إن الأمر مربك بعض الشيء في الوقت الحالي - ولست متأكدًا من أفضل طريقة للقيام بذلك في المستقبل. هل يمكن دمج إخلاء المسؤولية الخاص بك في المنشور الأصلي كإعادة كتابة (ربما بواسطة @SaraDev؟).
أضيف هنا حالة شاذة (edge case) صادفتها أثناء الهجرة، في حال كانت مفيدة لغيري.
واجهت حالة شاذة متعلقة بـ Let’s Encrypt/SSL أثناء نقل نسخة Discourse مستقلة إلى خادم VPS جديد، لذا قمت بتوثيق خطوات التشخيص والاسترداد بدقة في حال كانت مفيدة لأي شخص آخر يتبع هذا الدليل.
في حالتي، لم يبدأ nginx داخل app لأن كلا ملفي .cer في /var/discourse/shared/standalone/ssl/ قد تحولا إلى ملفات بحجم صفر بايت:
PEM_read_bio_X509_AUX() failed
أدى إعادة البناء إلى محاولة إصدار الشهادة مرة أخرى، وبعد محاولات متكررة وصلت إلى حد معدل إصدار الشهادات (rate limit) الخاص بـ Let’s Encrypt. لم يكن نسخ ملفات الشهادات لا تزال صالحة من الخادم القديم كافياً بحد ذاته، لأن تشغيل app استبدلها مرة أخرى بملفات بحجم صفر بايت.
ما أصلح المشكلة في النهاية كان إيقاف app ونسخ كلا من دليل /var/discourse/shared/standalone/ssl/ العامل و حالة /var/discourse/shared/standalone/letsencrypt/ المقابلة من الخادم القديم، ثم تشغيل الحاوية مرة أخرى.
لقد وثقت التسلسل الكامل هنا:
هذه ملاحظات تشخيص/استرداد من هذه الهجرة الخاصة وليست بديلاً عن وثائق الهجرة أو HTTPS الرسمية.
هناك أيضاً موضوع أقدم على Meta يغطي وضع الفشل المتعلق بملفات .cer الفارغة: