Não é possível migrar uploads para S3

Olá, configuramos o upload de hospedagem (usando as configurações do S3) no Backblaze.
Novos uploads estão funcionando (após a correção do cabeçalho x-amz-checksum-crc32), no entanto, tentar migrar uploads existentes com uploads:migrate_to_s3 falha imediatamente.

Isso está na versão mais recente do Discourse (3.5.0.beta5-dev).
Aqui está a saída completa:

root@goactuary-app:/var/www/discourse# rake uploads:migrate_to_s3 --trace
** Invoke uploads:migrate_to_s3 (first_time)
** Invoke environment (first_time)
** Execute environment
** Execute uploads:migrate_to_s3
Por favor, note que a migração para S3 atualmente não é reversível!
[CTRL+c] para cancelar, [ENTER] para continuar

Migrating uploads to S3 for 'default'...
Alguns uploads não foram migrados para o novo esquema. Executando a migração, isso pode levar algum tempo...
rake aborted!
FileStore::ToS3MigrationError: Alguns uploads não puderam ser migrados para o novo esquema. Você precisa corrigir isso manualmente. (FileStore::ToS3MigrationError)
/var/www/discourse/lib/file_store/to_s3_migration.rb:156:in `migrate_to_s3'
/var/www/discourse/lib/file_store/to_s3_migration.rb:59:in `migrate'
/var/www/discourse/lib/tasks/uploads.rake:126:in `migrate_to_s3'
/var/www/discourse/lib/tasks/uploads.rake:106:in `block in migrate_to_s3_all_sites'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rails_multisite-6.1.0/lib/rails_multisite/connection_management/null_instance.rb:49:in `with_connection'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rails_multisite-6.1.0/lib/rails_multisite/connection_management/null_instance.rb:36:in `each_connection'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rails_multisite-6.1.0/lib/rails_multisite/connection_management.rb:21:in `each_connection'
/var/www/discourse/lib/tasks/uploads.rake:104:in `migrate_to_s3_all_sites'
/var/www/discourse/lib/tasks/uploads.rake:100:in `block in <main>'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/task.rb:281:in `block in execute'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/task.rb:281:in `each'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/task.rb:281:in `execute'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/task.rb:219:in `block in invoke_with_call_chain'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/task.rb:199:in `synchronize'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/task.rb:199:in `invoke_with_call_chain'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/task.rb:188:in `invoke'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/application.rb:188:in `invoke_task'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/application.rb:138:in `block (2 levels) in top_level'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/application.rb:138:in `each'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/application.rb:138:in `block in top_level'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/application.rb:147:in `run_with_threads'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/application.rb:132:in `top_level'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/application.rb:83:in `block in run'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/application.rb:214:in `standard_exception_handling'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/application.rb:80:in `run'
bin/rake:13:in `<top (required)>'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/cli/exec.rb:59:in `load'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/cli/exec.rb:59:in `kernel_load'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/cli/exec.rb:23:in `run'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/cli.rb:452:in `exec'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/vendor/thor/lib/thor/command.rb:28:in `run'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/vendor/thor/lib/thor/invocation.rb:127:in `invoke_command'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/vendor/thor/lib/thor.rb:538:in `dispatch'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/cli.rb:35:in `dispatch'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/vendor/thor/lib/thor/base.rb:584:in `start'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/cli.rb:29:in `start'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/exe/bundle:28:in `block in <top (required)>'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/friendly_errors.rb:117:in `with_friendly_errors'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/exe/bundle:20:in `<top (required)>'
/usr/local/bin/bundle:25:in `load'
/usr/local/bin/bundle:25:in `<main>'
Tasks: TOP => uploads:migrate_to_s3

Você precisa colocá-las em seu app.yml conforme descrito em Configurar um provedor de armazenamento de objetos compatível com S3 para uploads

Você quer dizer que adicionou código ao seu app.yml para reverter a biblioteca aws para uma versão que funcione com o backblaze?

2 curtidas

Sim, eles estão no app.yml e eu reconstruí o aplicativo.
Confirmei que os arquivos recém-carregados estão indo para lá.

Não exatamente. Estou usando as seguintes variáveis ambientais:

  AWS_REQUEST_CHECKSUM_CALCULATION: WHEN_REQUIRED
  AWS_RESPONSE_CHECKSUM_VALIDATION: WHEN_REQUIRED

Esses corrigiram a impossibilidade de fazer upload de novos arquivos após a alteração das configurações.

Você provavelmente precisará rastreá-los sozinho.

No rails você pode

 Upload.pluck(:url)

E então procurar quais uploads são o problema.

Acho que, pela minha experiência, isso não foi suficiente, mas você diz que está funcionando para você.

2 curtidas

Fazer o downgrade manual dos gems do aws no contêiner fez com que o job uploads:migrate_to_s3 realmente fizesse o upload das imagens, então aparentemente as variáveis de ambiente não foram suficientes, como você apontou.

No entanto, o processo falhou mais tarde em um ponto diferente:

FileStore::ToS3MigrationError: 2 posts não foram remapeados para a nova URL de upload do S3. A migração do S3 falhou para o db 'default'. (FileStore::ToS3MigrationError)

Essa será uma aventura de solução de problemas separada.

1 curtida

Isso pode ser porque você tem caixas fazendo referência a posts locais. Criei um tópico sobre isso, mas não me lembro dos detalhes.

Se forem apenas 2, você pode ignorá-las, mas no Rails você pode encontrar todos os uploads que não contêm seu novo bucket. Acho que estará vazio?

Acho que o problema é que você tem duas postagens com um caminho inesperado na postagem cozida.

Eu encontrei!
Não é possível restaurar um backup se ele incluir link para o Discourse onebox

Editar: então acho que você tem duas postagens com caixas locais. Acho que você só precisa encontrar e refazer essas postagens.

1 curtida

@stanski isso resolveu seu problema?

1 curtida

Desculpe, me distraí e esqueci de atualizar isso.
Depois de refazer todos os posts, recebi uma mensagem de erro diferente ao tentar a migração novamente.
Infelizmente, não consigo mais encontrar o rastreamento (backtrace).

Percebi que, apesar do erro, parecia que os uploads foram migrados para o Backblaze e os posts atualizados.
Arquivei os uploads locais e os movi para outro lugar e não ouvi nenhuma reclamação desde então.

Então, em conclusão, sim, meu problema foi resolvido.
Obrigado a @pfaffman pelas sugestões contínuas.

Agora tenho uma reclamação de que vários firewalls estão bloqueando uploads hospedados no Backblaze, mas isso é outra questão.

Você realmente quer usar um cdn, eu acho.

1 curtida