رحلتي في ترحيل phpBB (postgresql)

أشارك النتائج التي توصلت إليها أثناء عملية الترحيل من phpBB3 إلى discourse.

تشمل الحلول:

  • قاعدة بيانات المصدر postgres
  • الرموز التعبيرية
  • تعديلات على المستورد (إصلاح خطأ الاقتباس، دعم محسّن لـ bbcode (بما في ذلك youtube)، تعليقات المرفقات)
  • استيراد المشاركات المحذوفة برفق كمشاركات عادية

أنا شديد التدقيق، لذلك إذا تابعت، يجب أن تحصل على نتيجة جيدة جدًا.


أفكر في الانتقال إلى discourse من phpbb (سجل إصدارات التثبيت: 3.2.1 - 3.2.8).
المشكلة هي أنني أستخدم postgresql لقاعدة البيانات. اقتراحات؟ لم أجربها ولكني أفترض أنها غير مدعومة بعد بناءً على المنشور الأصلي.

هل صدر نص الاستيراد الجديد على الإطلاق؟ أرى أن ذلك كان منذ أكثر من عام بقليل.

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

يجب أن يعمل معك البرنامج النصي للاستيراد المجمع… discourse/script/bulk_import/phpbb_postgresql.rb at 52d4de7b45eb1b7c7997da2ba8bff83a3c22a3a5 · discourse/discourse · GitHub

4 إعجابات

شكراً، @gerhard
هل فهمي صحيح؟

  • script/import_scripts/phpbb3 و script/bulk_import هما مستوردان منفصلان تمامًا
  • المستورد المجمع أقل تطوراً (على الرغم من أنه أسرع)، وعلى سبيل المثال، لن يقوم باستيراد المرفقات؟

إذا كان الأمر كذلك، فيبدو أن هناك عيوبًا لاستخدام المستورد المجمع…

هل لا يوجد حل آخر إذن؟ هل يُنصح باستكشاف إجراء ترحيل قاعدة بيانات من postgresql إلى mysql أو شيء من هذا القبيل؟

إعجابَين (2)

نعم، هناك عيوب. إذا كنت مرتاحًا للعمل مع Ruby، أقترح تعديل الملفات في discourse/script/import_scripts/phpbb3/database at main · discourse/discourse · GitHub بحيث تعمل مع gem pg بدلاً من mysql2.

ربما؟ ليس لدي فكرة عن مدى سهولة ذلك وما إذا كان سيعمل بالفعل. يمكنك المحاولة…

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

يا للأسف. حسناً، سأحاول. سأتابع إذا توصلت إلى شيء.

إعجابَين (2)

هل هذا المستورد هو الذي سيتم إيقافه؟ ما هو وضع المستورد “الجديد”؟ أحاول تحديد مقدار الجهد الذي أبذله في هذا - هل سيكون هناك قيمة عليا؟

إعجابَين (2)

لم أتعامل مع مشكلة postgresql إلى mysql بنفسي، ولكن من منظور ترحيل phpBB إلى Discourse، رأيي هو: افعل كل ما يلزم لإنجاز الترحيل.

لقد قمت بترحيل منتدين من phpBB إلى Discourse، وعلى الرغم من وجود تذمر معتاد من عدد قليل من المستخدمين يحصل مع أي تغيير، فإن فوائد Discourse تستحق العناء! لا يعتبر Discourse أسهل في الصيانة والإدارة فحسب، بل إن تفاعل المستخدمين المدمج، والتعامل مع الصور، وتخصيص المستخدم، وقابلية القراءة في Discourse هي مجرد عدد قليل من الميزات التي تتقدم بكثير على phpBB لدرجة عدم وجود مقارنة. تحصل أيضًا على دعم أفضل بكثير مع Discourse.

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

بمجرد حصولك على قاعدة بيانات mysql، يمكنك استخدام برنامج الترحيل phpBB العادي والحصول على جميع مرفقاتك.

سيكون الأمر يستحق الجهد!

3 إعجابات

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

قبل بضع سنوات بدأت العمل عليه، لكنه غير مكتمل وقديم. على أي حال، ربما يكون مفيدًا.

3 إعجابات

لم أقصد أن أشير إلى أن الأمر سيكون سهلاً، بل فقط أنه يستحق الجهد، ومن الممكن حتى القيام به يدويًا، ويبدو أن هناك الكثير من الموارد المتاحة لإنجازه، سواء بالأدوات الآلية أو يدويًا. :grinning:

3 إعجابات

نظرًا لأنني أكره Ruby، وسيتم إيقاف المستورد الحالي لصالح المستورد المجمع (وهو ليس جيدًا بما يكفي لأغراضي حتى الآن)، فسأستمر في استراتيجية الترحيل من PostgreSQL إلى MySQL.

أنا أحقق تقدمًا مع معالج الترحيل في MySQL Workbench. سأكتب دليلًا صغيرًا إذا نجح الأمر، ولكنه يبدو واعدًا حتى الآن.

إعجابَين (2)

حتى الآن، أنا عالق في هذه المشكلة:
https://bugs.mysql.com/bug.php?id=89048

بشكل أساسي، يفشل MySQL Workbench في استيراد يونيكود. سأجرب مع MariaDB غدًا وأرى ما إذا كان بإمكاني تعيين ترميز قاعدة البيانات الافتراضي أو شيء من هذا القبيل قبل الاستيراد.

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

كان سيكون رائعًا لو أن MySQL Workbench قد عمل. رأيت الكثير من تقارير الأخطاء معه عندما نظرت إلى الخيارات، ولذلك لم أوصِ به.

لقد ذكرت طريقة تفريغ المخطط وتصدير/استيراد CSV مرة من قبل، وسأذكرها مرة أخرى فقط مع تعديل طفيف لجعلها أسهل بكثير ثم سأتوقف.

إذا كنت تريد اتباع طريقة واجهة المستخدم الرسومية:

  1. احصل على تصدير هيكلي فقط لجميع الجداول من نسخة عاملة من نفس إصدار phpBB3 الذي تستخدمه والذي يعمل بنظام MySQL/MariaDB. سيستغرق الأمر دقيقتين تقريبًا لشخص لإنشاء واحد من phpMyAdmin، وهو متاح على معظم مضيفي الويب الذين يشغلون MySQL/MariaDB. (بدلاً من ذلك، قد تتمكن من الحصول على عبارات CREATE TABLE التي تحتاجها من نصوص تثبيت phpBB3 إذا لم تتمكن من جعل شخص ما يقوم بالتصدير الهيكلي فقط لك، أو حتى استخدام حساب استضافة ويب غير مكلف لإجراء تثبيت نظيف لإصدارك من phpBB3 في بيئة MySQL/MariaDB ثم حذف البيانات في الجداول التي ينشئها لإنشاء قاعدة بيانات MySQL/MariaDB فارغة.)
  2. ابحث عن وصول إلى مضيف ويب مع MySQL/MariaDB و phpMyAdmin، وأنشئ قاعدة البيانات، وقم باستيراد الهيكل من التصدير الهيكلي فقط الذي أنشأته في الخطوة 1 باستخدام phpMyAdmin.
  3. قم بإنشاء تصدير CSV لكل جدول من قاعدة بيانات postgresql الخاصة بك وقم باستيراد CSV إلى الجدول المقابل باستخدام phpMyAdmin في قاعدة بيانات MySQL/MariaDB الجديدة الخاصة بك.

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

يمكنني أن أقدم لك عبارة SQL هيكلية فقط، ولكن قاعدة البيانات الوحيدة التي ما زلت أمتلكها هي من phpBB3 3.3.8، لذلك قد يضيف ذلك المزيد من المشاكل إذا كنت تستخدم الإصدار 3.2.x.

3 إعجابات

هاها. نعم، لقد تطلب الأمر بعض الحيل غير الواضحة حتى لجعله يعمل بالقدر الذي وصلت إليه. أعتقد أنه لا يزال بإمكانه العمل، ولكن شكرًا لك على إعطائي طريقًا آخر لاستكشافه.

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

حسنًا ، يا للهول. إليك حلي لاستيراد PostgreSQL.

سيأخذك هذا من تفريغ PostgreSQL إلى خادم MariaDB عامل يمكنك توصيل المستورد به. يتطلب Docker Compose.

إنه يعمل مع phpBB 3.2. لا توجد معلومات حول 3.3. إذا كنت بحاجة ماسة إلى دعم 3.3 ، يمكنني محاولة إصلاحه إذا أعطيتني تفريغ pg_dumpall لـ phpBB 3.3.

3 إعجابات

phpbb_smilies.zip (87.2 KB)

(مقارنة بالرموز التعبيرية الافتراضية)

على أي حال، هذا هو حلي للرموز التعبيرية
أقدم لك خيارين:

  1. أصلي
    • إذا كنت لا ترغب في الاحتفاظ برموز phpBB التعبيرية الأصلية، يمكنك ربطها بالرموز التعبيرية الأصلية الموجودة بالفعل في discourse

:grin: :smile: :wink: :slightly_frowning_face: :astonished: :exploding_head: :confounded: :sunglasses: :joy: :rage:
:stuck_out_tongue: :person_facepalming: :sob: :imp: :smiling_imp: :roll_eyes: :exclamation: :question: :bulb: :arrow_forward:
:neutral_face: :smiley_cat: :nerd_face: :nerd_face:

  1. مستورد
    • إذا كنت ترغب في الاحتفاظ برموز phpBB التعبيرية الأصلية وجعلها متاحة كاختصارات للاستمرار في استخدامها:
      • قبل تشغيل المستورد، انتقل إلى قسم الرموز التعبيرية في لوحة تحكم discourse (admin/customize/emojis)
      • إذا أردت، قم أولاً بإنشاء مجموعة رموز تعبيرية تسمى phpbb أو شيء من هذا القبيل
      • اسحب ملفات الرموز التعبيرية (5 في كل مرة) في new_files إلى المتصفح لاستيرادها كرموز تعبيرية مخصصة

لدي ملف مضغوط مع الإعداد لكلا الخيارين مضمن كـ import.yml في الملف المضغوط.

أيضًا في الملف المضغوط توجد ورقة بيانات لمساعدتك في اتخاذ القرار أو إنشاء الخريطة الخاصة بك:

phpbb_smilies
├── phpbb_smilies.xlsx # مرجع رئيسي لمساعدتك في اتخاذ القرار
├── import.yml # ملف إعداد يتضمن كلا الخيارين
├── orig_phpbb_smilies.csv # بيانات phpBB الأصلية
├── orig_files # ملفات الرموز التعبيرية الأصلية لـ phpBB
│   ├── icon_arrow.gif
│   └── ...
└── new_files # ملفات الرموز التعبيرية المعاد تسميتها لتتوافق مع عمود `new_shortcode` في جدول البيانات
    ├── phpbb_arrow.gif
    └── ...
إعجاب واحد (1)

هل نجح أي شخص في جعل الإسناد للاقتباس يعمل بشكل صحيح؟

إليك مثال لمنشور أصلي من phpbb يحتوي على اقتباس (تم تغيير اسم المستخدم والمحتوى، وتم الاحتفاظ بمعرفات المستخدم وما إلى ذلك)

[quote=someuser post_id=46649 time=1677556325 user_id=48]
foo
[/quote]

bar

إليك كيف يبدو في discourse:

إليك المنشور المُرحّل إلى discourse:

[quote=", post:37, topic:1893"]
foo
[/quote]

bar

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

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

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

أنا متأكد تمامًا من أن هذه الأمور عملت بشكل صحيح في استيراد phpbb3 الذي قمت به في الشهر الماضي.

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

لم أكتشف المشكلة الأخيرة بعد، ولكن إليك سؤال آخر.

لاحظت أنه بعد انتهاء الاستيراد وبدء تشغيل حاوية التطبيق، يتعرض خادم phpbb الموجود لدي بشدة. أعتقد أن هذا يحدث أثناء مرحلة المعالجة اللاحقة لـ sidekiq.

لا يزال phpbb موجودًا على www.example.com، و Discourse على dc.example.com.

أحاول فهم ما يحدث بالفعل، وما هي الإعدادات المنطقية أثناء هجرة الاختبار هذه، وما هي الإعدادات المنطقية للهجرة النهائية. وهل أحتاج إلى تشغيل phpbb للمعالجة اللاحقة لـ sidekiq. أسأل لأنني لا أعرف ما يحدث في المعالجة اللاحقة.

بعض الإعدادات ذات الصلة المحتملة في settings.yml الحالي الخاص بي:

import:
  # قم بتعيين هذا إذا كنت تستورد منتديات phpBB متعددة إلى منتدى Discourse واحد.
  site_name:
  site_prefix:
    # هذا مطلوب لإعادة كتابة الروابط الداخلية في المشاركات
    original: example.com    # بدون http(s)://
    new: https://dc.example.com       # مع http:// أو https://

إذا كان هناك أي شيء آخر تحتاج إلى النظر فيه، فيرجى إخباري.

شيء آخر لست واضحًا بشأنه هو النطاق الفرعي www. أقوم حاليًا بإعادة توجيه إلى www باستخدام nginx لـ phpbb. لذا في المثال أعلاه، هل يهم إذا وضعت original: example.com مقابل original: www.example.com؟ سؤال مماثل لـ new عندما أقوم بالهجرة النهائية. سيصل المستخدمون لدي فعليًا إلى Discourse من www.example.com، لكنني لا أعرف ما هي أفضل الممارسات.

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

يبدو أن هناك خطأ ما في تحليل الاقتباس.
لقد حاولت للتو استيراد نسخة phpBB 3.2.8 تم تثبيتها حديثًا (تم تثبيتها على mariadb)
إسناد الاقتباس معطل - حقل اسم المستخدم فارغ في الاقتباسات المستوردة، ولكن كل شيء آخر شرعي.
لقطة شاشة لـ Discourse لمنشور مستورد:

منشور مستورد في Discourse:

[quote=", post:4, topic:12"]
[quote=", post:3, topic:12"]
[quote=", post:2, topic:12"]
msg 1
[/quote]

second
[/quote]

third
[/quote]

fourth

منشور phpBB الأصلي:

MariaDB [phpbb]> select post_text from phpbb_posts where post_id=5;
...
| <r><QUOTE author="admin" post_id="4" time="1678400691" user_id="2"><s/>[quote=admin post_id=4 time=1678400691 user_id=2]</s/>
<QUOTE author="admin" post_id="3" time="1678400685" user_id="2"><s/>[quote=admin post_id=3 time=1678400685 user_id=2]</s/>
<QUOTE author="admin" post_id="2" time="1678400675" user_id="2"><s/>[quote=admin post_id=2 time=1678400675 user_id=2]</s/>msg 1</e>[/quote]</e>
second

</e>[/quote]</e></QUOTE>
third

</e>[/quote]</e></QUOTE>
fourth</r> |

ربما سأقوم في النهاية بإجراء تحسينات على المستورد بعد كل شيء…

3 إعجابات

تم الإصلاح


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

لقد أصلحت مشكلة الاقتباسات، وأضفت دعمًا لبعض أكواد BBCodes المضافة بشكل شائع، وجعلت تحليل روابط يوتيوب أقل تعطلًا، ودعمت امتداد mentions/simplementions. لا يزال لدي المزيد من الأشياء لتحسينها مثل إضافة دعم لعدة بادئات مواقع (حالة الاستخدام الرئيسية هي عندما يكون لديك روابط على منتداك إلى example.com و www.example.com).

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

أسهل طريقة لاستخدامها هي سحب فرعي في مكان ما واستبدال دليل البرنامج النصي للاستيراد داخل الحاوية باستخدام ربط حجم (bind mount).

على سبيل المثال، اسحب تغييراتي في مكان ما:

git clone --filter=blob:none --no-checkout https://github.com/ftc2/discourse.git discourse_dev
cd discourse_dev
git sparse-checkout set --cone
git switch phpbb_import
git sparse-checkout set script/import_scripts

ثم أضف هذا إلى إعدادات حاوية import.yml الخاصة بك:

docker_args:
  - '-v /path/to/discourse_dev/script/import_scripts:/var/www/discourse/script/import_scripts'

ثم أعد بناء حاوية الاستيراد. بعد إعادة البناء، قد ترغب في إعادة تعيين المكان الذي سحبت فيه مستودعي لأن عملية البناء ستقوم بالكتابة فوق ملفاتي، لوول.

cd /path/to/discourse_dev
git reset --hard HEAD
chown -R 1000:1000 .
5 إعجابات