Al visitar mi sitio, a veces obtengo una serie de errores 500 en todos los archivos JavaScript, generalmente en la primera carga de la página (incluso si los archivos están, o deberían estar, en caché). A veces indican NS_ERROR_CORRUPTED_CONTENT.
Mi tema se carga correctamente (el fondo se eliminó para mayor visibilidad), pero aparte de eso, no debería haber nada que cause esto. Se soluciona esperando 30 segundos y recargando.
Mi sitio está actualizado con el penúltimo commit (2 commits detrás) y no hay nada inusual en los registros. Mi clúster de discos está sano. ¿Qué está causando esto y cómo puedo solucionarlo?
Mi primera suposición fue que se trataba de un problema de optimización de Cloudflare: asegúrate de que Rocket Launcher esté desactivado (probablemente ya lo esté, pero vale la pena comprobarlo).
Además, creo que podrías querer configurar el almacenamiento de objetos del bucket S3 utilizando Cloudflare R2 si deseas continuar usando el hardware que estás utilizando actualmente.
Mencionaste en nuestra conversación que estás usando algunos SSDs antiguos donados que instalaste poco antes de que empezara a ocurrir este problema, lo cual es una pista contundente: el firmware de Dell indica que están defectuosos, pero smartctl los muestra como correctos. Creo que el firmware de Dell parpadea en naranja porque detecta una alta latencia y respuestas de E/S erráticas, o un firmware no compatible. Discourse solicita a los discos que lean decenas de archivos de JavaScript compilados todos al mismo tiempo, y los SSDs antiguos no compatibles pueden saturarse bajo esta repentina ráfaga de E/S. El controlador de almacenamiento se cuelga intentando obtener los datos, agotándose el tiempo de espera después de exactamente 30 segundos, que es un tiempo de espera predeterminado común para dispositivos SCSI/de bloque.
Dado que los discos se cuelgan durante 30 segundos, Discourse (Rails/nginx) se bloquea o agota el tiempo de espera al intentar obtener los archivos y genera un error 500. Cloudflare probablemente esté capturando estos errores 500 y aplicando las cabeceras incorrectas, pasando la información al navegador, lo que provoca el NS_ERROR_CORRUPTED_CONTENT que estás viendo.
Reemplaza esos SSDs, o si debes usarlos, entonces utiliza un bucket de almacenamiento de objetos para descargar los activos y las subidas de Discourse; puedes usar Cloudflare R2, que es compatible con S3 y tiene un plan gratuito (yo lo tengo y funciona bien). Así, tu servidor no necesitará leer miles de archivos pequeños desde esos SSDs defectuosos, ya que evitará el cuello de botella del hardware para los activos web.
Esto es algo que no sabía antes y definitivamente lo explicaría. Cada manual del servidor que he visto indica que un LED naranja parpadeante significa que la unidad está 100% muerta, pero si estas unidades están generando tiempos de espera I/O o se comportan de manera extraña, me parece lógico que Discourse devuelva el código de error 500.
Soy muy contrario a las suscripciones y, a largo plazo, probablemente tenga sentido que me decida y compre nuevas SSD cuando sean más asequibles. Si gastara 150 dólares en algunas SSD nuevas para este servidor que poseo para siempre, preferiría hacer eso a pagar a Cloudflare 5 dólares al mes por el resto de la eternidad. Si es gratuito (como dices que lo es), podría considerar esta opción como una alternativa temporal mientras espero a que esta burbuja de la IA estalle