S3/Spaces からの画像以外のアップロードをローカルへ移行

以下のページを読みました:

そこで lib/tasks/uploads.rake:migrate_from_s3 を確認したところ、以下のような記述がありました:

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

しかし、動画のアップロードでは upload:// という擬似プロトコルが raw フィールドに付与されず、ストレージプロバイダー(私の場合は DigitalOcean Spaces)への実際のリンクとして保存されていることに気づきました。

このタスクを成功させるためには、修正が必要なのは明白です。

Amazon への直接参照に代わる、あるいは追加して、SiteSetting.s3_endpointSiteSetting.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)

また、経験から推測すると、これらの画像はすべて最適化されているにもかかわらず、移動時にすべての 50GB の画像(オリジナルと最適化を合わせた合計 96GB)を再最適化する必要があると判断し、その間、サイト全体のメール通知をすべて無効にしてしまう可能性があります。効果的なテスト方法がないため、そのような仕様かどうかお伺いしたいのですが。もしそうであれば、回避策はあるでしょうか。すでに最適化されている画像をそのままコピーする方法があれば知りたいです。

MinIO Client を使えば、すべてのファイルをローカルシステムに簡単にコピーできます。それらの画像を再最適化することなく、単にファイルを適切な場所に配置し、データベースを新しい場所を指すように変更するのは、どのくらい難しいものか気になります…

現時点ではテストしていませんが、少なくともメタ投稿ではなく PR として共有されています。

実際の移行プロセスで検証された、さらに多くの関連する修正を新しい PR に追加