ToS3MigrationError: uploads não migrados para S3, resultando em anexos corrompidos. Como corrigir este erro?

FileStore::ToS3MigrationError: 182 de 21512 uploads não foram migrados para o S3. A migração para o S3 falhou no banco de dados ‘default’.

em seguida, um rastreamento de pilha de ‘raise_or_log’, ‘migration_successful?’, ‘migrate_to_s3’, ‘migrate’, ‘block in migrate_to_s3_all_sites’

Encontrei esses erros duas vezes ao executar a tarefa uploads:migrate_to_s3. Cerca de 1% dos arquivos não foram migrados com sucesso, resultando em anexos quebrados no site após uma rebake. Todos parecem ser arquivos mais antigos, dos primeiros meses após a criação desta instância do Discourse.

Ao investigar o bucket do S3, os arquivos parecem ter sido carregados com sucesso para o S3; eles apenas não estão vinculados corretamente após a rebake.


Reexecutar a migração (antes de outra rebake) parece ter resolvido o problema por algum motivo. O mesmo erro ainda ocorre durante a tarefa migrate_to_s3.

No entanto, se eu executar a rebake novamente, os links dos anexos voltam a quebrar.

Acho que esses não são erros, mas incluirei a saída durante a rebake:

/var/www/discourse/lib/file_store/base_store.rb:6: warning: already initialized constant FileStore::BaseStore::UPLOAD_PATH_REGEX
/var/www/discourse/lib/file_store/base_store.rb:6: warning: previously definition of UPLOAD_PATH_REGEX was here
/var/www/discourse/lib/file_store/base_store.rb:7: warning: already initialized constant FileStore::BaseStore::OPTIMIZED_IMAGE_PATH_REGEX
/var/www/discourse/lib/file_store/base_store.rb:7: warning: previous definition of OPTIMIZED_IMAGE_PATH_REGEX was here

Executar rake posts:missing_uploads ou PostCustomField.where(name: Post::MISSING_UPLOADS) não revela nenhum problema, então isso parece não estar relacionado.

Meu problema pode estar relacionado a esta questão: Migrate_to_S3 Fails on Rebake - #12 by evenif

Vou ver o que descubro e talvez fechar isso e mover a conversa para lá.

Os anexos/carregamentos antigos e quebrados aparecem como
[{nome do arquivo}|attachment](/uploads/default/original/2X/6/{hash sha1 + extensão}) no texto bruto da postagem. Isso é processado como href="/uploads/default/original/2X/6/{hash sha1 + extensão}", o que quebra os anexos de arquivo, mas não as imagens.

Posteriormente, anexos funcionais aparecem como [{nome do arquivo}|attachment](upload://{sha1 para base62 + extensão}) e são processados como href="/uploads/short-url/{sha1 para base62 + extensão}.

Escrevi um pequeno código em Ruby para percorrer todas as postagens no período problemático conhecido e substituir todas as URLs de carregamento antigas pela versão mais recente. Utilizei a função base62_sha1 do modelo Upload para converter o hash sha1 no nome de arquivo esperado que as URLs curtas do Discourse aguardam.

Isso fez com que os anexos funcionassem. Em seguida, executei outro rebake apenas para confirmar a correção, e parece que ainda está funcionando. Parece que o problema residia apenas em Post.raw e não tinha nada a ver com Upload.