Миграция не-изображений из 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 — либо вместо ссылки на Amazon, либо в дополнение к ней?

Есть ли тесты для этих задач? Я их не вижу. У меня есть решение, которое, возможно, является очевидным исправлением, но у меня нет возможности дополнить существующие тесты, и нет простого способа провести тестирование без разрушения данных. Это вызывает у меня беспокойство…

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), а не просто как пост в метадискуссию.

Множество дополнительных связанных исправлений, теперь подтверждённых реальным процессом миграции, в новом PR