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…