نقل منتدى vBulletin 4 إلى Discourse

مرحباً. أردت فقط مشاركة حلي.
بالنسبة للمشاكل المتعلقة بالاقتباسات. كما ذكرت سابقًا، كنت أواجه مشاكل - التعبير النمطي لا يلتقط علامات الاقتباس عندما:

  • قد يتم تضمين اسم المستخدم ومعرف المنشور في علامات اقتباس مزدوجة
  • اقتباسات متداخلة

قررت إجراء بحث واستبدال باستخدام منطق مختلف. بدلاً من البحث عن العلامات ومحتوياتها، استخدمت تعبيرًا نمطيًا يبحث فقط عن العلامات:

كان:
raw.gsub!(%r{\\[quote=\"?([^;]+);(\\d+)\"?\\](.+?)\\[\\/quote\\]}im) do

أصبح:
raw.gsub!(%r{(\\[QUOTE(=\"?([^;]+);(\\d+)\"?)?\\])|(\\[\\/QUOTE\\])}im) do

ثم قمت بتغيير تحديد مصدر الاقتباس قليلاً:

      if $3 && $4
        if topic_lookup = topic_lookup_from_imported_post_id(post_id)
          post_number = topic_lookup[:post_number]
          topic_id = topic_lookup[:topic_id]
          "\n[quote=\"#{new_username},post:#{post_number},topic:#{topic_id}\"]\n"
        else
          "\n[quote=\"#{new_username}\"]\n"
        end
      elsif $5
        "\n[/quote]\n"
      end

أيضًا، قمت بتغيير رمز الإخفاء. بدلاً من:

    # [spoiler=Some hidden stuff]SPOILER HERE!![/spoiler]
    raw.gsub!(%r{\\[spoiler=\"?(.+?)\"?\\](.+?)\\[/spoiler\\]}im) do
      "\n#{$1}\n[spoiler]#{$2}[/spoiler]\n"
    end

الذي يقوم بتمويه النص، قمت بتحويله إلى علامة تفاصيل:

    raw.gsub!(%r{(\\[spoiler(=\"?(.*?)\"?)?\\])|(\\[\\/spoiler\\])}im) do
      if $3
        "\n[details=#{$3}]\n"
      elsif $1
        "\n[details]\n"
      elsif $4
        "\n[/details]\n"
      end
    end

نظرًا لأنه يحدث أن في عالم vbulletin - الإخفاء ليس محتوى مموهًا، بل هو محتوى مطوي. لذلك أعتقد أنه من الأنسب بكثير لبرنامج نصي لاستيراد vbulletin تحويل المخفي إلى تفاصيل بدلاً من الإخفاء المموه.

لاحظت أيضًا علامة الإشارة. في حالتي، في vbulletin، بدت الإشارات هكذا:
[mention=XXX]username[/mention]

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

    # [MENTION]<username>[/MENTION]
    raw.gsub!(%r{\\[mention\\](.+?)\\[/mention\\]}i) do
      new_username = get_username_for_old_username($1)
      "@#{new_username}"
    end

لقد قمت بإصلاح هذا بطريقتي الخاصة أيضًا:

    # [MENTION]<username>[/MENTION]
    raw.gsub!(%r{\\[mention(=\\d+)?\\](.+?)\\[/mention\\]}i) do
      new_username = get_username_for_old_username($2)
      "@#{new_username}"
    end
إعجاب واحد (1)

هذا غير صحيح عندما بدأت في ترحيل منتدى vBulletin الخاص بي الذي يبلغ من العمر 24 عامًا والذي يعمل بنظام vB 3. كانت هناك العديد من حالات عدم التوافق والمشكلات الأخرى مع البرنامج النصي. ومع ذلك ، بذلت الكثير من الجهد في إنشاء مستورد لـ vBulletin 3 بناءً على البرنامج النصي لـ vB4.

البرنامج النصي المحسّن مضمن مع Discourse ، ويسمى vbulletin3.rb. استخدام البرنامج النصي لاستيراد vB3 هو نفس ما هو موصوف في هذا الدليل الإرشادي. فقط قم بتشغيل bundle exec ruby script/import_scripts/vbulletin3.rb بدلاً من ذلك.

يحتوي vBulletin3 على بعض التغييرات / التحسينات الهامة:

  1. يتم نسخ أذونات المنتدى
  2. يتم إنشاء مجموعات مشرفي المنتدى
  3. يتم إنشاء مجموعات المستخدمين القابلة للانضمام مع التكوين الصحيح
  4. تداخل المنتدى في المستورد حتى 3 مستويات عمق (الحد الأقصى لـ Discourse)
  5. يتم تسجيل الروابط الدائمة لجميع المواضيع والمنشورات ، مما يمنع تلف الروابط
  6. يتم نسخ بعض إعدادات المنتدى الأساسية (مثل العنوان ، البريد الإلكتروني للإشعارات ، اسم الشركة)
  7. يتم استيراد استطلاعات الرأي
  8. تحسينات كبيرة في تحويل bbcode إلى markdown
  9. يتم تحويل الروابط العميقة للمواضيع والمنشورات والمرفقات إلى مراجع Discourse ، وهذا يتطلب تعيين متغير البيئة FORUM_URL إلى forum.hostname/path (بدون بروتوكول).

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

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

إعجابَين (2)

هذه عودة إلى الماضي :slight_smile:

يبدو منتدى الخاص بك لطيفًا جدًا. تعجبني الألوان المتناوبة في صفوف المواضيع.

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

internal:timev:286:في at’: لا يمكن تحويل NilClass إلى رقم دقيق (TypeError)`

إما أن يكون الاستعلام خاطئًا أو أن الجدول مفقود منه قيمة ما

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

 SELECT a.filedataid attachment_id, a.userid user_id, a.filename filename
             FROM attachment a
            WHERE a.attachmentid = 383075;

ملف NUMBER.attach هو الآن حقل filedataid، وليس حقل attachment_id. لذا يجب تحديث هذا الاستعلام في البرنامج النصي.

لقد طُلب مني ترحيل منتدى vbulletin 4.25 إلى discourse…. قراءة هذا الموضوع تمنحني مشاعر مختلطة… يبدو أنه ممكن، ولكنه قد يكون مؤلمًا للغاية ويستنزف الوقت (كلاهما يمكنني تجنبه في الوقت الحالي)….\n\nهل يوجد نص برمجي محدث لـ vbulletin 4.25 في أي مكان؟ لا يمكنني رؤية 3 و 5 إلا على الصفحة الرسمية؟

حسنًا، هناك نصوص برمجية vbulletin و vbulletin5 في دليل bulk imports والتي يبلغ عمرها شهرين فقط. تشغيل عمليات الاستيراد المجمعة هذه صعب للغاية وغير موثق جيدًا.

لقد أجريت أكثر من 100 عملية استيراد وأنا متأكد من أنني لم أقم بعملية لم تتطلب تعديل النص البرمجي لسبب أو لآخر.

لقد كتبت العديد من نصوص الاستيراد قبل أن أتعلم Ruby بالفعل (لكن أستاذًا في منتصف الثمانينيات أكد لي أنه بعد فصل لغات البرمجة الخاص به يمكنني القول إنني أعرف أي لغة إذا كان لدي عطلة نهاية أسبوع وكتاب؛ لقد كان على حق في الغالب.)

لكن نعم، من المحتمل أن يكون الأمر مؤلمًا ويستنزف الوقت بقدر ما تتخيله.

أشك في أن نص vbulletin سيقوم بعمل جيد؛ ربما لا أوصي بنص الاستيراد المجمع إلا إذا كان لديك أكثر من مليون مشاركة + مستخدم.

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

شكرا لك :slight_smile:
أعتقد أنني بحاجة إلى تحديد ما سأفعله في عطلة نهاية الأسبوع :smiley:

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

أقدر حقًا بعض المساعدة في هذا :face_with_spiral_eyes:

لقد قرأت الموضوع، واتبعت بعض الخطوات التي رأيتها هنا، لكنني عالق.

  1. أقوم بالاتصال بـ vps الخاص بي عبر ssh
  2. أدخل صورة docker
  3. أقوم بتثبيت mariadb-server
  4. أحاول تشغيل أمر mysql لإنشاء قاعدة بيانات، ولكن أحصل على “لا يمكن الاتصال بالخادم المحلي عبر المقبس”

التعليمات هنا تعود لبضع سنوات - أرى أن عددًا قليلاً من الأشخاص واجهوا نفس الخطأ، لكنني لا أرى أي حلول له.

هل قام أي شخص بهذه العملية مؤخرًا ويمكنه توجيهي في الاتجاه الصحيح - لا أعتقد أن هناك دليلًا خطوة بخطوة أفتقده في أي مكان، أليس كذلك؟

تعديل: فقط لإضافة، لقد جربت كل أنواع الحيل وانتهى بي الأمر بتثبيت صورة docker لـ mariadb على المضيف المحلي (ليس docker) ثم فتح المنفذ - يمكنني الآن الاتصال بقاعدة البيانات من صورة docker… ولكن تشغيل البرنامج النصي يعطي: Gemfile: متغير محلي غير معرف أو طريقة ‘mysql2’ لقد حاولت تثبيت Gemfile، لكنه يفشل… وقبل أن أتعمق في استكشاف الأخطاء وإصلاحها، أشعر فقط أنني أستخدم معلومات قديمة وحزم قديمة محتملة… أنا مرتبك جدًا وأحتاج إلى بعض التوجيه!

أي مساعدة محل تقدير!

… استمررت وأخيراً وصلت إلى تشغيل البرنامج النصي! ومع ذلك، بعد البدء في تنفيذه يفشل مع:

"root@vps-xxxxxxxx-app:/var/www/discourse/script/import_scripts# bundle exec ruby vbulletin.rb
/var/www/discourse/config/initializers/013-excon_defaults.rb:4:in `<main>': can't modify frozen Hash: {:chunk_size=>1048576, :ciphers=>"ECDHE-ECDSA- [................]"

… وأعتقد أنني وصلت تقريبًا إلى الحد الأقصى لقدرتي على استكشاف الأخطاء وإصلاحها.

لا أعرف ما إذا كان بدء التشغيل من /var/www/discourse يُحدث فرقًا، لكنني أفعل ذلك دائمًا. إليك ما هو موصى به في المنشور الأصلي.

لا أتعرف على هذا الخطأ.

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

بحلول الوقت الذي استسلمت فيه الليلة الماضية، بعد ساعات من “البحث”، كنت قد عبثت بالعديد من الأشياء خارج منطقة راحتي وكنت قلقًا من أنني كنت أسبب المزيد من الضرر أكثر من النفع. كنت حريصًا أيضًا على سماع ما إذا كان شخص ما قد فعل ذلك مؤخرًا وكان هناك بعض الخطوات السحرية التي كنت أفتقدها، بدلاً من الدخول في دوامات متكررة :winking_face_with_tongue:

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

أوه. لقد فعلت ذلك في حاوية وهذه التعليمات مخصصة لبيئة التطوير. هل قمت بإعداد بيئة تطوير؟ هل نجحت في ذلك؟ هذا صعب على شبكة VPN.

سأقوم بالمسح والمحاولة مرة أخرى غدًا، صداع الليلة.
سأخبرك كيف تسير الأمور :slightly_smiling_face:

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

هل قمت بإعداد بيئة تطوير؟ هل كانت تلك خطوتك الأولى؟

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

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

ستدخل الحاوية، وربما تعد ملف Gem وتثبت الحزمة.

استخدام حاوية لـ mysql أو Mariadb منطقي على الأرجح. (ولكن بعد ذلك ستحتاج إلى التأكد من أن الحاويات يمكنها رؤية بعضها البعض)

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

لدي أخبار مثيرة…

لقد نجحت في تشغيل البرنامج النصي (سأقوم بإنشاء دليل بمجرد الانتهاء منه)، وقد قام باستيراد مجموعات المستخدمين، ولكنه عالق في استيراد المستخدمين، أعتقد أن الأمر يتعلق بمتغير المنطقة الزمنية؟

importing users
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/tzinfo-2.0.6/lib/tzinfo/timestamp.rb:138:in `for': Integer values are not supported (ArgumentError)

            raise ArgumentError, "#{value.class} values are not supported" unless is_time_like?(value)
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        from /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/tzinfo-2.0.6/lib/tzinfo/timezone.rb:575:in `utc_to_local'
        from script/import_scripts/vbulletin.rb:1019:in `parse_timestamp'
        from script/import_scripts/vbulletin.rb:166:in `block (2 levels) in import_users'
        from /var/www/discourse/script/import_scripts/base.rb:267:in `block in create_users'
        from /var/www/discourse/script/import_scripts/base.rb:266:in `each'
        from /var/www/discourse/script/import_scripts/base.rb:266:in `create_users'
        from script/import_scripts/vbulletin.rb:148:in `block in import_users'
        from /var/www/discourse/script/import_scripts/base.rb:951:in `block in batches'
        from <internal:kernel>:187:in `loop'
        from /var/www/discourse/script/import_scripts/base.rb:950:in `batches'
        from script/import_scripts/vbulletin.rb:126:in `import_users'
        from script/import_scripts/vbulletin.rb:82:in `execute'
        from /var/www/discourse/script/import_scripts/base.rb:47:in `perform'
        from script/import_scripts/vbulletin.rb:1027:in `<main>'

الافتراضي في البرنامج النصي هو “America/Los Angeles” - منتدى vBulletin مضبوط على (GMT) أوروبا الغربية، لندن، لشبونة، الدار البيضاء) ومثيل Discourse الذي أقوم بالاستيراد إليه يحتوي على إدخالين: America/Los Angeles و Europe/Paris

هل تعرف أيًا منها يجب أن أختار؟

لا يهم كثيرًا أي واحد تختاره.

أعتقد أن الأمر قد يكون أن التاريخ غير مخزن بالطريقة التي يتوقعها البرنامج النصي.

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