نقل منتدى NodeBB مع Redis إلى Discourse

ستعرض لك هذه الدليل كيفية استخدام NodeBB Importer لترحيل منتدى NodeBB إلى منصة Discourse. إذا كان منتدى NodeBB الخاص بك يستخدم MongoDB كقاعدة بيانات خلفية، فاتبع هذا الدليل. لا تقلق، إنها عملية سهلة. لنبدأ.

الخطة

  • إعداد بيئة التطوير.
  • تصدير قاعدة البيانات من بيئة الإنتاج.
  • استيراد قاعدة بيانات الإنتاج إلى مثيل Discourse.
  • تشغيل سكريبت الاستيراد.

ما هي البيانات التي يمكن ترحيلها؟

  • المجموعات
  • التصنيفات
    • التصنيف الجذري =\u003e التصنيف الجذري
    • التصنيف الفرعي والتصنيف الفرعي-الفرعي =\u003e التصنيف الفرعي
  • المرفقات
  • المواضيع والمنشورات
    • الموضوع المثبت =\u003e الموضوع المثبت
    • مشاهدات المواضيع
    • سيتم ترحيل جميع الأنماط بشكل صحيح مع الإشارات والرموز التعبيرية والمرفقات.
  • المستخدمين (مع السمات التالية)
    • الصور الرمزية (صورة الملف الشخصي)
    • خلفية الملف الشخصي
    • حالة الحظر
    • الاسم
    • اسم المستخدم
    • البريد الإلكتروني
    • السيرة الذاتية
    • المشرف
    • الموقع الإلكتروني
    • الموقع الجغرافي
    • حالة الانضمام
    • المجموعة

إعداد بيئة التطوير المحلية

قم بإعداد بيئة التطوير الخاصة بك باتباع أحد هذه الأدلة:

من الآن فصاعدًا، سأشير إلى هذه البيئة باسم خادم Discourse.

:bulb: يرجى استخدام هذا الدليل إذا واجهت أي مشكلة في إعداد Discourse.

تصدير نسخة احتياطية من قاعدة بيانات الإنتاج (من خادم NodeBB):

أوقف تشغيل المنتدى. هذا موصى به من قبل NodeBB.

$ cd /path_to_nodebb
$ ./nodebb stop

يجب عليك أيضًا إيقاف تشغيل Redis:

$ sudo service redis-server stop
$ sudo service redis-server status
# redis-server is not running

قاعدة بيانات المنتدى الخاصة بك موجودة في ملف واحد. يتم إنشاء هذا الملف تلقائيًا بشكل دوري بواسطة Redis. عادةً ما يكون هذا الملف موجودًا في /var/lib/redis/dump.rdb. أيضًا، يمكنك الحصول على المسار من واجهة سطر أوامر Redis (Redis CLI):

$ redis-cli
127.0.0.1:6379\u003e config get dir
# "/var/lib/redis"
127.0.0.1:6379\u003e exit
$ ls -la /var/lib/redis
# -rw-rw-r-- 1 redis redis 2664346 Aug 4 16:24 dump.rdb

:bulb: إذا كان خادم Redis الخاص بك يتطلب كلمة مرور، استخدم AUTH YOUR_PASSWORD.

:bulb: إذا لم تجد ملف قاعدة البيانات في المسار المتوقع لسبب ما، يمكنك إنشاؤه يدويًا بتشغيل SAVE داخل واجهة سطر أوامر Redis.

الآن تحتاج إلى نسخ مرفقات المنتدى:

$ cd /path_to_nodebb_root_folder/
$ tar -czf ./uploads.tar.gz ./public/uploads

الآن بعد أن حصلت على قاعدة بياناتك وأصول المنتدى، تحتاج إلى نسخها إلى خادم Discourse.

استيراد قاعدة البيانات

إذا اتبعت تعليمات تثبيت Discourse، فيجب أن يكون لديك خادم Redis مثبتًا على خادم Discourse:

$ redis-server -v
# Redis server v=5.0.2...

الآن تحتاج إلى إيقاف تشغيل خادم Redis (مهم).

بناءً على Linux:

$ sudo service redis-server stop
$ sudo service redis-server status
# redis-server is not running

Mac OS:

$ brew services stop redis
$ brew services list
# redis stopped

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

$ redis-cli
127.0.0.1:6379\u003e config get dir
# "/var/lib/redis"

تحقق مما إذا كانت هناك أي ملفات، وقم بتدوين ملاحظات حول المستخدم الحالي وإذنات ملف dump.rdb:

$ ls -la /var/lib/redis

انسخ قاعدة بيانات NodeBB (استبدل إذا كان هناك ملف موجود):

$ cp dump.rdb /var/lib/redis

لاحقًا، عند محاولة الاتصال بخادم Redis، قد تحصل على Fatal error loading the DB: Permission denied، لذلك يجب عليك تغيير إذنات ملف dump.rdb:

# استبدل المستخدم بنفس المستخدم الذي دوّنته سابقًا.
$ sudo chown redis:redis /var/lib/redis/dump.rdb
$ sudo chmod 660 /var/lib/redis/dump.rdb

الآن تحتاج إلى فك ضغط ملف uploads.tar.gz إلى أي مسار تختاره:

$ tar xvzf uploads.tar.gz

تشغيل سكريبت الاستيراد

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

هذا هو مسار مجلد المرفقات في NodeBB:

ATTACHMENT_DIR = '/absolute_path/uploads'

هذا هو اسم قاعدة البيانات في Redis. الافتراضي هو 0:

db: 0

شغّل السكريبت مع Discourse نظيف:

$ cd ~/discourse
$ bundle exec rake db:drop db:create db:migrate
$ bundle exec ruby script/import_scripts/nodebb/nodebb.rb

سيتم الاتصال بسكريبت الاستيراد بخادم Redis وترحيل كل شيء إلى قاعدة بيانات PostgreSQL الخاصة بـ Discourse.

بعد انتهاء السكريبت، ابدأ منصة Discourse:

$ bundle exec rails server

ابدأ Sidekiq لمعالجة البيانات المرحّلة:

$ bundle exec sidekiq

يمكنك مراقبة التقدم في http://localhost:3000/sidekiq/queues.

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

بهذا، يجب أن تكون قد نجحت في إتمام الترحيل الكامل من NodeBB إلى Discourse :tada:
يرجى، إذا كان لديك أي أسئلة، فسأكون سعيدًا للمساعدة :slight_smile:

9 إعجابات

أنا أستمر في الإلحاح بشأن الترحيل الخاص بي في مواضيع مختلفة :smiley:

لدي منتدى على NodeBB مع Redis وتمكنت من إكمال العملية دون أخطاء في الإصدار التجريبي، ولكن لا تزال لدي بعض الأسئلة:

  • في نص الترحيل، وضعت المسار المطلق حيث كانت لدي الصور وملفات المنتدى. عندما انتهيت من الترحيل، أرى أن الصور غير مرئية في المواضيع. في Discourse، تظهر مرتبطة في عنوان URL: assets/uploads، ولكن لا يوجد شيء هناك.

    في الإصدار التجريبي، قمت بحل هذه المشكلة عن طريق إنشاء رابط رمزي:
    ln -s path/to/images public/assets

    ولكن في الإصدار الإنتاجي، ماذا يجب أن أفعل لإنشاء رابط من assets/upload داخل docker إلى المجلد الذي وضعت فيه الصور القديمة؟

  • يبدو أن جميع مواضيع المنتدى قد تم ترحيلها بشكل صحيح، ولكنني لا أرى الرسائل المباشرة بين المستخدمين… هل هي ليست في الترحيل؟

  • لم يكتشف النص أي صور رمزية للمستخدمين.

  • وأخيرًا، في المنتدى الجديد لا أرى أي تضمين لمقاطع فيديو يوتيوب أو تغريدات. هل يجب علي تثبيت إضافة لذلك؟

شكراً جزيلاً على مساعدتك.

لا ينبغي أن يكون هذا ضروريًا. إذا كانت لديك صورك الأصلية في مسار، تم تكوينه في ATTACHMENT_DIR، فسيقوم Discourse بإنشاء تحميل (بشكل أساسي، نسخة من الملف) في path-to-your-install/discourse/public/uploads/default/. إذا قمت بفحص جدول التحميلات، فيجب أن يبدو كالتالي:

[1] pry(main)> Upload.last
  Upload Load (1.5ms)  SELECT "uploads".* FROM "uploads" ORDER BY "uploads"."id" DESC LIMIT 1
=> #<Upload:0x0000000109a460a0
 id: 196,
 user_id: 251468,
 original_filename: "Screenshot 2023-11-17 at 11.52.39.png",
 filesize: 25174,
 width: 398,
 height: 248,
 url: "/uploads/default/original/1X/2e5f7a09ba3bcd3a3597285771c53c16f20b18dd.png",
 created_at: Fri, 17 Nov 2023 19:12:47.455954000 UTC +00:00,
 updated_at: Fri, 17 Nov 2023 19:12:47.484137000 UTC +00:00,
 sha1: "2e5f7a09ba3bcd3a3597285771c53c16f20b18dd",

صحيح، يبدو أن نص NodeBB لا يقوم بترحيل الرسائل الخاصة. يمكنك التحقق من النصوص الأخرى لمعرفة كيفية استيراد الرسائل الخاصة، تحقق من نص Vanilla على سبيل المثال.

من المحتمل أن الصور الرمزية لا يتم تحميلها بشكل صحيح، ربما لنفس المشكلة التي ذكرتها أعلاه.

لا حاجة لإضافة. ربما تحتاج إلى إعادة خبز منشوراتك. يمكنك الانتظار حتى يقوم Sidekiq بذلك تلقائيًا، أو يمكنك تشغيل إعادة خبز كاملة من وحدة التحكم:

rake posts:rebake

لم يتم تحديث نص NodeBB منذ بضع سنوات، لذا تخميني هو أن بعض أجزائه قديمة وتحتاج إلى تعديل لكي تعمل مع بياناتك. آمل أن يساعد هذا!

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