كيفية التهجير / الاستيراد من SMF2 إلى Discourse

:mega: تم استبدال هذه الوثيقة الآن بهذا الدليل الآخر الخاص بـ SMF2: Migrate an SMF2 forum to Discourse

كنت أرغب حقًا في نقل منتدى SMF2 القديم الجيد لدينا إلى Discourse. لدينا أكثر من 1000 عضو وحوالي 20 ألف منشور في حوالي 2000 موضوع.
على منصة SMF2، لم نستخدم الاستطلاعات ولا المرفقات — في الواقع، لم يكن لدى الجميع حتى صورة شخصية (أفاتار). ومع ذلك، اعتمدت بعض المنشورات بشكل كبير على كود BBCode “المُتقدم”.

إليك كيف قمنا بذلك.

المتطلبات الأساسية

فقط قم بتثبيت Discourse بالطريقة المعتادة.
لقد أضفت إضافة Discourse BBCode للتعامل مع القوائم والأحجام والألوان وما إلى ذلك بشكل افتراضي.

إذا لم تتمكن من فتح اتصال بعيد بقاعدة بيانات MySQL الخاصة بـ SMF2، فستحتاج إلى استيراد بياناتك من نسخة احتياطية (dump) إلى حاوية Docker مؤقتة.

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

حاوية MySQL مؤقتة عبر Docker

قم بإنشاء نسخة احتياطية لقاعدة البيانات:

cd /tmp/
mysqldump –u[اسم المستخدم] –p[كلمة المرور] [اسم قاعدة البيانات] > sqldump.sql

قم بإنشاء حاوية MySQL مؤقتة عبر Docker:

cd /tmp/
docker run -d -e MYSQL_ROOT_PASSWORD=pass -e MYSQL_USER=user -e MYSQL_PASSWORD=pass -e MYSQL_DATABASE=db -v "$PWD":/backup --name=mysql mysql

ثم ادخل إليها:

docker exec -it mysql bash

قم باستيراد نسخة قاعدة البيانات الاحتياطية:

mysql -uuser -ppass db < /backup/sqldump.sql

إذا حصلت على الخطأ التالي:

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

فقط انتظر دقيقة حتى يتم تشغيل الحاوية بالكامل.

لتوافق قاعدة البيانات، اضطررت لتغيير مكون المصادقة الخاص بقاعدة البيانات المؤقتة، لكنني أعتقد أن تجربتك قد تختلف:

mysql -uuser -ppass db

استخدم هذا الاستعلام:

ALTER USER user
IDENTIFIED WITH mysql_native_password
BY 'pass';

ثم سجل الخروج وتحقق من عنوان IP لحالة MySQL الخاصة بك:

exit
docker inspect mysql | grep IPAddress

الآن لديك نسخة عاملة من قاعدة بيانات SMF2 الخاصة بك.

حاوية استيراد Discourse مؤقتة

دعنا ننشئ حاوية جديدة تسمى “import”، بناءً على حاوية app.yml الافتراضية:

cd /var/discourse
cp containers/app.yml containers/import.yml

nano containers/import.yml

أضف قالب mysql-dep إلى حاوية الاستيراد الجديدة:

templates:
  - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/web.template.yml"
  - "templates/web.ratelimited.template.yml"
## قم بإلغاء التعليق عن هذين السطرين إذا كنت ترغب في إضافة Lets Encrypt (https)
  #- "templates/web.ssl.template.yml"
  #- "templates/web.letsencrypt.ssl.template.yml"
  - "templates/import/mysql-dep.template.yml"

ثم فقط:

/var/discourse/launcher stop app
/var/discourse/launcher rebuild import

الاستيراد إلى Discourse

بمجرد إعادة بناء حاوية الاستيراد، يجب أن ندخلها لـ آخر تعديل:

/var/discourse/launcher enter import
cd /var/www/discourse/ # يجب تشغيل السكربت من هذا الدليل بالضبط، لكنك يجب أن تكون قد وصلت إليه على أي حال
su discourse -c "bundle exec ruby script/import_scripts/smf2.rb -h 172.17.0.3 -u user -p pass -d db -f smf_ -t Europe/Paris"
  • -h: اسم المضيف لقاعدة بيانات MySQL الخاصة بـ SMF2 (هنا، عنوان IP لحاوية Docker)؛
  • -u: مستخدم MySQL الخاص بـ SMF2؛
  • -p: كلمة مرور MySQL الخاصة بـ SMF2؛
  • -d: قاعدة بيانات MySQL الخاصة بـ SMF2؛
  • -f: بادئة جداول SMF2؛
  • -t: المنطقة الزمنية لـ SMF2.

التنظيف

إذا قمت بإنشائها، قم بإيقاف وإزالة حاوية MySQL المؤقتة عبر Docker:

docker stop mysql
docker rmi mysql

قم بإيقاف حاوية Discourse “import” واستخدم launcher للتنظيف:

/var/discourse/launcher destroy import
/var/discourse/launcher cleanup

في الواقع، تمكنت من تدمير الحاوية الرئيسية الخاصة بي :slight_smile: لا مشكلة كبيرة:

/var/discourse/launcher rebuild app

إعدادات Discourse بعد الاستيراد

قد تسبب بعض الإعدادات الافتراضية مشاكل مع المنشورات المستوردة والأذونات. قم بتغيير هذه الإعدادات وفقًا لاحتياجاتك من لوحة إعدادات Discourse:

  • الحد الأدنى لطول عنوان الموضوع: قمت بتغييره إلى 3 — فقد ثبت أن الموضوعات التي عناوينها قصيرة جدًا يصعب التعامل معها (لا يمكن نقلها، إلخ)؛
  • تنسيق العنوان (title prettify): اضطررت لإيقافه — فقد ثبت أن الموضوعات التي عناوينها لا تبدأ بحرف كبير يصعب التعامل معها (لا يمكن نقلها، إلخ).

المراجع

10 إعجابات

Thanks for providing this. Maybe @marcozambi can use this for the guide he was planning to write after his successful import (including attachments)?

See here:

Also can anybody from the Discourse team let us know what happened to the old topic that was a guide for SMF2 imports? I can no longer find it via search.

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

Still determined to contribute, as soon as all the details will be in place. I’m taking notes of everything and I’ll write someting asap

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

poke @codinghorror @sam @HAWK

I think we can combine what @_vincent has compiled here, what was in the “missing” topic, and a few notes from @marcozambi’s migration to make a pretty comprehensive guide for migrating SMF2 to Discourse.

I have undeleted it here: https://meta.discourse.org/t/importer-for-simple-machines-2-forums/17656

I am assuming it was deleted because it contained info that is no longer up to date so grab what you need from it and we’ll remove it again to avoid future confusion.

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

Thanks! For the most part it was up-to-date. I did a migration with it a couple months ago and I would have been lost as f*$# without it.

I think the guide isn’t the problem, so much as the importer itself could use a little attention in a few areas. Also, if possible, we should change some of the MySQL settings in the Discourse docker container when it gets created to prevent connection timeouts. That would probably take care of everything IMO.

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

Ok, it’s out. SMF2 to Discourse - The Ultimate Guide
I hope the Guide is readable enough, as I am not a native english speaker. It goes without saying that any constructive feedback is more than welcome.

3 إعجابات

Hello guys,

Let me start that you did a wonderful job with [SMF2 to Discourse - The Ultimate Guide] and this migration tool.

I could migrate a huge SMF instante (61k members, 400k posts, 350k, topics).
I did a dry run and everything worked as it should.

My question is: will this script override Discourse specific settings like the ones in /admin/site_settings/ ? - I’m asking this as I want to make a final migration of the content that came up in the meantime on the SMF site, but I would not want to overwrite the settings already configured in /admin/site_settings/.

Thank you

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

No it should not override any of the site settings.

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

Thank you so much.

I don’t have the expertise to “read” the script and what exactly it is copying over. I was hoping the same

شكرًا لك على الدليل.

أنا عالق مباشرة بعد أن تقول:

لأغراض توافق قاعدة البيانات، كان عليّ تغيير برنامج مصادقة قاعدة البيانات المؤقت الخاص بنا، لكنني أفترض أن تجربتك قد تختلف:

أحصل على الخطأ:

Plugin caching_sha2_password could not be loaded: /usr/lib/x86_64-linux-gnu/mariadb19/plugin/caching_sha2_password.so: cannot open shared object file: No such file or directory (Mysql2::Error::ConnectionError)

أتساءل عما إذا كان بإمكانك إعطائي تلميحًا حول كيفية إصلاح ذلك من فضلك؟ من المفترض أن يكون الأمر مرتبطًا بتغيير “برنامج مصادقة قاعدة البيانات”؟ إذا كان الأمر كذلك، فكيف أفعل ذلك من فضلك؟

شكرًا لك!

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

الآن، عند تشغيل السكربت، أواجه هذه الرسالة الخطأ في نفس النقطة كما من قبل:

from /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/mysql2-0.5.3/lib/mysql2/client.rb:90:in initialize' /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/mysql2-0.5.3/lib/mysql2/client.rb:90:in connect’: Can’t connect to local MySQL server through socket ‘/var/run/mysqld/mysqld.sock’ (2) (Mysql2::Error::ConnectionError)

لقد حاولت الانتظار لفترة ثم إعادة التشغيل وفقًا للإرشادات الواردة في الدليل، لكن النتيجة نفسها تظهر للأسف. هل يمكن لأي شخص مساعدتي من فضلك؟

شكرًا لك

إليك لقطة شاشة https://drive.google.com/file/d/1z8TLY4zBr0KzrL9aJDQTG4NKG5Dhbg11/view?usp=drivesdk