depois de usar o recurso “rebuild HTML” em alguns posts e ver que ele reparou o post no meu fórum de produção, eu rebakei todos os meus posts usando a tarefa rake.
Fiquei surpreso ao ver que os posts com a imagem quebrada NÃO foram reparados.
Então, experimentei um rebake em um post específico no meu fórum de teste (mesmo backup; mesmos dados) com o comando rails e a tarefa rake, e aqui está o comportamento:
As imagens aparecem por um segundo, mas o post rapidamente volta ao seu estado inicial com imagens quebradas.
No entanto, se eu usar o recurso “rebuild HTML”, ele funciona perfeitamente, e as imagens não voltam a ficar quebradas. Elas são até carregadas corretamente no servidor após alguns minutos.
Então, alguém pode explicar esse fenômeno? Por que o rebake do rails ou de uma tarefa rake tem esse comportamento, e quais são as diferenças entre reconstruir HTML e um rebake da linha de comando?
Capturas de vídeo:
do console rails:
da tarefa rake:
Estou muito intrigado (e ainda tentando reparar minhas imagens em todos os meus posts em lote).
Um exemplo onde usei Rebuild HTML que mostra que as imagens incorporadas neste post foram exibidas corretamente e carregadas automaticamente no servidor (obviamente, o link original, que leva ao casimages, ainda está aqui, mas é o comportamento esperado), dias atrás: Frensh Vw Bus CHERIZET 2019 SK - #13 par buggyderby - Vos sorties - VW Camper
Uma tarefa de rebake do rake em uma postagem aciona um PullHotLinkedImages em 4 minutos e também aumenta instantaneamente a quantidade de tarefas processadas em um, mas não consegui ver nada adicionado à guia da fila.
As poucas postagens nas quais fiz uma reconstrução manual de HTML tiveram suas imagens exibidas perfeitamente por dias (elas também foram baixadas em meu servidor).
<s>Receio não saber por que está funcionando de forma diferente com a chave de administrador versus o console, mas encontrei este tópico com um problema semelhante, e eles conseguiram fazê-lo funcionar reformatando usando a API:<s>
Além de Jay, que teve uma ideia de uma possível diferença entre rebake/rails rebake e rebuild HTML, alguém tem outra ideia?
Uma resposta oficial sobre a(s) diferença(s) entre essas tarefas seria bem-vinda
Se não conseguirmos descobrir, começarei com a API para “reconstruir HTML” de meus 40000 posts contendo problemas potenciais com imagens… E espero que funcione para mim
Ou se houver alguma outra maneira de “reconstruir HTML” usando rails, talvez?
Rake posts:rebake: post.rebake!(**opts) onde opts geralmente está vazio
Para os Oneboxes você pode tentar a tarefa posts:refresh_oneboxes e para as imagens quebradas você pode tentar a tarefa posts:invalidate_broken_images. Esta última pode ser a solução para o seu problema.
Depois de tentar executar um post.rebake!(invalidate_broken_images: true) em todos os meus 40.000 posts que contêm a string [img], funcionou para muitas imagens… Mas longe de todas, apesar de estarem hospedadas no mesmo serviço de hospedagem de imagens externo.
Por exemplo, tenho milhares de links “funcionais” do casimages (que apontam para imagens válidas e exibem imagens na pré-visualização do composer na edição), quebrados na versão “cozida” dos posts, que foram devidamente exibidos e carregados no servidor graças ao meu script, mas também tenho muitos outros onde simplesmente não funcionou, e não sei por quê.
Post.where('raw LIKE ?', '%[img]%').find_each do |p|
p.rebake!(invalidate_broken_images: true)
end
Também tenho links de imagens de outros hospedadores de imagens que foram carregados, e alguns nos quais não funcionou.
Falhei em ver qualquer diferença entre esses posts e links de imagens. Todos eles tinham imagens funcionando, e o fato de usarem o mesmo serviço de hospedagem de imagens me deixou intrigado.
Tentei a operação várias vezes e os resultados foram inconsistentes, independentemente dos serviços de hospedagem externos… Algumas imagens foram carregadas, outras não. Parecia aleatório.
Isso me lembra um pouco o problema que o @Amethi encontrou: Some linked images not displaying/show as broken - #8 by Amethi onde funcionou apenas em algumas imagens sem nenhuma explicação.
Falarei apenas sobre casimages aqui, embora meu fórum importado usasse vários outros hospedadores de imagens.
Então, pensei que talvez o casimages estivesse temporariamente bloqueando meu IP se eu tentasse recuperar muitas imagens de seus servidores. Isso poderia explicar tanto o fato de não ter funcionado para todas as imagens quanto a aleatoriedade do sucesso do carregamento das imagens do meu servidor.
Houve até casos em que a opção Rebuild HTML funcionou - inicialmente apenas -, as imagens foram então exibidas em vez de mostrar um ícone de imagem quebrada, embora ainda estivessem hospedadas em seu serviço de hospedagem externo, mas quando a tarefa Sidekiq “pull external image” foi acionada, ela quebrou as imagens.
O mesmo acontece ao usar scripts rails com rebake!(invalidate_broken_images: true)
Então, estou atualmente tentando uma abordagem mais lenta, onde espero 5 segundos entre cada um dos meus comandos rails rebake!:
total = Post.where('lower(raw) LIKE ?', '%[img]https:%').count
i = 0
Post.where('raw LIKE ?', '%[img]https:%').find_each do |p|
p.rebake!(invalidate_broken_images: true)
print "#{i}/#{total}"
print "\r"
i +=1
sleep(5)
end
Verificarei em ~60 horas se melhorou…
Gostaria de entender os fundamentos do meu problema aqui e por que um rebake “normal” não consegue carregar uma imagem no servidor (se eu não for temporariamente bloqueado pelo casimages).
Note que desta vez, o certificado do servidor do casimages parece OK
Também não entendo o que invalidate_broken_images realmente faz. Não sou muito familiarizado com o código do Discourse.
Olhei o código para ver a ocorrência de invalidate_broken_images e vi estes arquivos:
Por que ele procura especificamente pela string <img>? Meus posts são de um phpBB importado e a versão raw contém apenas o bbCode [img], não tags <img>; então como isso teria um efeito (e teve, veja minha mensagem anterior) nos meus posts?
Também não entendo realmente a diferença entre esses dois métodos (?):
Parece dizer que rebake define os argumentos padrão como false, e que rebake! define o argumento padrão como true.
Como esses dois estão relacionados (estou ciente do propósito do caractere ! em ruby, aliás), e por que eles estão em arquivos diferentes?
Meu objetivo é apenas entender por que minhas imagens externas às vezes são carregadas, às vezes não, e se posso encontrar uma maneira confiável de carregá-las corretamente e automaticamente, mesmo que isso implique carregar uma imagem a cada hora.
Estou nisso há quase duas semanas e isso está me deixando (e as pessoas para quem migrei o servidor) louco.
Além disso, não há nada no log do Discourse, exceto múltiplos Sidekiq is consuming too much memory (using: 592.25M). Note que estou trabalhando no Ubuntu via WSL no Windows 10, mas pretendo usar uma solução funcional (se eu encontrar uma…) em nosso VPS.
Está mais abaixo lá onde você vê o que ele faz na linha 716. Ele exclui essas imagens para que tente baixá-las novamente. (À primeira vista, pelo menos)
Então, estou quase nas minhas 55 horas de refazer meus posts contendo [img] com um atraso de 5 segundos entre cada iteração de meus 40000 posts do meu script rails.
Pelo que vejo, funciona muito melhor do que antes. A maioria das imagens válidas (excluo Imageshack e seu comportamento errático) parece ser carregada em meu fórum sem falhas à primeira vista, pelo menos, mas darei uma olhada mais profunda para ter 100% de certeza. O que é 100% certo é que os resultados são muito, muito melhores e consistentes.
Então, suspeito que o problema que encontrei (e talvez o problema de @Amethi), que era a aleatoriedade no download de imagens remotas com invalidate_broken_images, estava relacionado a uma espécie de limite de taxa de vários provedores de hospedagem de imagens…? O estranho é que não notei nenhum problema com meus outros fóruns importados…
Dito isso, se os resultados forem satisfatórios o suficiente e o atraso realmente melhorar o download de imagens remotas, farei o mesmo método em meu fórum de produção, mas aumentarei o tempo entre cada post refazido de 5 segundos para 10 ou 15 segundos (ou até mais, não estamos com pressa, estes são todos posts bem antigos e o VPS tem especificações muito mais baixas do que meu próprio computador).
Não quero ser conclusivo muito rápido, mas a solução para meu problema inicial poderia ser aplicar tanto a solução proposta por Richard QUANTO adicionar um atraso entre cada refazimento de post.