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…