تم استبدال هذه الوثيقة الآن بهذا الدليل الآخر الخاص بـ 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
في الواقع، تمكنت من تدمير الحاوية الرئيسية الخاصة بي
لا مشكلة كبيرة:
/var/discourse/launcher rebuild app
إعدادات Discourse بعد الاستيراد
قد تسبب بعض الإعدادات الافتراضية مشاكل مع المنشورات المستوردة والأذونات. قم بتغيير هذه الإعدادات وفقًا لاحتياجاتك من لوحة إعدادات Discourse:
- الحد الأدنى لطول عنوان الموضوع: قمت بتغييره إلى 3 — فقد ثبت أن الموضوعات التي عناوينها قصيرة جدًا يصعب التعامل معها (لا يمكن نقلها، إلخ)؛
- تنسيق العنوان (title prettify): اضطررت لإيقافه — فقد ثبت أن الموضوعات التي عناوينها لا تبدأ بحرف كبير يصعب التعامل معها (لا يمكن نقلها، إلخ).
المراجع
- كيفية استخدام سكربت استيراد bbpress - أو أي سكربت استيراد آخر يعتمد على MySQL (lead4good، مايو 2017)؛
- “لا يمكن تحميل مكون المصادقة ‘caching_sha2_password’” (meow، أبريل 2018).