Migrate_to_s3 falha

Estou tentando mover uploads para o S3 em um site relativamente movimentado.
Tudo corre como planejado, exceto quando executo rake uploads:migrate_to_s3, recebo o seguinte erro:

Atualizando os URLs no banco de dados...
Removendo imagens otimizadas antigas...
Marcando todos os posts contendo lightboxes para reprocessamento...
2023 posts foram marcados para reprocessamento
rake abortou!
FileStore::ToS3MigrationError: 1 de 9629 uploads não foram migrados para S3. A migração para S3 falhou para o banco de dados 'default'.
/var/www/discourse/lib/file_store/to_s3_migration.rb:132:in `raise_or_log'
/var/www/discourse/lib/file_store/to_s3_migration.rb:79:in `migration_successful?'
/var/www/discourse/lib/file_store/to_s3_migration.rb:373:in `migrate_to_s3'
/var/www/discourse/lib/file_store/to_s3_migration.rb:66:in `migrate'
/var/www/discourse/lib/tasks/uploads.rake:123:in `migrate_to_s3'
/var/www/discourse/lib/tasks/uploads.rake:102:in `block in migrate_to_s3_all_sites'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rails_multisite-4.0.0/lib/rails_multisite/connection_management.rb:80:in `with_connection'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rails_multisite-4.0.0/lib/rails_multisite/connection_management.rb:90:in `each_connection'
/var/www/discourse/lib/tasks/uploads.rake:100:in `migrate_to_s3_all_sites'
/var/www/discourse/lib/tasks/uploads.rake:96:in `block in <main>'
/usr/local/bin/bundle:23:in `load'
/usr/local/bin/bundle:23:in `<main>'
Tasks: TOP => uploads:migrate_to_s3
(Veja o rastreamento completo executando a tarefa com --trace)

Esta linha em particular chamou minha atenção: FileStore::ToS3MigrationError: 1 de 9629 uploads não foram migrados para S3. A migração para S3 falhou para o banco de dados 'default'.

Estou assumindo que isso significa que há um arquivo problemático que está fazendo com que toda a tarefa rake falhe? Existe uma maneira de descobrir qual arquivo está causando o problema e talvez removê-lo para que o restante da tarefa seja concluído sem problemas?

1 curtida

Alguma Atualização:
O site parece estar carregando normalmente e, pelo que posso ver, as imagens carregadas estão sendo servidas da CDN.
A cópia local de todos os uploads ainda existe no servidor. Presumo que isso ocorra porque a migração está marcada como falha.
Aqui está uma saída do comando rake uploads:s3_migration_status se isso for útil de alguma forma?

# rake uploads:s3_migration_status
1 de 9630 uploads não foram migrados para S3. A migração para S3 falhou para o banco de dados 'default'.
19 posts não foram remapeados para a nova URL de upload do S3. A migração para S3 falhou para o banco de dados 'default'.
Nenhum post requer re-bake.
O site não está pronto para migração.

Você pode encontrar uma referência a qual arquivo falhou em Admin > Logs > Registros de Erro

Se isso não ajudar, acho que pesquisar no banco de dados por posts com cooked que contenham yourdomain/uploads/ listará os 19 posts mencionados no status da migração. Na pior das hipóteses, você pode examiná-los manualmente e comparar quaisquer uploads com o que está no S3.

Algo como:

rails c
Post.where("cooked like '%discourse.example.com/uploads/%'")
1 curtida

Olá @Simon_Manning

Tentei suas sugestões, infelizmente, não tive sorte em encontrar nada relevante nos logs de erro. Vejo uma entrada como
Falha ao otimizar imagem: motivo desconhecido, mas ela não me dá mais informações do que o que diz.

Também tentei sua consulta sugerida, obtenho um monte de posts como resultado, mas ao visitar esses posts, eles contêm um monte de miniaturas de pré-visualizações do onebox. quando tento abrir a imagem em uma nova aba nessas miniaturas, elas parecem estar carregando do CDN.

Eu acho que esperaria ver algo assim para 18 dessas 19 postagens, talvez até todas as 19 se o upload que falhou acontecer em uma postagem com vários uploads.

O que pode ser mais fácil é extrair todos os nomes de arquivo do resultado da consulta (por exemplo, f8a2d9381889b8693db2777acac566bd7b134fa5.png) e procurá-los no S3. Em teoria, exatamente um deve estar faltando. Ignore os derivados, apenas procure aqueles com /originals/ no caminho.

Um pouco tedioso, mas não deve demorar muito se essa consulta selecionou apenas essas 19 postagens.

2 curtidas

Então encontrei o culpado, como devo proceder?

O que me parece lógico pode não ser a melhor saída.
Aqui estão as opções que vejo:

  1. Remover a referência do arquivo da postagem em questão
  2. Excluir o arquivo do servidor
  3. Remapear o link do arquivo para algo genérico

Ou talvez eu esteja pensando totalmente errado?

Se não houver uma solução óbvia para que ele seja carregado com sucesso, qualquer uma das opções 1 ou 3 parece ser uma boa maneira de prosseguir. A opção 2 eu provavelmente deixaria para o Discourse, especificamente a tarefa de limpar uploads órfãos, cujo intervalo é controlado pela configuração clean orphan uploads grace period hours.

Pode ser uma boa ideia pegar o arquivo antes que ele seja excluído, no entanto. Se ele não contiver dados sensíveis, pode ser útil para testar por que ele não pode ser carregado durante a migração.

Algo mais que você pode tentar depois de ter removido o arquivo e concluído a migração (e ter baixado o arquivo com falha) é editar a postagem novamente para recolocar o arquivo. Seria interessante saber se ele falha ao fazer o upload para o S3 inteiramente ou apenas durante a tarefa de migração.

Recebi o mesmo erro, em 64 postagens. Impossível encontrá-las em 80.000 arquivos…

O que aconteceria se eu excluísse os arquivos locais (a maioria já foi migrada)?

Confirmo que os arquivos foram migrados, mas recebi o mesmo erro.

Alguma sugestão? Uploads estão no s3 e funcionam bem, mas a tarefa: migrar para s3 falha.

Se você não se importar em perder esses 64 arquivos, o que eu fiz quando essa mesma tarefa do rake continuou falhando para mim foi editá-la e fazer com que ela desse erro apenas se houvesse 100 erros em vez de 1.

Para mim, tudo bem.
O que devo fazer para editar a tarefa?

Você pode primeiro tentar executá-lo com: SKIP_FAILED=1 rake uploads:migrate_to_s3.

Se isso não funcionar, edite esta linha aqui e tente novamente

Tried with SKIP_FAILED=100 rake uploads:migrate_to_s3

=> 0 arquivos

  • Listando arquivos S3
    … .. => 81070 arquivos
  • Sincronizando arquivos para S3

Atualizando os URLs no banco de dados…
Removendo imagens otimizadas antigas…
Marcando todos os posts contendo lightboxes para re-bake…
54453 posts foram marcados para re-bake
53 posts não foram remapeados para a nova URL de upload S3. A migração S3 falhou para o banco de dados ‘default’.

Não entendi como colocar o arquivo modificado no meu script do Discourse

Talvez eu tenha entendido mal, mas acho que você precisa executar SKIP_FAILED=1 para ativar o SKIP_FAILED, em vez de atribuir um valor.

1 curtida

Tentei com este comando. … o mesmo
Resultado

Ah, que pena. Há outra sugestão do @Falco de editar a tarefa do rake - mas infelizmente não sei como fazer isso, e não consigo encontrar nenhuma instrução quando pesquiso. :slightly_smiling_face:

Espero que outra pessoa possa ajudar? :crossed_fingers:

1 curtida

Consegui criar meu myscript.rb na minha pasta /shared, mas não consigo executá-lo.

Alguma outra sugestão? @vulkanino Notei que você teve um problema semelhante