Avatares ausentes após importação

Tenho uma importação do vBulletin para um cliente hospedado. Os avatares desapareceram e agora aparecem como uma figura genérica de pessoa em branco, como esta.

Tenho quase certeza de que eles estavam presentes em algum momento. Os URLs parecem indicar que deveriam ter algum conteúdo. Existe alguma maneira de eu encontrá-los?

Maybe related to that?

Do you have a backup where you can check the URL?
Are they in the tombstone?

I did a fresh import and all of the avatars are missing. Sidekiq still has 13M things to process, but I don’t see how that could be the problem. I did another import on another site with what I believe to be the same import script and the avatars are fine there.

pry(main)> User.find_by_username('MysteryManAvatar').uploaded_avatar
=> #<Upload:0x0000558a0d31b478
 id: 97,
 user_id: 114,
 original_filename: "clevername.jpg",
 filesize: 2028,
 width: 90,
 height: 67,
 url: "/uploads/default/original/1X/080817dcf59ddc838054fba9716b62fce9ae3d83.jpg",
 created_at: Thu, 19 Apr 2018 23:51:15 UTC +00:00,
 updated_at: Thu, 19 Apr 2018 23:51:15 UTC +00:00,
 sha1: "080817dcf59ddc838054fba9716b62fce9ae3d83",
 origin: nil,
 retain_hours: nil,
 extension: "jpg">

But that file isn’t in uploads (or tombstone).

I looked at Avatars not showing after import and that didn’t seem to be related.

Fiz a restauração do banco de dados a partir de um backup (havia algumas migrações do banco de dados de uma versão antiga e o backup.sql.gz incluía apenas SQL, não os uploads).

Infelizmente, os avatares não estão aparecendo no site… (apenas o placeholder padrão).

Eles parecem estar corretos no banco de dados, a URL está correta e o arquivo PNG existe:

root@og-app:/var/www/discourse# rails c
[1] pry(main)> User.find_by_username('Overgrow').uploaded_avatar
=> #<Upload:0x0000565323a78880
 id: 2936,
 user_id: 1,
 original_filename: "avatar.png",
 filesize: 161585,
 width: nil,
 height: nil,
 url:     "/uploads/default/original/2X/f/fbba12aa89b1bc45676efcfa55affd4b7a76edf1.png",
 created_at: Sat, 03 Sep 2016 10:26:23 UTC +00:00,
 updated_at: Sat, 22 Feb 2020 11:57:35 UTC +00:00,
 sha1: "fbbe22aa89b1bc45676efcfa55affd4b7a76edf1",
 origin: nil,
 retain_hours: nil,
 extension: "unknown",
 thumbnail_width: nil,
 thumbnail_height: nil,
 etag: nil,
 secure: false,
 access_control_post_id: nil,
 original_sha1: nil>

Pode me orientar sobre o que tentar a seguir? Obrigado antecipadamente!

Atualização:

Alguns avatares foram regenerados em segundo plano… Posso acelerar o processo? Ou executá-lo manualmente?

Pelas minhas observações, essa parte pode ser um sinal do problema?

extension: "unknown",

Parece que os regenerados agora têm esse campo preenchido:

extension: "JPG",

De alguma forma, após a restauração do backup e a migração do Discourse da versão 1.6 para a 2.5, minha base de dados estava sem os valores de width, height e extension na tabela Upload (os ponteiros de arquivo estavam corretos e os arquivos no lugar).

Acabei criando um script que percorre todos os avatares personalizados carregados, corrige a extensão, as dimensões e regenera todas as OptimizedImages com miniaturas da versão 2, que eu não tinha.

Para quem se interessar, aqui está:

fix-avatars.rb

require File.expand_path("../../config/environment", __FILE__)

generated_count = 0

scope = UserAvatar.where("custom_upload_id > 0")

scope.find_each do |ua|

  upload_id = ua.custom_upload_id

  upload = Upload.find_by(id: upload_id)
  
  unless upload
    puts "\nnenhum upload encontrado para este avatar de usuário"
    next
  end
  
  # corrigir desconhecido
  if upload.extension === 'unknown'
    upload.extension = nil 
    upload.save!
    puts "\rupload_id #{upload.id} extensão unknown -> nil"
  end

  if upload.extension.nil?
    puts "\rupload_id #{upload.id} corrigindo extensão"

    upload.fix_image_extension

    if upload.height == 0 || upload.width == 0
      puts "\rupload_id #{upload.id} corrigindo dimensões"
      upload.fix_dimensions!
    end

    # verificar versão otimizada
    correct_optimized = OptimizedImage.where(upload_id: upload_id)
      .where(version: 2)

    if correct_optimized.count < 1
      puts "\rupload_id #{upload.id} não possui miniaturas da versão 2"

      # destruir otimizados antigos
      puts "\rupload_id #{upload.id} excluindo avatares"
      optimized = OptimizedImage.where(upload_id: upload_id)

      if optimized
        optimized.destroy_all
      end

      # gerar otimizados
      puts "\rupload_id #{upload.id} criando avatares"
      Discourse.avatar_sizes.each {|size| OptimizedImage.create_for(upload, size, size, allow_animation: SiteSetting.allow_animated_avatars)}

      generated_count += 1

      puts "\rGerados #{generated_count} avatares no total"

    end
  end

end