نتائج إيجابية خاطئة حول "المنشورات لم تتم إعادة تعيينها إلى عنوان URL جديد لتحميل S3"

كنت أقوم بترحيل مثيل Discourse الخاص بنا من خادم إلى آخر، وواجهت مشكلة مثيرة للاهتمام…

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

تحديث عناوين URL في قاعدة البيانات...
إزالة الصور المحسّنة القديمة...
وضع علامة على جميع المشاركات التي تحتوي على مربعات ضوئية لإعادة التحميل...
تم وضع علامة على 72038 مشاركة لإعادة التحميل
استثناء: 257 مشاركة لم تتم إعادة تعيينها إلى عنوان URL جديد لتحميل S3. فشل ترحيل S3 لقاعدة البيانات 'default'.

بعد البحث قليلاً، تمكنت من تتبع المشكلة إلى هذا السطر:

ثم، ذهبت إلى وحدة تحكم rails، وتمكنت من تكرار الاستعلامات باستخدام ما يلي:

discourse(prod)> SiteSetting.cdn_path("/uploads/#{@current_db}/original").sub(/https?:/, "")
=> "/uploads//original"
discourse(prod)> RailsMultisite::ConnectionManagement.current_db
=> "default"
discourse(prod)> cdn_path = SiteSetting.cdn_path("/uploads/default/original").sub(/https?:/, "")
=> "/uploads/default/original"
discourse(prod)> Post.where("cooked LIKE '%#{cdn_path}%'")
=> ...

ثم، ذهبت إلى تلك المشاركات المحددة، وكانت جزءًا من تقارير الأداء (لقطة الشاشة بعد تشغيل نص برمجي للبحث والاستبدال):

على ما يبدو، هذا الفحص يسترد أي مشاركة تحتوي على /uploads/default/original في حقل cooked، على الرغم من أنها قد لا تكون أصلًا شرعيًا. في هذه الحالة، تم استخدام /uploads/default/original كـ “نص عادي”، وبالتالي لم يتم تفويتها أثناء مهمة الترحيل.

لست متأكدًا مما إذا كان هذا متوقعًا؟
شكرا لك!

لقد رأيت مشاكل مماثلة مع المنشورات المطبوخة، على ما أعتقد.

ربما يمكنك إجراء استعادة قاعدة البيانات فقط ثم يتخطى هذه الفحوصات.

هذا ما سأحاوله بعد ذلك.

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

إعجابَين (2)

نعم. ربما يجب ألا يتحقق الكود من المنشورات المطبوخة.

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

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

أنا جديد على ديسكورس، لذا سأحاول معرفة كيفية إيجاد حل بديل، ولكن يبدو أن هذا له أولوية أعلى إذا كانت النسخة الاحتياطية/الاستعادة لا تعمل بشكل صحيح للمستخدمين الذين لديهم S3 buckets كتخزين للتحميلات.

هذه هي ملفات السجل الخاصة بمحاولة الاستعادة.

[2025-06-22 16:02:24] /var/www/discourse/lib/file_store/to_s3_migration.rb:132:in `raise_or_log'
/var/www/discourse/lib/file_store/to_s3_migration.rb:81:in `migration_successful?'
/var/www/discourse/lib/file_store/to_s3_migration.rb:385:in `migrate_to_s3'
/var/www/discourse/lib/file_store/to_s3_migration.rb:59:in `migrate'
/var/www/discourse/lib/file_store/s3_store.rb:352:in `copy_from'
/var/www/discourse/lib/backup_restore/uploads_restorer.rb:69:in `restore_uploads'
/var/www/discourse/lib/backup_restore/uploads_restorer.rb:49:in `restore'
/var/www/discourse/lib/backup_restore/restorer.rb:167:in `restore_uploads'
/var/www/discourse/lib/backup_restore/restorer.rb:71:in `run'
/var/www/discourse/script/spawn_backup_restore.rb:20:in `restore'
/var/www/discourse/script/spawn_backup_restore.rb:33:in `block in 
/var/www/discourse/script/spawn_backup_restore.rb:4:in `fork'
/var/www/discourse/script/spawn_backup_restore.rb:4:in `
[2025-06-22 16:02:24] Trying to rollback...

تحديث بخصوص وضعي المحدد… كان لا يزال لدي ملفات في /var/discourse/shared/standalone/uploads على الرغم من أنني كنت قد تحولت إلى S3 للتخزين. بمجرد أن حذفت الدليل ‘default’ في دليل uploads هذا، قمت بإعادة إنشاء نسخة احتياطية، ونجحت في إنشاء نسخة احتياطية لقاعدة البيانات فقط (…sql.gz).

لسبب ما (في حالتي)، إذا كانت هناك ملفات في هذا الدليل، فإنه يتجاهل الإعداد لعدم تضمين التحميلات في النسخة الاحتياطية وينشئها على أي حال.

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

على أي حال، تمكنت من تجاوز المشكلة ويمكنني الاستعادة بنجاح الآن.