Ao acessar meu site, às vezes recebo uma série de erros 500 em todos os arquivos JavaScript, geralmente no primeiro carregamento da página (mesmo que os arquivos estejam ou devam estar em cache). Às vezes, eles exibem NS_ERROR_CORRUPTED_CONTENT.
Meu tema está carregando normalmente (o fundo foi removido para melhor visibilidade), mas além disso, não deveria haver nada causando isso. O problema é resolvido aguardando 30 segundos e recarregando a página.
Meu site está atualizado com o penúltimo commit (dois commits atrás) e não há nada de estranho nos logs. Meu cluster de disco está saudável. O que está causando isso e como posso corrigir?
Minha primeira suposição era que se tratava de um problema de otimização da Cloudflare — certifique-se de que o Rocket Launcher esteja desativado (provavelmente já está, mas vale a pena verificar).
Além disso, acho que você pode querer configurar o armazenamento de objetos do bucket S3 usando o Cloudflare R2 se quiser continuar usando o hardware que está utilizando.
Você mencionou em nossa conversa que está usando alguns SSDs antigos doados que instalou pouco antes desse problema começar, o que é uma pista clara: o firmware da Dell indica que eles estão com defeito, mas o smartctl mostra como OK. Acredito que o firmware da Dell esteja piscando em laranja porque detecta latência alta e respostas de E/S erráticas ou firmware não suportado. O Discourse solicita que as unidades leiam dezenas de arquivos JavaScript compilados todos ao mesmo tempo, e SSDs antigos e não suportados podem ter dificuldades para lidar com essa repentina carga de E/S. O controlador de armazenamento trava ao tentar obter os dados, expirando após exatamente 30 segundos — um tempo limite padrão comum para dispositivos SCSI/de bloco.
Como as unidades ficam travadas por 30 segundos, o Discourse (Rails/nginx) falha ou expira ao tentar buscar os arquivos e gera um erro 500. A Cloudflare provavelmente está capturando os erros 500 e aplicando os cabeçalhos incorretos, passando-os ao navegador, o que causa o NS_ERROR_CORRUPTED_CONTENT que você está vendo.
Substitua esses SSDs ou, se for necessário usá-los, utilize um bucket de armazenamento de objetos para descarregar os ativos e uploads do Discourse — você pode usar o Cloudflare R2, que é compatível com S3 na camada gratuita (eu tenho isso e funciona bem). Assim, seu servidor não precisará ler milhares de pequenos arquivos desses SSDs defeituosos, pois o gargalo de hardware para ativos da web será contornado.
Isso não era algo que eu sabia antes e definitivamente explicaria o problema. Todos os manuais do servidor, em todos os lugares, dizem que um LED laranja piscante significa que a unidade está 100% morta, mas, se essas unidades estiverem apresentando tempos limite de E/S ou se comportando de maneira estranha, faz sentido para mim que o Discurso retorne o código de erro 500.
Sou muito contra assinaturas e, a longo prazo, provavelmente faz sentido para mim dar o passo e comprar novos SSDs assim que ficarem acessíveis novamente. Se eu gastasse 150 dólares em alguns SSDs novos para este servidor que eu possuo para sempre, eu preferiria muito fazer isso do que pagar 5 dólares por mês ao Cloudflare para o resto da eternidade. Se for gratuito (como você diz que é), posso considerar isso como uma alternativa temporária enquanto espero que essa bolha de IA estoure