Migración de cargas no imágenes de S3/spaces a local

He leído la siguiente página:

Así que revisé lib/tasks/uploads.rake:migrate_from_s3 y encontré:

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

Sin embargo, he notado que las subidas de video no reciben el pseudo-protocolo upload:// literal, sino que simplemente terminan como enlaces literales al proveedor de almacenamiento (en mi caso, DigitalOcean Spaces).

Parece obvio que tendré que modificar esta tarea para que funcione.

¿Tendría más sentido consultar SiteSetting.s3_endpoint y SiteSetting.s3_upload_bucket, ya sea en lugar de o además de la referencia literal a Amazon?

¿Hay pruebas para las tareas? No veo ninguna. Tengo algo que podría ser la solución obvia, pero no hay forma de ampliar las pruebas existentes ni una manera sencilla de probar sin destruir nada. Eso me preocupa…

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)

Además, por experiencia, espero que, aunque todas estas imágenes ya estén optimizadas, el sistema decida que necesita pasar 10 días reoptimizando las 50 GB de imágenes (96 GB de archivos en total, originales y optimizados) mientras las mueve, desactivando todas las notificaciones por correo electrónico de todo nuestro sitio durante ese proceso. Como no tengo una buena forma de probar, pensé en preguntar si es así; si lo es, me gustaría saber si hay una manera de evitarlo; es decir, simplemente copiar las imágenes ya optimizadas.

Puedo copiar fácilmente todos los archivos al sistema local usando MinIO Client. Me pregunto qué tan difícil sería simplemente colocar los archivos en su sitio y modificar la base de datos para que apunte a la nueva ubicación, sin reoptimizar todas esas imágenes…

Aún no lo he probado, pero al menos se comparte como una PR en lugar de solo un post en meta.

Muchas más correcciones relacionadas, ahora validadas por el proceso real de migración, en una nueva PR