نقل ملفات S3/Spaces غير الصور إلى التخزين المحلي

لقد قرأت الصفحة التالية:

لذلك نظرت في lib/taks/uploads.rake:migrate_from_s3 ووجدت:

    .where("raw LIKE '%.s3%.amazonaws.com/%' OR raw LIKE '%(upload://%'")

ومع ذلك، لاحظت أن تحميلات الفيديو لا تحصل على البروتوكول الوهمي upload:// الخام، بل تنتهي بدلاً من ذلك كرابط حرفي إلى مزود التخزين (في حالتي، DigitalOcean Spaces).

يبدو واضحًا أنني سأضطر إلى تعديل هذه المهمة لكي تنجح.

هل من المنطقي أكثر أن أنظر إلى SiteSetting.s3_endpoint و SiteSetting.s3_upload_bucket إما بدلاً من الإشارة الحرفية إلى أمازون، أو بالإضافة إليها؟

هل توجد اختبارات للمهام؟ لا أرى أيًا منها. لدي ما قد يكون حلاً بديهيًا، لكن لا توجد طريقة لإضافة اختبارات إلى الاختبارات الحالية، ولا توجد طريقة سهلة للاختبار غير المدمر. وهذا ما يثير قلقي…

index 0761c4712a..63f49155f3 100644
--- a/lib/tasks/uploads.rake
+++ b/lib/tasks/uploads.rake
@@ -129,12 +129,12 @@ def migrate_from_s3
 
   Post
     .where("user_id > 0")
-    .where("raw LIKE '%.s3%.amazonaws.com/%' OR raw LIKE '%(upload://%'")
+    .where("raw LIKE '%.s3%.amazonaws.com/%' OR raw LIKE '%#{SiteSetting.Upload.absolute_base_url}%' OR raw LIKE '%(upload://%'")
     .find_each do |post|
     begin
       updated = false
 
-      post.raw.gsub!(/(\/\/[\w.-]+amazonaws\.com\/(original|optimized)\/([a-z0-9]+\/)+\h{40}([\w.-]+)?)/i) do |url|
+      post.raw.gsub!(/(\/\/[\w.-]+(amazonaws\.com|#{Regexp.quote(SiteSetting.s3_endpoint)})\/(original|optimized)\/([a-z0-9]+\/)+\h{40}([\w.-]+)?)/i) do |url|
         begin
           if filename = guess_filename(url, post.raw)
             file = FileHelper.download("http:#{url}", max_file_size: max_file_size, tmp_file_name: "from_s3", follow_redirect: true)

أيضًا، أتوقع بناءً على الخبرة أنه حتى مع تحسين جميع هذه الصور، سيقوم النظام بالقرار بأنه يحتاج إلى قضاء 10 أيام في إعادة تحسين جميع الصور البالغة 50 جيجابايت (96 جيجابايت من الملفات الإجمالية، الأصلية والمُحسَّنة) أثناء نقلها، مما يؤدي إلى إيقاف جميع إشعارات البريد الإلكتروني لموقعنا بالكامل أثناء ذلك. وبما أنني لا أملك طريقة جيدة للاختبار، فقد اعتقدت أن أسأل عما إذا كان الأمر كذلك؛ وإذا كان كذلك، أود معرفة ما إذا كانت هناك طريقة لتجاوز ذلك؛ أي نسخ الصور المُحسَّنة بالفعل فقط.

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

لم أجربه حتى الآن، لكنه على الأقل مُشارك كطلب سحب (PR) بدلاً من مجرد منشور في الميتا.

العديد من الإصلاحات ذات الصلة الإضافية، والتي تم التحقق منها الآن بواسطة عملية الهجرة الفعلية، في طلب سحب جديد