هل من الممكن استيراد منتديات phpBB إلى منتدى Discourse موجود، أي دمجهما؟ أفترض أن الأمر يعتمد على الإعدادات المتعلقة بتعيين الفئات.
هل هناك أي مشاكل يجب الانتباه إليها؟
هل يتم دمج المستخدمين إذا كان لديهم نفس عنوان البريد الإلكتروني؟
هل من الممكن استيراد منتديات phpBB إلى منتدى Discourse موجود، أي دمجهما؟ أفترض أن الأمر يعتمد على الإعدادات المتعلقة بتعيين الفئات.
هل هناك أي مشاكل يجب الانتباه إليها؟
هل يتم دمج المستخدمين إذا كان لديهم نفس عنوان البريد الإلكتروني؟
نعم. إذا لم تقم بتعيين الفئات الخاصة بك في ملف الإعدادات، فسيتم إنشاء فئات جديدة حسب الحاجة أثناء الاستيراد. إذا كانت هناك فئة موجودة بالفعل في Discourse تطابق اسم فئة من phpBB، فسيتم دمج الفئات.
أوه، نعم. إليك موضوع يفصل ما واجهته. لدي بعض النصائح ومستودع مع تحديثاتي المجمعة للمستورد.
لا أتذكر الشروط الدقيقة، ولكن نعم، يتم دمج المستخدمين تلقائيًا أثناء الاستيراد.
أنا فضولي لمعرفة ما إذا كان من الممكن دمج منتدى phpbb3 في Discourse مع الاحتفاظ بجميع المواضيع المستوردة للقراءة فقط. بحثت في الموضوع، لكنني لم أر هذا مذكورًا. شكرًا.
يمكنك تعديل البرنامج النصي للاستيراد لأرشفة جميع المواضيع التي تم إنشاؤها، أو قد يكون من الأسهل القيام بذلك دفعة واحدة بعد تشغيل البرنامج النصي. انظر Administrative Bulk Operations للحصول على أمثلة.
أهلاً،
يبدو أنني أواجه مشكلة عند بدء عملية الاستيراد. يبدو أن الأمر يحدث أثناء استيراد المستخدمين أو بعد ذلك بوقت قصير. لقد قمت بتضمين تتبع المكدس وفيديو سريع مدته 20 ثانية للمخرجات.
يرجى تقديم المشورة.
0x00007fe87a88bb10 /var/www/discourse/script/import_scripts/phpbb3/importers/user_importer.rb:87}
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.7/lib/active_record/validations.rb:80:in `raise_validation_error': Validation failed: Name can't be blank (ActiveRecord::RecordInvalid)
from /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.7/lib/active_record/validations.rb:53:in `save!'
from /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.7/lib/active_record/transactions.rb:302:in `block in save!'
from /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.7/lib/active_record/transactions.rb:354:in `block in with_transaction_returning_status'
from /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.7/lib/active_record/connection_adapters/abstract/database_statements.rb:314:in `transaction'
from /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.7/lib/active_record/transactions.rb:350:in `with_transaction_returning_status'
from /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.7/lib/active_record/transactions.rb:302:in `save!'
from /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.7/lib/active_record/suppressor.rb:54:in `save!'
from /var/www/discourse/script/import_scripts/base.rb:361:in `block in create_user'
from /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.7/lib/active_record/connection_adapters/abstract/transaction.rb:319:in `block in within_new_transaction'
from /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activesupport-7.0.7/lib/active_support/concurrency/load_interlock_aware_monitor.rb:25:in `handle_interrupt'
from /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activesupport-7.0.7/lib/active_support/concurrency/load_interlock_aware_monitor.rb:25:in `block in synchronize'
from /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activesupport-7.0.7/lib/active_support/concurrency/load_interlock_aware_monitor.rb:21:in `handle_interrupt'
from /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activesupport-7.0.7/lib/active_support/concurrency/load_interlock_aware_monitor.rb:21:in `synchronize'
from /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.7/lib/active_record/connection_adapters/abstract/transaction.rb:317:in `within_new_transaction'
from /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.7/lib/active_record/connection_adapters/abstract/database_statements.rb:316:in `transaction'
from /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.7/lib/active_record/transactions.rb:209:in `transaction'
from /var/www/discourse/script/import_scripts/base.rb:360:in `create_user'
from /var/www/discourse/script/import_scripts/base.rb:278:in `block in create_users'
from /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rack-mini-profiler-3.1.1/lib/patches/db/mysql2/alias_method.rb:8:in `each'
from /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rack-mini-profiler-3.1.1/lib/patches/db/mysql2/alias_method.rb:8:in `each'
from /var/www/discourse/script/import_scripts/base.rb:266:in `create_users'
from /var/www/discourse/script/import_scripts/phpbb3/importer.rb:106:in `block in import_anonymous_users'
from /var/www/discourse/script/import_scripts/base.rb:948:in `block in batches'
from /var/www/discourse/script/import_scripts/base.rb:947:in `loop'
from /var/www/discourse/script/import_scripts/base.rb:947:in `batches'
from /var/www/discourse/script/import_scripts/phpbb3/importer.rb:293:in `batches'
from /var/www/discourse/script/import_scripts/phpbb3/importer.rb:102:in `import_anonymous_users'
from /var/www/discourse/script/import_scripts/phpbb3/importer.rb:33:in `execute'
from /var/www/discourse/script/import_scripts/base.rb:47:in `perform'
from /var/www/discourse/script/import_scripts/phpbb3/importer.rb:22:in `perform'
from script/import_scripts/phpbb3.rb:35:in `<module:PhpBB3>'
from script/import_scripts/phpbb3.rb:16:in `<module:ImportScripts>'
from script/import_scripts/phpbb3.rb:15:in `<main>'
تعديل:
يبدو أن الأمر يتعلق بالمستخدمين المجهولين، أعتقد أنني سألقي نظرة على قاعدة بياناتي.
def map_anonymous_user(row)
username = row[:post_username]
{
id: @settings.prefix(username),
email: "anonymous_#{SecureRandom.hex}@no-email.invalid",
username: username,
name: @settings.username_as_name ? username : "",
created_at: Time.zone.at(row[:first_post_time]),
active: true,
trust_level: TrustLevel[0],
approved: true,
approved_by_id: Discourse.system_user.id,
approved_at: Time.now,
post_create_action:
proc do |user|
row[:user_inactive_reason] = Constants::INACTIVE_MANUAL
row[:ban_reason] = "Anonymous user from phpBB3" # TODO i18n
suspend_user(user, row, true)
end,
}
end
تعديل
تمكنت من تجاوز الخطأ عن طريق تغيير هذا السطر في طريقة map_anonymous_user. اتضح أن القيمة الافتراضية كانت تعيين اسم المستخدم إلى سلسلة فارغة، لذلك أضفت كلمة إليه.
تغيير هذا
name: @settings.username_as_name ? username : "",
إلى هذا
name: @settings.username_as_name ? username : "Anonymous ",
هل يمكنني حذف المشاركات القديمة قبل تشغيل استيراد تزايدي؟ لقد نجحت في تشغيل الاستيراد محليًا في تثبيت تطوير، وقمت باستعادته إلى خادمي الذي يعمل بتثبيت Docker، وخطتي هي تشغيل استيراد هناك للمشاركات الجديدة. ولكن حتى مع تجاهل المشاركات التي تم استيرادها بالفعل، فإن تشغيل الاستيراد على الخادم يستغرق ساعات. منتدى الخاص كبير جدًا (1.3 مليون مشاركة) وقرص الخادم الخاص بي بطيء، لذا فإن مجرد تحميل ملف .sql يستغرق ساعات.
هل سيسبب ذلك مشاكل إذا قمت بشيء مثل DELETE FROM phpbb_posts WHERE post_id < 2926807 محليًا ثم قمت بتفريغ وتحميل ذلك إلى الخادم وتشغيل الاستيراد كالمعتاد؟
لقد أضفت إعداد IMPORT_AFTER إلى بعض البرامج النصية لسحب البيانات فقط بعد تاريخ معين. لذا سأقوم بتعديل استعلام SQL الذي يسحب المشاركات للحصول فقط على المشاركات بعد يوم واحد من آخر تفريغ للبيانات.
ولكن إذا كان لديك قرص بطيء جدًا، فمن المحتمل أن تواجه مشكلة في استضافة Discourse. هل الأداء مقبول مع البيانات التي لديك؟
نعم، للاستخدام العادي سأستخدم قرصًا أسرع، ولكنه ليس كبيرًا بما يكفي لاستضافة نسخ متعددة من قاعدة البيانات في نفس الوقت، لذلك أقوم بتوجيه /shared/import إلى قرص أكبر وأبطأ في قسم وحدات التخزين import.yml. نجحت الحيلة في استعادة النسخة الاحتياطية الأولية، وقمت بإعادة توجيه /shared/tmp إلى القرص البطيء بعد فشل الاستعادة بسبب نفاد المساحة على الرغم من أن لدي 18 جيجابايت مجانية وقاعدة بيانات بحجم 6 جيجابايت (أعتقد أنني رأيتك تذكر في مكان آخر أن الاستعادة تنشئ 3 نسخ من قاعدة البيانات أثناء تشغيلها). ولكن في تلك المرحلة لم يكن وقت التعطل مصدر قلق.
لذلك، يومًا بعد يوم، لا تمثل الحجم والسرعة مشكلة، فمنتدى الخاص بي هادئ جدًا، إنه فقط قديم.
سألقي نظرة على تعديل SQL في البرامج النصية. شكرًا!
يجب أن يذهب اسم قاعدة البيانات في المعلمة schema. اسم تلك المعلمة مربك بعض الشيء، نعم. يمكنك رؤية هنا في الكود، يتم تمريره كاسم قاعدة البيانات.
https://www.loom.com/share/1f66315779af4cf7b286c8541d4f3f09
مرحباً! لقد قمت بإنشاء مقطع فيديو موجز أتحدث فيه عن المشكلة التي نواجهها مع الاستيراد. لدينا حوالي 650 ألف منشور نقوم باستيرادها.
شكراً جزيلاً!
https://www.loom.com/share/1f66315779af4cf7b286c8541d4f3f09?sid=11a46d3c-8510-43a1-82e9-1a3524cbb365
مرحباً. هل هناك طريقة لتنفيذ الاستيراد صفاً بصف. نواجه مشاكل في اكتمال البرنامج النصي. بعض الأشياء تعمل، مثل المستخدمين والصور الرمزية، والبعض الآخر لا يعمل. لقد قمت بإعادة تثبيت خادمي حوالي 4 مرات لأنني قرأت في مكان ما أنه بعد فشل الاستيراد، يلزم إجراء تثبيت نظيف.
التفاصيل الأخرى موجودة في الفيديو الذي نشرته. أي مساعدة ستكون موضع تقدير.
مرحباً. لقد أمضيت حوالي 18 ساعة في الترحيل وما زلت لم أتمكن من جعل الترحيل يعمل. هل يمكنك من فضلك مشاهدة الفيديو الخاص بي وتقديم أي نصائح أو حيل أو ما إذا كان هناك شيء مفقود في الإعداد. نحن نحتاج فقط إلى المنشورات والمواضيع والرسائل الخاصة والفئات. الصور الرمزية والمستخدمون يعملون. الخادم نظيف UBUNTU 22.04.
الحل الأسهل هو عمل نسخة احتياطية بعد إنشاء الموقع حتى تتمكن من استعادة هذا الموقع. طريقة أخرى للحصول على قاعدة بيانات نظيفة هي تنفيذ rake db:drop db:create db:migrate، ولكن يجب عليك القيام ببعض الأشياء لجعل ذلك ممكنًا. إذا لم تتمكن من تخمين تلك الأشياء من رسائل الخطأ، فإن حل النسخ الاحتياطي/الاستعادة هو الحل الأفضل، وقد يكون أسرع على أي حال.
يمكنك إضافة بعض عبارات puts لتصحيح الأخطاء، على الرغم من أن بنية برنامج phpbb3 النصي مربكة بعض الشيء للأشخاص الذين لا يعرفون Ruby جيدًا.
أيضًا، يمكنك تشغيل البرنامج النصي عدة مرات وسيتجاوز الأشياء التي قام بها بالفعل، لذلك لا تحتاج حقًا إلى مسح قاعدة البيانات حتى تقوم بتغيير شيء يتطلب بداية جديدة (أي، سيفعل شيئًا مختلفًا مع البيانات التي تم استيرادها بالفعل).
هذا يتجاوز ما يمكنني فعله مجانًا. إذا كانت لديك ميزانية، يمكنك الاتصال بي مباشرة أو النشر في Marketplace.
يبدو أن البرنامج النصي للاستيراد لا يعمل. المشكلة في الفيديو. إذا أمكن لأحد من فريق ترحيل المناقشات النظر في الأمر، فسيكون ذلك موضع تقدير.
إذا كانت المساعدة مدفوعة، فهل يمكنكم إدراج تكلفة الترحيل؟ حسب فهمي، هذا هو المكان الذي نذهب إليه لطرح أسئلة حول كيفية عمل البرنامج النصي. أنا لا أمانع في الرسوم، لقد اعتقدت فقط أن هذه كانت مشروعًا مفتوح المصدر وهذا هو المكان الذي نذهب إليه لطرح الأسئلة.
أنا أقول إنني متطوع هنا، ولست على استعداد لمشاهدة فيديو مجانًا، ويرجع ذلك إلى حد كبير إلى كراهيتي غير العقلانية للفيديو. لكنني لست الوحيد هنا. الكثير من الناس يحبون مشاهدة مقاطع الفيديو.
إذًا في كل مرة يتم تشغيله، فإنه ينشئ نسخًا مكررة من المستخدمين الذين تم إنشاؤهم في التشغيل السابق؟ لا أستطيع أن أتخيل كيف يمكن أن يكون هذا هو الحال. هل أنت متأكد؟ هذه ليست الطريقة التي يفترض أن تعمل بها.
سيظهر أنه يستورد الأشياء مرة أخرى، ولكنه يعمل بشكل أسرع بكثير لأنه لا يفعل شيئًا في الواقع نظرًا لأن الأشياء التي تم استيرادها بالفعل لديها حقل مخصص import_id معين يمنع استيرادها مرة أخرى. إذا كان يكرر البيانات في كل تشغيل، فهذا يعني أن هناك خطأ غريبًا جدًا.
إنه كذلك. في بعض الأحيان يحتاج الناس أو يريدون مساعدة أكثر مما يمكنك الحصول عليه مجانًا.
حسناً. هل يمكنك من فضلك نشر رسومك الخاصة بالترحيل؟ أفهم أن البرنامج النصي لا يبدو أنه يعمل وأنه يتطلب دعمًا مدفوعًا. أنا موافق تمامًا على ذلك.
عمليات الترحيل معقدة للغاية. كل واحد منها له تحدياته المختلفة، حيث أن بيانات كل منتدى فريدة من نوعها. يمكن أن يستغرق تصحيح مشكلة الترحيل ساعات، ويتطلب نظرة متعمقة في السجلات وقاعدة البيانات والكود وما إلى ذلك. من الصعب القيام بذلك بمجرد النظر إلى هذه المشاركات، آسف لا يمكنني تقديم المزيد من المساعدة! إليك الأسئلة الشائعة حول عمليات الترحيل لدينا: Migrating to Discourse | Discourse - Civilized Discussion
شكرا على الرابط. أعتقد أنني اكتشفت المشكلة وأن نص الاستيراد يعمل الآن. أنا عند حوالي 100000/666357 مشاركة الآن. لقد كان ChatGPT مفيدًا في تحديد بعض الأخطاء المتعلقة بالأذونات وما إلى ذلك.