أحاول نقل التحميلات إلى S3 في موقع مزدحم نسبيًا.
كل شيء يسير كما هو مخطط له باستثناء عندما أقوم بتشغيل rake uploads:migrate_to_s3، أواجه الخطأ التالي:
Updating the URLs in the database...
Removing old optimized images...
Flagging all posts containing lightboxes for rebake...
2023 posts were flagged for a rebake
rake aborted!
FileStore::ToS3MigrationError: 1 of 9629 uploads are not migrated to S3. S3 migration failed for db 'default'.
/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:79:in `migration_successful?'
/var/www/discourse/lib/file_store/to_s3_migration.rb:373:in `migrate_to_s3'
/var/www/discourse/lib/file_store/to_s3_migration.rb:66:in `migrate'
/var/www/discourse/lib/tasks/uploads.rake:123:in `migrate_to_s3'
/var/www/discourse/lib/tasks/uploads.rake:102:in `block in migrate_to_s3_all_sites'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rails_multisite-4.0.0/lib/rails_multisite/connection_management.rb:80:in `with_connection'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rails_multisite-4.0.0/lib/rails_multisite/connection_management.rb:90:in `each_connection'
/var/www/discourse/lib/tasks/uploads.rake:100:in `migrate_to_s3_all_sites'
/var/www/discourse/lib/tasks/uploads.rake:96:in `block in <main>'
/usr/local/bin/bundle:23:in `load'
/usr/local/bin/bundle:23:in `<main>'
Tasks: TOP => uploads:migrate_to_s3
(See full trace by running task with --trace)
هذا السطر على وجه الخصوص لفت انتباهي FileStore::ToS3MigrationError: 1 of 9629 uploads are not migrated to S3. S3 migration failed for db 'default'.
أفترض أنه يعني أن هناك ملفًا واحدًا إشكاليًا يتسبب في فشل مهمة rake بأكملها؟ هل هناك طريقة لمعرفة الملف الذي يسبب المشكلة وربما إزالته للسماح بإكمال المهمة المتبقية بسلام؟
بعض التحديثات:
يبدو أن الموقع يتم تحميله بشكل طبيعي، ومن خلال ما أراه، يتم تقديم الصور التي تم تحميلها من شبكة توصيل المحتوى (CDN).
لا تزال النسخة المحلية لجميع التحميلات موجودة على الخادم. أفترض أن هذا يرجع إلى أن الترحيل تم تحديده على أنه فشل.
هل هذا ناتج عن أمر rake uploads:s3_migration_status مفيد بأي شكل من الأشكال؟
# rake uploads:s3_migration_status
1 of 9630 uploads are not migrated to S3. S3 migration failed for db 'default'.
19 posts are not remapped to new S3 upload URL. S3 migration failed for db 'default'.
No posts require rebaking
Site is not ready for migration
قد تجد مرجعًا للملف الذي فشل عبر المسؤول > السجلات > سجلات الأخطاء
إذا لم يساعد ذلك، أعتقد أن البحث في قاعدة البيانات عن مشاركات تحتوي على cooked وتحتوي على yourdomain/uploads/ سيمنحك قائمة بتلك المشاركات الـ 19 المذكورة في حالة الترحيل. في أسوأ الأحوال، يمكنك بعد ذلك النظر يدويًا إلى تلك المشاركات ومقارنة أي تحميلات بما هو موجود في S3.
شيء مثل:
rails c
Post.where("cooked like '%discourse.example.com/uploads/%'")
لقد جربت اقتراحاتك، للأسف لم أجد شيئًا ذا صلة في سجلات الأخطاء. أرى إدخالاً مثل فشل تحسين الصورة: سبب غير معروف ولكنه لا يعطيني أي معلومات إضافية عما يقوله.
لقد جربت الاستعلام المقترح أيضًا، أحصل على مجموعة من المشاركات كنتيجة ولكن عند زيارة تلك المشاركات فعليًا، فإنها تحتوي على مجموعة من الصور المصغرة من معاينات onebox. عندما أحاول فتح الصورة في علامة تبويب جديدة على تلك الصور المصغرة، يبدو أنها يتم تحميلها من CDN.
أعتقد أنني أتوقع رؤية شيء كهذا لـ 18 من تلك المشاركات الـ 19، ربما حتى الـ 19 كلها إذا حدث أن فشل تحميل واحد في مشاركة بها عمليات تحميل متعددة.
قد يكون الأسهل هو استخراج جميع أسماء الملفات من نتيجة الاستعلام (على سبيل المثال، f8a2d9381889b8693db2777acac566bd7b134fa5.png) والبحث عنها في S3. من الناحية النظرية، يجب أن يكون هناك واحد مفقود بالضبط. تجاهل المشتقات، فقط ابحث عن تلك التي تحتوي على /originals/ في المسار.
سيكون الأمر مملاً بعض الشيء ولكنه لا ينبغي أن يستغرق وقتًا طويلاً إذا كان هذا الاستعلام قد حدد فقط تلك المشاركات الـ 19.
إذا لم يكن هناك حل واضح لجعله يتم تحميله بنجاح، فإن أيًا من الخيارين 1 أو 3 يبدو خيارين جيدين. الخيار 2 سأتركه على الأرجح لـ Discourse، وتحديدًا مهمة تنظيف التحميلات اليتيمة، والتي يتم التحكم في فترتها بواسطة الإعداد clean orphan uploads grace period hours.
قد يكون من الجيد الحصول على الملف قبل حذفه. إذا لم يكن يحتوي على أي بيانات حساسة، فقد يكون مفيدًا لاختبار سبب عدم إمكانية تحميله أثناء الترحيل.
شيء آخر يمكنك تجربته بعد إزالة الملف وإكمال الترحيل (وتنزيل الملف الفاشل) هو تعديل المنشور مرة أخرى لإعادة الملف. سيكون من المثير للاهتمام معرفة ما إذا كان فشل التحميل إلى S3 تمامًا أم أثناء مهمة الترحيل فقط.
إذا كنت لا تمانع في فقدان تلك الملفات الـ 64، فما فعلته عندما فشلت مهمة rake هذه باستمرار هو تعديلها، وجعلها تخطئ فقط إذا كان هناك 100 خطأ بدلاً من خطأ واحد.
حاولت باستخدام SKIP_FAILED=100 rake uploads:migrate_to_s3
=> 0 ملفات
سرد ملفات S3
… .. => 81070 ملفات
مزامنة الملفات إلى S3
تحديث عناوين URL في قاعدة البيانات…
إزالة الصور المحسّنة القديمة…
وضع علامة على جميع المشاركات التي تحتوي على مربعات ضوئية لإعادة الخبز…
تم وضع علامة على 54453 مشاركة لإعادة الخبز
53 مشاركة لم تتم إعادة تعيينها إلى عنوان URL تحميل S3 الجديد. فشلت هجرة S3 لقاعدة البيانات ‘default’.
لم أفهم كيفية وضع الملف المعدل على نص Discourse الخاص بي