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

إذا كان لديك منتدى Phorum قديم وتفكر في الترحيل إلى Discourse، فإن هذا الدليل مخصص لك. العملية مباشرة وسنستخدم سكربت استيراد Phorum الرسمي. لنبدأ.

على مستوى عالٍ، سنقوم بالخطوات التالية:

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

ما الذي يمكن ترحيله

  • التصنيفات
    • كل المنتديات والمجلدات =\u003e التصنيف الجذري
  • المواضيع والمشاركات
  • المستخدمين (مع السمات التالية)
    • حالة الحظر
    • اسم المستخدم
    • الاسم الحقيقي =\u003e الاسم
    • البريد الإلكتروني
    • حالة المسؤول
    • تاريخ الإضافة
    • آخر نشاط

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

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

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

أوبونتو 18.04:

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

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

$ systemctl status mysql.service

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

$ sudo systemctl start mysql

ماك أو إس:

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

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

$ brew services list

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

...
mysql@5.7         started
...

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

$ brew services start mysql@5.7

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

ستكون هذه البيئة هي خادم Discourse الخاص بنا.

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

قم بتصدير قاعدة بيانات الإنتاج (من خادم Phorum الإنتاجي):

$ mysqldump -u USER_NAME -p DATABASE_NAME \u003e phorum_dump.sql

انسخ ملف تصدير قاعدة البيانات إلى خادم Discourse.

:bulb: استخدم scp أو rsync لنسخ قاعدة البيانات. وبالطبع، يمكنك ضغطها باستخدام gzip أولاً.

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

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

$ mysql -u root

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

mysql\u003e CREATE DATABASE phorum;

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

mysql\u003e SHOW DATABASES;

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

+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| phorum             |
| sys                |
+--------------------+
5 rows in set (0.04 sec)

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

$ mysql -u root phorum \u003c phorum_dump.sql

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

$ mysql -u root
mysql\u003e USE phorum;
mysql\u003e SHOW TABLES;

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

+---------------------------+
| Tables_in_phorum          |
+---------------------------+
| pw_banlists           |
| pw_files              |
| pw_forum_group_xref   |
| pw_forums             |
| pw_groups             |
| pw_messages           |
| pw_messages_edittrack |
| pw_pm_buddies         |
| pw_pm_folders         |
| pw_pm_messages        |
| pw_pm_xref            |
| pw_search             |
| pw_settings           |
| pw_subscribers        |
| pw_user_custom_fields |
| pw_user_group_xref    |
| pw_user_newflags      |
| pw_user_permissions   |
| pw_users              |
+---------------------------+
19 rows in set (0.00 sec)

من المخرجات أعلاه، يمكنك رؤية أن البادئة هي pw_.

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

أولاً، قم بتثبيت تبعيات المستورد:

$ cd ~/discourse
$ echo "gem 'mysql2', require: false" \u003e\u003e Gemfile
$ bundle install

الآن دعنا نهيئ السكربت ليتوافق مع متطلباتنا. في مثالنا، سيكون ذلك كالتالي:

PHORUM_DB = "phorum"
TABLE_PREFIX = "pw_"
BATCH_SIZE = 1000

# ...

host: "localhost",
username: "root",
password: "", # قم بتغيير هذا إذا كان لديك كلمة مرور لقاعدة بيانات MySQL
database: PHORUM_DB

إذا كنت تريد إنشاء إعادة توجيه URL، فيجب عليك إلغاء تعليق ما يلي:

# categories.each do |category|
#   Permalink.create(url: "list.php?#{category['id']}", category_id: category_id_from_imported_category_id(category['id'].to_i))
# end

#...

# results.each do |post|
#   if post['parent_id'] == 0
#     topic = topic_lookup_from_imported_post_id(post['id'].to_i)
#     Permalink.create(url: "read.php?#{post['category_id']},#{post['id']}", topic_id: topic[:topic_id].to_i)
#   end
# end

سيكون الأمر على النحو التالي:

categories.each do |category|
  Permalink.create(url: "list.php?#{category['id']}", category_id: category_id_from_imported_category_id(category['id'].to_i))
end

#...

results.each do |post|
  if post['parent_id'] == 0
    topic = topic_lookup_from_imported_post_id(post['id'].to_i)
    Permalink.create(url: "read.php?#{post['category_id']},#{post['id']}", topic_id: topic[:topic_id].to_i)
  end
end

قم بتشغيل المستورد مع نسخة نظيفة من Discourse:

bundle exec rake db:drop db:create db:migrate
bundle exec ruby script/import_scripts/phorum.rb

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

ابدأ خادم Discourse بعد انتهاء المستورد من الاستيراد:

$ bundle exec rails server

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

$ bundle exec sidekiq

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

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

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

تم :tada

7 إعجابات

I’m about to start work on migrating a Phorum forum to Discourse. I would like to preserve files attached to posts (mostly pictures). Looks like this is not supported in the current migration script. Has anyone noodled on that already?

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

I’ve made a couple tweaks to the migration script for “phorum” including migrating attachments/files/uploads. The pull request is here:

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

شكراً على البرامج النصية!

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

  • تشغيل Discourse
  • إنشاء mysqldump من Phorum الأصلي - كل شيء واضح، كل شيء جيد.
  • نسخ تفريغ قاعدة البيانات إلى مجلد Discourse docker cp/path/to/backup/phorum_db.sql.gz app:/shared/phorum_db.sql.gz (بافتراض app كاسم حاوية قياسي)
    وهنا الأجزاء المفقودة:
  • الدخول فعليًا إلى حاوية Docker الخاصة بـ Discourse وتثبيت MySQL هناك:
docker exec -it app bash
apt-get update && apt-get upgrade
# pv للراحة فقط لعرض التقدم، lsb-release مطلوب لشيء ما
apt-get install -y lsb-release pv mariadb-server mariadb-client libmariadb-dev
service mariadb start

لاحظ أن تثبيت MySQL أكثر تعقيدًا بعض الشيء، ولكن Mariadb يجب أن يعمل بشكل جيد.

ثم قم بإنشاء قاعدة بيانات: mysqlCREATE database phorum.

ثم املأها من النسخ الاحتياطي: pv phorum_db.sql.gz | gunzip | mysql phorum (لا حاجة لـ gunzip إذا كان التفريغ الخاص بك هو sql عادي)

أضف دعم MySql إلى Ruby:

cd /var/www/discourse/
echo "gem 'mysql2'" >>Gemfile
bundle config unset deployment
bundle install --no-deployment

تعديل البيانات في البرنامج النصي للترحيل (بيانات اعتماد قاعدة البيانات، البادئة، الروابط الدائمة):

nano /var/www/discourse/script/import_scripts/phorum.rb

ثم العودة إلى دليل المنشور الأصلي، كل شيء جيد هناك:

تشغيل المستورد باستخدام نسخة Discourse نظيفة:

git config --global --add safe.directory /var/www/discourse
bundle exec ruby script/import_scripts/phorum.rb

إذا لم تكن قاعدة بيانات Discourse نظيفة حقًا، فمن الأفضل تنظيفها باستخدام bundle exec rake db:drop db:create db:migrate مسبقًا.

إذا فشل مع “PG::ConnectionBad: connection to server on socket "/var/run/postgresql/.s.PGSQL.5432" failed: FATAL: Peer authentication failed for user "discourse" (PG::ConnectionBad)”:

  1. إذا حصلت على الخطأ 'Peer authentication failed for user "discourse"':
  2. قم بتحرير الملف /etc/postgresql/13/main/pg_hba.conf
  3. قم بتغيير كل ‘peer’ إلى ‘trust’ واحفظ الملف
  4. أعد تحميل خادم postgres: /etc/init.d/postgresql reload (أو ربما psql -U postgres -c "SELECT pg_reload_conf();", ولكن هذا كان يفشل معي أحيانًا)

أولاً، يقوم بتشغيل ترحيلات المستخدمين التي قد تكون بطيئة نسبيًا (~ 1.2 ألف مستخدم/دقيقة وفقًا لمخرجات البرنامج النصي. كان لدي 100 ألف مستخدم، لذا…). ثم يقوم بإنشاء فئات ويبدأ في ترحيل الرسائل والمواضيع (نفس السرعة، ~ 1.2 ألف/دقيقة)، ولكن في هذه المرحلة يمكنك بالفعل الوصول إلى موقع الويب ورؤية كيف يبدو.

يبدو أسهل بكثير مما كنت أتوقعه لمحرك قديم مثل Phorum. يبدو أنه لا يوجد ترحيل للرسائل الخاصة (PM)، ولكن لا ينبغي أن يكون ذلك عائقًا بالنسبة لي على الأقل.

شكراً مرة أخرى على البرنامج النصي والجهود!

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

ربما كان بإمكانك تضمين قالب mysql لتثبيت mysql، أو ربما كنت ستصل إلى خادم mysql مثبت بالفعل بطريقة ما (وهو ما أفعله عادةً).

إذا أردت، يمكنك إلقاء نظرة على بعض البرامج النصية الأخرى التي تستورد الرسائل الخاصة (PM) لاستخدامها كمثال.