نقل منتدى MyBB إلى Discourse

في هذا البرنامج التعليمي، سنتعلم كيفية نقل منتدى MyBB إلى منصة :discourse: باستخدام سكريبت الاستيراد الرسمي MyBB Importer.

ما الذي يمكن نقله

  • التصنيفات
    • التصنيف الجذري => التصنيف الجذري
    • التصنيف الفرعي => التصنيف الفرعي
    • المنتدى الجذري => التصنيف الفرعي
    • المنتدى الفرعي => التصنيف الفرعي
  • المواضيع والردود => المواضيع والمنشورات
  • المستخدمين
    • اسم المستخدم
    • البريد الإلكتروني
    • حالة الامتيازات
    • حالة الانضمام
  • إعادة التوجيه

خطتنا بسيطة للغاية:

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

فلنبدأ :slightly_smiling_face:

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

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

قم بتثبيت خادم قاعدة بيانات MySQL؛

MacOS:

$ brew install mysql@5.7
$ echo 'export PATH="/usr/local/opt/mysql@5.7/bin:$PATH"' >> ~/.bash_profile
$ source ~/.bash_profile

تحقق من حالة الخدمة:

$ brew services list

يجب أن ترى شيئًا مثل هذا:

mysql@5.7         started

وإلا، قم بتشغيل الأمر التالي وحاول مرة أخرى:

$ brew services start mysql@5.7

Ubuntu 18.04:

$ sudo apt update
$ sudo apt install mysql-server -y

بعد الانتهاء من تثبيت MySQL، تحقق من حالته:

$ systemctl status mysql.service

إذا لم يكن قيد التشغيل، قم بتشغيل الأمر التالي:

$ sudo systemctl start mysql

بالنسبة لـ Windows، يمكنك اتباع دليل التثبيت الرسمي.

سنطلق على هذه البيئة اسم: خادم Discourse.

تصدير قاعدة بيانات الإنتاج

قم بتصدير/نسخ قاعدة بيانات الإنتاج احتياطيًا (من خادم MyBB الإنتاجي) بتشغيل الأمر التالي:

$ mysqldump -u USER_NAME -p DATABASE_NAME > mybb_dump.sql
  • انسخ هذا الملف المصدّر إلى خادم Discourse.

:bulb: يمكنك استخدام scp أو rsync لنسخ قاعدة البيانات.

استيراد قاعدة بيانات الإنتاج إلى Discourse

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

$ mysql -u root

:bulb: إذا كان لديك مستخدم قاعدة بيانات بكلمة مرور، فيجب عليك استخدام: mysql -u root -p ثم أدخل كلمة المرور الخاصة بك.

mysql> CREATE DATABASE mybb;

تأكد من إنشاء قاعدة البيانات بنجاح بتشغيل الأمر التالي:

mysql> SHOW DATABASES;

يجب أن ترى شيئًا مثل:

+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| mybb               |
| sys                |
+--------------------+

قاعدة بيانات mybb فارغة حتى الآن. خطوتنا التالية هي استيراد قاعدة بيانات الإنتاج إليها.

$ mysql -u root mybb < mybb_dump.sql

لاحقًا، سنحتاج إلى بادئة الجدول. لذا، بينما نحن هنا، لنحصل عليها.

$ mysql -u root
mysql> USE mybb;
mysql> SHOW TABLES;

سترى شيئًا مثل هذا:

+--------------------------+
| Tables_in_mybb           |
+--------------------------+
| mybb_adminlog            |
| mybb_adminoptions        |
| mybb_adminsessions       |
| mybb_adminviews          |
| mybb_announcements       |
| mybb_attachments         |
| mybb_attachtypes         |
| ...بقية الجداول....|
+--------------------------+

بادئة الجدول الخاصة بنا هي mybb_ كما يظهر في المخرجات.

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

  • دعنا نبدأ بتثبيت تبعيات السكريبت. من خادم Discourse:
$ cd ~/discourse
$ echo "gem 'mysql2', require: false" >> Gemfile
$ bundle install

بعد ذلك، يجب عليك تكوين السكريبت ليعمل بشكل صحيح. انسخ والصق ما يلي في سطر الأوامر (قم بتغيير القيم إذا لزم الأمر):

export DB_HOST="localhost"
export DB_NAME="mybb"
export DB_PW=""
export DB_USER="root"
export TABLE_PREFIX="mybb_"

لديك خيار آخر لتكوين السكريبت. افتح script/import_scripts/mybb.rb في أي محرر نصوص تفضله وقم بتغيير القيم داخل علامات التنصيص المزدوجة لتناسب احتياجاتك:

  DB_HOST ||= ENV['DB_HOST'] || "localhost"
  DB_NAME ||= ENV['DB_NAME'] || "mybb"
  DB_PW ||= ENV['DB_PW'] || ""
  DB_USER ||= ENV['DB_USER'] || "root"
  TABLE_PREFIX ||= ENV['TABLE_PREFIX'] || "mybb_"

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

$ bundle exec rails db:drop
$ bundle exec rails db:create
$ bundle exec rails db:migrate
$ bundle exec ruby script/import_scripts/mybb.rb

سيتصل السكريبت بخادم MySQL وينقل قاعدة بيانات MyBB إلى قاعدة بيانات Discourse.

بعد انتهاء السكريبت، قم بتشغيل مثيل Discourse بتنفيذ الأمر التالي:

$ bundle exec rails server

بعد ذلك، قم بتشغيل Sidekiq (معالج الوظائف الخلفية) لمعالجة البيانات المنقولة:

$ bundle exec sidekiq

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

قم بإعداد خادم Discourse الإنتاجي الخاص بك باتباع هذا الدليل.

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

:tada:

إذا كان لديك أي أسئلة حول العملية، فسأكون سعيدًا بالمساعدة.

نقل سعيد :grinning:

9 إعجابات

مرحبًا - يبدو هذا دليلًا رائعًا، إلا أنني كمستخدم لـ cPanel وليس Linux، وبانتقالي من استضافة مشتركة، لا أملك صلاحية الجذر (root) أو وصول SSH إلى المضيف الأصلي، لكنني أملك وصولًا إلى phpMyAdmin في cPanel، والذي يمكنني من خلاله تصدير قاعدة بيانات MyBB.
هل هذا كافٍ؟
ما هي إعدادات التصدير الخاصة المطلوبة إن وجدت؟ وإلى أي مجلد على قطرة Digital Ocean الخاصة بي يجب نسخ قاعدة البيانات هذه؟ (أستخدم FileZilla)

نعم.

لا يهم، فالمجلد الرئيسي يعمل بشكل جيد.

3 إعجابات

مرحبًا مجددًا - يمكنني الوصول إلى هذه النقطة في البرنامج التعليمي

bundle install

ولكن بالنسبة لي، يتوقف الأمر مع الخطأ التالي:

'لا تقم بتشغيل Bundler بصلاحيات الجذر (root). يمكن لـ Bundler طلب sudo إذا لزم الأمر، و
تثبيت حزمك (bundle) بصلاحيات الجذر سيؤدي إلى تعطيل هذا التطبيق لجميع المستخدمين
غير الجذريين على هذه الآلة.
ملف Gemfile الخاص بك لا يحتوي على مصادر خوادم للحزم (gem sources). إذا كنت بحاجة إلى حزم غير موجودة بالفعل على
آلتك، أضف سطرًا مثل هذا إلى ملف Gemfile الخاص بك:
source ‘https://rubygems.org
لم يتم العثور على الحزمة ‘mysql2’ في أي من مصادر الحزم المذكورة في ملف Gemfile الخاص بك.

هل لديك أي اقتراحات؟

للأسف، لا أعرف شيئًا عن Ruby أو Linux أو ملفات Gemfile، لذا أنا أتنقل حرفيًا عبر مهام إعداد Discourse CLI المختلفة كما هو موضح في البرامج التعليمية، عن طريق نسخ ولصق الأوامر عبر PuTTY، دون أي فهم حقيقي.

أعمل على نظام Ubuntu وDiscourse داخل Droplet من Digital Ocean، هل هذا يساعد؟

أيضًا، أرى إشارة لاحقة إلى لصق أوامر تصدير قاعدة البيانات في ‘shell’. عمليًا، هل اتصال PuTTY الحالي بالخادم هو نفسه ‘shell’، أم أن هناك واجهة أو وحدة تحكم أخرى متضمنة؟

حسناً، كإجابة جزئية لسؤالي، تشير المناقشات العشوائية في المنتديات إلى أن الأمر التالي:

$ sudo apt-get install libmysqlclient-dev

سيتيح بعد ذلك تثبيت gem الخاص بـ mysql2 (بغض النظر عن ماهيته) - متجاهلاً التحذير المتعلق بعدم القيام بذلك بصلاحيات root.

وبعد تجاوز هذه المشكلة والانتقال إلى الخطوة التالية - عند كتابة الأمر:

$ bundle exec rails db:drop

يظهر خطأ آخر:

bundler: failed to load command: rails (/usr/local/bin/rails)
Gem::Exception: can’t find executable rails for gem railties. railties is not currently included in the bundle, perhaps you meant to add it to your Gemfile?

عند التحقق في المجلد /usr/local/bin/، أرى بوضوح وجود ملف باسم ‘rails’.

جربت كتابة الأوامر sudo gem أو gem install rails أو $ sudo gem install rails، لكنها لم تُجدِ نفعاً (وفقاً لمقترحات مختلفة صادفتها بشأن هذا الخطأ).

لقد عدت إلى الوراء وقمت بتثبيت Ruby on Rails من الصفر للتأكد من وجود جميع التبعيات الأساسية، وفقاً للدليل التالي: https://www.digitalocean.com/community/tutorials/how-to-install-ruby-on-rails-with-rbenv-on-ubuntu-18-04، لكن دون أي تحسن - سواء استخدمت الإصدار 2.51 أو 2.61.

أنا الآن خارج نطاق خبرتي تماماً في هذا المجال…

يمكنني القول قاطعًا إن اتباع هذا الدليل كما هو مكتوب لا يعمل لأي شخص يتبع الخطوات الرسمية لإعداد بيئة التطوير المحلية على تثبيت Ubuntu-18.04 عبر WSL2 تحت نظام Windows 10 - ففي كل خطوة تقريبًا ستواجه اعتمادًا مفقودًا أو خطأ “تم رفض الاتصال” أو ما شابه.

وبفضل الكثير من الجهد والبحث عبر الإنترنت، تمكنت من الوصول إلى الأمر:

$ bundle exec ruby script/import_scripts/mybb.rb

لكن هذا الأمر يُنتج الاستجابة التالية:

mysql2/client.rb:90:in `connect’: Can’t connect to local MySQL server through socket ‘/tmp/mysql.sock’ (2) (Mysql2::Error::ConnectionError)

لقد واجهتُ حائطًا صلبًا هنا - فكل ما وجدته عبر البحث عبر الإنترنت لا يبدو أنه يقدم حلاً فعالًا لهذه المشكلة.

كيف يمكنني حل هذه المشكلة والمضي قدمًا إلى الخطوة التالية؟ أي مساعدة ستكون موضع تقدير كبير!

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

مرحبًا، كيف يمكنني رفع قاعدة البيانات على قطرة DigitalOcean الخاصة بي؟ لقد استخدمت التثبيت بنقرة واحدة من DigitalOcean لتثبيت Discourse (Ubuntu).
على جهاز الكمبيوتر الخاص بي، لدي Windows 10 Home الإصدار 18362.

ثم قمت بتثبيت MySQL، لكنني لا أعرف الآن كيفية رفع قاعدة بيانات Mybb “فيزيائيًا” على الخادم. أليس هناك phpMyAdmin حيث يمكنك استيراد قاعدة البيانات بسهولة؟ :frowning:

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

تحتاج إلى تحميل الملف باستخدام scp أو ما شابه. ثم شيء مثل

  mysql -u user -p password database < filename..sql
3 إعجابات

أنا عالق :frowning:

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

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

5 إعجابات

أتطلع حقًا إلى الدليل ليعمل في بيئة قائمة على Docker :slight_smile:

إعجابَين (2)

في النهاية استسلمت لفكرة ‘افعلها بنفسك’ واستأجرت مطورًا، وقمت بإحالته إلى جميع الاقتراحات الممتازة في هذا المنتدى (التي ساعدت حقًا!). وأعتقد أنه أنجز المهمة مباشرة على خوادم Digital Ocean الحية الخاصة بي، بدلًا من بيئة تطوير منفصلة (وهذا سمح لي بمراجعة الأمور بسهولة أثناء عمله - دون التأثير على المستخدمين، إذ لم يكن المنتدى رسميًا نشطًا بعد). وبعبارة أخرى، أظن أن هذا ممكن.

بعد عدة محاولات، أصبحت النتائج جيدة جدًا الآن: تم حل جميع مشاكل MyCode والرموز الغريبة، وتمت ترجمة بادئات منشورات MyBB الخاصة بي إلى وسوم Discourse، وتم استيراد حقول ملف المستخدم متعددة الاختيارات المخصصة بنجاح.

إذا كان مستعدًا، سأطلب منه مشاركة أي تعديلات على سكريبت الاستيراد القياسي، بالإضافة إلى التقنيات الأخرى المستخدمة هنا.

4 إعجابات

في حال كان هذا يساعد أحداً، فقد أكمل المطور @rahilqf الذي تعاقدت معه المشروع، بما في ذلك ترجمة حقول المستخدمين المخصصة في MyBB إلى حقول مستخدمين مخصصة في Discourse (وهو ما يعتمد على تثبيت إضافة حقل المستخدم متعدد الاختيارات)، وترجمة بادئات المنشورات في MyBB إلى وسوم في Discourse، وإزالة جميع وسوم MyCode الزائدة تقريبًا من نصوص المنشورات في MyBB.

تم مشاركة نسخة مخصصة من سكريبت الاستيراد الخاص به هنا - سكريبت استيراد مخصص من MyBB إلى Discourse.

كما نجح في دمج أرشيف Yahoo Groups بصيغة Mbox باستخدام سكريبت استيراد Yahoo القياسي، رغم أن المرفقات لم تُترجم في هذه الحالة. وفي حالتي، لم يكن ذلك مشكلة كبيرة.

3 إعجابات

أقوم بتحويل المستخدمين والمواضيع والمنشورات وما إلى ذلك من قاعدة بيانات MyBB!

لقد اتبعت هذا الدليل: Install Discourse on Ubuntu or Debian for Development

لكن http://localhost:3000/ أو http://forum.omaggieconcorsi.com:3000/ لا تعمل.

على أي حال، يقوم البرنامج بالتحويل، لكنني لا أعرف أين يمكنني تصدير البيانات بعد ذلك. لا أستطيع رؤية Discourse عبر http://forum.omaggieconcorsi.com:3000/ أو http://localhost:3000/، إذن كيف يمكنني على الأقل تصدير قاعدة البيانات التي تحتوي على المنشورات والمستخدمين وما إلى ذلك من منتدى MyBB القديم ثم استيرادها إلى مثيل Discourse الجديد؟

شكرًا!

هل اتبعت تلك التعليمات على نفس الجهاز الذي تشغل عليه متصفح الويب؟

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

نعم، نفس الحاسوب دائمًا

حسناً، لقد اتبعت هذا الدليل على نظام Ubuntu 18.04 “الحقيقي” المثبت على جهاز الكمبيوتر، ويعمل localhost:3000 بنجاح!

لكنني الآن أواجه مشكلة مع قاعدة بيانات MySQL :frowning: آسف…

أكتب الأمر:

debby@debby-MS-7721: mysql -u root
ERROR 1698 (28000): Access denied for user 'root'@'localhost'

:frowning:

تعديل: أضفت كلمة مرور للمستخدم root باستخدام الأمر ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass';

وفي DB_PW، كتبت كلمة مرور مستخدم root.

… والآن يقوم بإنشاء المستخدمين!!

ادعوا لي بالتوفيق، هل حان الوقت أخيراً بعد أسابيع من الاختبارات؟؟

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

أحاول استيراد قاعدة البيانات من MyBB إلى Discourse. مثل @Paul_King، لم أستطع جعل الأمر يعمل على خادم DigitalOcean الخاص بي. أستمر في الحصول على جميع أنواع الأخطاء أثناء اتباع هذا الدليل.

أعاني من تنفيذ الأمر التالي:

$ bundle exec rails db:drop
bundler: command not found: rails
Install missing gem executables with `bundle install`

أمر bundle install يقول إنه مكتمل:

$ bundle install
Your Gemfile lists the gem mysql2 (>= 0) more than once.
You should probably keep only one of them.
While it's not a problem now, it could cause errors if you change the version of one of them later.
Using bundler 1.16.1
Using mysql2 0.4.10
Bundle complete! 2 Gemfile dependencies, 2 gems now installed.
Use `bundle info [gemname]` to see where a bundled gem is installed.

محاولة تثبيت rails يدويًا تؤدي إلى هذا:

$ gem install rails
Building native extensions. This could take a while...
ERROR:  Error installing rails:
        ERROR: Failed to build gem native extension.

    current directory: /var/lib/gems/2.5.0/gems/racc-1.5.2/ext/racc/cparse
/usr/bin/ruby2.5 -r ./siteconf20210110-8155-1ms05r3.rb extconf.rb
mkmf.rb can't find header files for ruby at /usr/lib/ruby/include/ruby.h

extconf failed, exit code 1

Gem files will remain installed in /var/lib/gems/2.5.0/gems/racc-1.5.2 for inspection.
Results logged to /var/lib/gems/2.5.0/extensions/x86_64-linux/2.5.0/racc-1.5.2/gem_make.out

هذا محبط للغاية.


تركت هذا المنشور مفتوحًا وتمكنت من تثبيت rails. ثم واجهت مليون خطأ آخر وتمكنت من إصلاحها. أخطاء. في. كل. خطوة. واحدة.

لم أشعر من قبل بهذه الكراهية الصافية للبرمجيات. لماذا يكون Ruby هكذا؟ هذه كابوس. أعاني الآن من هذا الخطأ:

$ bundle exec rails db:drop
Traceback (most recent call last):
        1: from /usr/local/bin/bundle:23:in `<main>'
/usr/local/bin/bundle:23:in `load': cannot load such file -- /usr/share/rubygems-integration/all/gems/bundler-1.16.1/exe/bundle (LoadError)

هل يمكن لأحد المساعدة؟

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

غير مفيد، لكنني واجهت نفس الجدران الصلبة تقريبًا، سواء عند محاولة الإعداد في بيئة تطوير محلية (لتوليد ملف/نسخة احتياطية لقاعدة بيانات Discourse) أو مباشرة في Droplet الخاص بي على Digital Ocean. في النهاية، وبعد إضاعة عشرات الساعات، قررت أن الحياة قصيرة جدًا، واستأجرت مطورًا من Fiverr (استغرق منه الأمر أسابيع ليكتشف الحل، لكنه نجح في ذلك أخيرًا).
أظن أن الحوافز غير موجودة لأي شخص لتسهيل العملية.

حظًا موفقًا - وأتمنى أنه إذا تمكنت في النهاية من حل المشكلة، فإنك ستترك أثرًا من فتات الخبز هنا ليتبعه الآخرون!

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

كيف قمت بتثبيت رايلز؟ هل اتبعت أحد أدلة التطوير؟ (مثل دليل المبتدئين لتثبيت ديسكورش على أوبونتو للتطوير)

توجد بعض وثائق “كيف تُنفّذ” لتشغيل سكريبت التثبيت داخل حاوية الإنتاج (وهو ما أفعله عادةً)، لذا قد تستخدم أحد هذه الوثائق كدليل.