مرحبًا يا مجتمع Discourse،
أود مشاركة تجربتي في استيراد منتدى IPB 3.1 إلى Discourse 2.1، على أمل أن تكون هذه المعلومات مفيدة للآخرين.
ملخص موجز عن المجتمع:
- الموضوع: إطار عمل Yii لـ PHP (مناقشات ودعم متعلقة بالكود)
- الأعضاء: حوالي 26 ألف عضو
- المواضيع: حوالي 64 ألف موضوع
- المنشورات: حوالي 293 ألف منشور
استغرق الاستيراد 27 ساعة و46 دقيقة على جهاز يحتوي على 16 جيجابايت من ذاكرة الوصول العشوائي (RAM) و4 أنوية معالج.
متطلبات الاستيراد:
- الاحتفاظ بالأعضاء، مع تنظيف جميع حسابات البريد العشوائي (SPAM) (حوالي 250 ألف حساب، منها حوالي 26 ألف حساب تبقى بعد التنظيف)
- تنفيذ SSO من الموقع الإلكتروني (لا تتم إدارة حسابات المستخدمين بواسطة Discourse)
- الاحتفاظ بالمواضيع والمنشورات والفئات مع عناوين URL الأصلية الخاصة بها لضمان استمرار عمل نتائج محركات الويب، وكذلك الروابط الأخرى من منصات مثل Stackoverflow
هذا الاستناد إلى https://meta.discourse.org/t/migrating-from-invision-power-board-to-discourse/34639/23، لذا شكرًا لـ @pfaffman على العمل الرائع الذي قام به في أداة الاستيراد.
التحضير
تصدير البيانات من IPB
mysqldump <اسم_قاعدة_البيانات> > /tmp/ipb.sql
cd /var/www/yiiframework.com/forum/ && tar czvf uploads.tgz uploads/
انسخ ملف تصدير SQL وملف الرفع (uploads) إلى الخادم الجديد وضعها في /var/discourse/shared/standalone/.
أفترض هنا إعداد Docker بسيط لـ Discourse.
أي سكريبت يجب استخدامه؟
يوجد سكريبتان للاستيراد: ipboard.rb و ipboard3.rb. يبدو أن سكريبت ipboard3.rb غير مكتمل ولا يتطابق مع مخطط الجداول الذي لدينا، لذا اخترت استخدام ipboard.rb.
الإصدار الحالي من سكريبت استيراد ipboard.rb لا يتعامل بشكل جيد مع المرفقات ولا يحول وسوم الكود، وهو أمر بالغ الأهمية بالنسبة لنا لأننا نتحدث كثيرًا عن كود PHP. لذا قمت بإجراء التعديلات التالية على السكريبت:
جعل المرفقات المرفوعة متاحة
يستبدل سكريبت الاستيراد مرفقات المنشور بروابط إلى الملف المرفوع.
إذا كنت تنوي الإبقاء على مثيل IPB الخاص بك متصلاً على نفس العنوان الذي كان عليه سابقًا، فيمكنك ببساطة تحديد العنوان (UPLOADS هو إعداد في سكريبت الاستيراد، انظر أدناه) لمجلد الرفع، وستكون قد انتهيت:
UPLOADS="https://www.yiiframework.com/forum/uploads"
ولكننا نستورد إلى Discourse لإزالة المنتدى القديم تمامًا، لذا يجب علينا وضع الملفات المرفوعة في مكان آخر. إذا كنت تستخدم وكيل nginx أمام Discourse، فيمكنك تكوينه لتقديم الملفات المرفوعة من مجلد على الخادم. ضع التالي في جزء server من إعدادات nginx:
location /ipb_uploads/ {
alias /var/www/ipb_uploads/;
}
وقم بتكوين عنوان URL للمرفقات (انظر أدناه) على النحو التالي:
UPLOADS="https://forum.yiiframework.com/ipb_uploads"
إعداد MySQL في حاوية Discourse
ابدأ غلاف bash في حاوية تطبيق Discourse:
docker exec -it app bash
في الحاوية، قم بتثبيت MySQL واستيراد قاعدة البيانات:
apt-get install mysql-server mysql-client libmysqlclient-dev
service mysql start
echo "create database ipb" | mysql -uroot -p
mysql -uroot -p ipb < /shared/ipb.sql
عندما حاولت إجراء أول استيراد لاختبار السكريبت، استغرق الأمر عدة أيام لاستيراد 200 ألف مستخدم، وكنا نعلم أن عددًا كبيرًا منها كان حسابات بريد عشوائي (SPAM)، لذا قمنا بإنشاء بعض استعلامات SQL لحذف الحسابات التي لم تنشر أي شيء:
لاحظ أننا سنستخدم SSO، لذا سيتم إعادة إنشاء المستخدمين المحذوفين عند تسجيل دخولهم.
إذا لم تكن تنوي استخدام SSO، فقد تكون معاييرك لحذف المستخدمين مختلفة.
يمكنك استيراد بياناتك دون تنظيفها.
mysql -uroot -p
# ثم طبق استعلامات التنظيف
بعد ذلك نحتاج إلى تثبيت الاعتماديات اللازمة لسكريبت الاستيراد:
cd /var/www/discourse
echo "gem 'mysql2'" >>Gemfile
echo "gem 'reverse_markdown'" >>Gemfile
bundle install --no-deployment
للسماح بالوصول إلى قاعدة بيانات Discourse Postgres، استبدل peer بـ trust في /etc/postgresql/10/main/pg_hba.conf. لاحظ أن الرقم 10 يمثل إصدار postgres، وإذا لم يكن الملف موجودًا في إعدادك، فاستبدل 10 بالإصدار الذي تعمل به حاليًا.
أعد تشغيل Postgres لتحميل التغييرات: service postgresql restart
الاستيراد
جهز الرموز التعبيرية (Avatars) والملفات المرفوعة:
mkdir /shared/imports
mv /shared/uploads.tgz /shared/imports
cd /shared/imports && tar xzvf uploads.tgz
شغل سكريبت الاستيراد:
cd /var/www/discourse
DB_HOST="localhost" DB_NAME="yiisite" DB_USER="root" DB_PW="root" TABLE_PREFIX="ipb_" IMPORT_AFTER="1970-01-01" UPLOADS="https://www.forum.yiiframework.com/ipb_uploads" AVATARS_DIR="/shared/imports/uploads/" USERDIR="user" bundle exec ruby script/import_scripts/ipboard.rb | tee import.log
تأكد من تعديل عنوان URL الخاص بـ UPLOADS كما ناقشنا أعلاه، حيث سيتم تضمين الرفع في المنشورات كروابط إلى الملف الأصلي المرفوع.
التنظيف
إذا سار كل شيء على ما يرام، قم بالتنظيف باستخدام service mysql stop، apt-get purge mysql-server، rm -rf /var/lib/mysql.
إعداد إعادة توجيه عناوين URL
للحفاظ على عناوين URL الحالية للمنتدى سليمة، ينشئ سكريبت الاستيراد روابط دائمة (permalinks) لكل موضوع تعكس عنوان URL للمواضيع والفئات في IPB.
ومع ذلك، لا تغطي هذه الروابط الدائمة الروابط إلى منشورات محددة في موضوع أو صفحات مختلفة.
لكي تعمل هذه العناوين بشكل صحيح، يجب عليك تكوين بعض قواعد إعادة كتابة عناوين URL، وهناك 3 خيارات:
- استخدام إعداد
permalink normalizationsفي Discourse لإزالة الأجزاء غير الضرورية من عناوين URL - قواعد إعادة الكتابة في nginx، إذا كان لديك وكيل nginx أمام Discourse
- إذا كان المنتدى القديم على عنوان URL/مضيف مختلف عن Discourse، فيمكنك استخدام سكريبت مخصص لإعادة كتابة عناوين URL (وهو ما قمت به)
إليك كود PHP الذي نستخدمه لإعادة توجيه عناوين URL:
موارد ذات صلة
- Migrate a XenForo forum to Discourse
- Migrating from Invision Power Board to Discourse - #23 by pfaffman
- Feature: Invision Power Board Importer by pfaffman · Pull Request #5543 · discourse/discourse · GitHub
- نشر Discourse باستخدام SaltStack:
server-salt/states/discourse at master · yiisoft-contrib/server-salt · GitHub