Migrando uploads não-imagens do S3/spaces para local

Li a seguinte página:

Então, examinei lib/tasks/uploads.rake:migrate_from_s3 e encontrei:

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

No entanto, notei que os uploads de vídeo não recebem o pseudo-protocolo upload:// literal, mas sim acabam como links literais para o provedor de armazenamento (no meu caso, o DigitalOcean Spaces).

Parece óbvio que terei que modificar essa tarefa para que ela funcione.

Faria mais sentido verificar SiteSetting.s3_endpoint e SiteSetting.s3_upload_bucket em vez de, ou além da, referência literal à Amazon?

Existem testes para as tarefas? Não vejo nenhum. Tenho o que pode ser algo como a correção óbvia, mas sem como aprimorar os testes existentes e sem uma maneira fácil de testar de forma não destrutiva. Isso me deixa preocupado…

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)

Além disso, pela experiência, espero que, mesmo que todas essas imagens já tenham sido otimizadas, o sistema decida que precisa gastar 10 dias reotimizando todos os 50 GB de imagens (96 GB de arquivos no total, originais + otimizadas) enquanto as move, desativando todas as notificações por e-mail do nosso site inteiro durante o processo. Como não tenho uma boa maneira de testar, achei por bem perguntar se é esse o caso; se for, gostaria de saber se há uma maneira de contornar isso, ou seja, apenas copiar as imagens já otimizadas.

Posso copiar facilmente todos os arquivos para o sistema local usando o MinIO Client. Estou curioso sobre o quão difícil seria simplesmente colocar os arquivos no lugar certo e modificar o banco de dados para apontar para o novo local, sem reotimizar todas essas imagens…

Ainda não testei, mas pelo menos foi compartilhado como um PR em vez de apenas um post no meta.

Muitas outras correções relacionadas, agora validadas pelo processo real de migração, em um novo PR