أنا أستخدم نصوص الترحيل لترحيل منتدى Vanilla 3 إلى Discourse مستضاف ذاتيًا.
يعمل نص الترحيل بشكل جيد: RAILS_ENV=production ruby script/import_scripts/vanilla.rb /shared/uploads/export.text
المشكلة الوحيدة هي أنه بمجرد الانتهاء من التصدير، لا يبدو أنني أستطيع إعادة الاستيراد مرة أخرى. يعمل نص الاستيراد بشكل جيد في المرة الثانية، ولكن لم يتم تطبيق أي تغييرات بيانات أجريتها على ملف الاستيراد. أيضًا، يعمل المستورد أسرع بحوالي 50 مرة في المرة الثانية، مما يجعلني أشك في أنه لا يقوم باستيراد أي شيء بالفعل.
سؤال: هل هناك أي طريقة لإعادة تشغيل نصوص الاستيراد الموجودة في /var/www/discourse/script/import_scripts/
بعد المرة الأولى؟
على وجه التحديد، أثناء إصلاح الأخطاء في تنسيق ملف الاستيراد الخاص بي، أود أن أكون قادرًا على إعادة الاستيراد لإجراء تحديثات على المنشورات والمناقشات فقط.
حتى الآن، كان الحل الوحيد الذي وجدته هو تدمير تثبيت Discourse بالكامل والبدء من جديد، وهو ما يستغرق ما يقرب من ساعة في كل مرة.
أي نصائح؟
إليك الكود ذي الصلة من vanilla.rb:
def import_posts
puts "", "importing posts..."
create_posts(@comments) do |comment|
next unless t = topic_lookup_from_imported_post_id("discussion#" + comment[:discussion_id])
{
id: "comment#" + comment[:comment_id],
user_id:
user_id_from_imported_user_id(comment[:insert_user_id]) || Discourse::SYSTEM_USER_ID,
topic_id: t[:topic_id],
raw: clean_up(comment[:body]),
created_at: parse_date(comment[:date_inserted]),
}
end
end
أنا مبرمج ولكن لست مبرمج Ruby - هل هناك أي طريقة لتعديل هذا الكود لفرض استبدال محتويات منشور إذا قمت بإعادة استيراد؟
لقد وجدت حلاً بديلاً ليس سيئًا على الإطلاق - فبينما أقوم بتحسين المحلل الخاص بي الذي ينظف ملف الاستيراد من Vanilla، أميل إلى التركيز على الأخطاء التي تحدث في منشورات محددة.
لذلك، بينما أقوم بتحسين المحلل الخاص بي، يمكنني إيقاف المحلل في المصحح (أنا أستخدم Xojo، لمن يريد معرفة ذلك) والحصول على النص الخام.
بعد ذلك، في منتدى Discourse المباشر، يمكنني ببساطة إضافة منشور جديد، ولصق النص فيه، ورؤية كيف يبدو.
هذا يسمح لي بإجراء دورة اختبار/تصحيح/تغيير تستغرق بضع ثوانٍ، بدلاً من حوالي ساعة.
خطتي الجديدة: بعد أن أكون راضيًا عن تنظيف المحلل الخاص بي، سأقوم بحذف Discourse وإعادة تثبيته من البداية.
يعمل بهذه الطريقة عن قصد. الفكرة هي أنه يمكنك إجراء استيراد الآن ثم تشغيل استيراد آخر بملف تفريغ جديد، وسيعملان بسرعة كبيرة لأنهما يستوردان البيانات الجديدة فقط.
تحتاج إلى حذف قاعدة البيانات وإنشائها وترحيلها للبدء من جديد.
إذا كان لديك الكثير من المستخدمين، يمكنك إيقاف البرنامج النصي بعد استيراد المستخدمين وإنشاء نسخة احتياطية ثم استعادة تلك النسخة الاحتياطية قبل محاولة إجراء الإصلاحات.
هذا منطقي تمامًا، شكرًا لك على الشرح. سيكون من الجيد لو كان هناك علامة يمكن تعيينها لـ “فرض الكتابة فوق” ولكنني بحثت في الكود قليلاً ولم أجد شيئًا واضحًا.
هل هناك طريقة سهلة للقيام بذلك؟ الحل الوحيد الذي وجدته هو هذه الأوامر، والتي هي في الأساس نفس بدء تثبيت دوكر جديد:
# تحذير: هذه الأوامر تحذف منتدى Discourse الخاص بك بالكامل
cd /var/discourse
sudo ./launcher stop app
sudo rm -rf /var/discourse/shared/standalone
sudo ./launcher rebuild app
يستغرق الأمر حوالي 10 دقائق فقط، ولكن بعد ذلك يجب عليّ المرور بالإعداد الأولي مرة أخرى، وهو أمر مزعج.
هذه فكرة رائعة! يمكنني حتى إنشاء نسخة احتياطية بعد تثبيت جديد، ولكن قبل تشغيل البرنامج النصي للاستيراد على الإطلاق، نظرًا لأن إعادة استيراد المستخدمين/المواضيع/المنشورات/التعليقات سريعة جدًا، وهذا المنتدى ليس متاحًا للجمهور.