Presentamos activos JS precompilados para autoalojadores

:mega: Discourse ahora publica activos de JavaScript precompilados, lo que acelerará significativamente la instalación y las actualizaciones, especialmente para servidores con recursos limitados.


Compilar y optimizar los activos de JavaScript siempre ha sido una de las partes que más recursos consume al ejecutar Discourse. A medida que nuestra base de código y el ecosistema de JavaScript han evolucionado, este proceso se ha vuelto aún más exigente.

En nuestras pruebas, estos cambios reducen el tiempo de compilación de activos en una instancia de Digital Ocean con 1 GB de RAM de 45 minutos a solo 3 minutos.

¿Cómo funciona?

En cada confirmación fusionada en main, un flujo de trabajo de GitHub Actions compila y empaqueta los activos en archivos .tar.gz (uno para producción, uno para desarrollo). Estos paquetes se publican a través de lanzamientos de GitHub en un repositorio dedicado. Nos aseguramos de que los activos se publiquen antes de que cualquier confirmación pase a tests-passed.

Al compilar su propio sitio, Discourse ahora verifica si existe un paquete precompilado coincidente y lo descarga. Luego, los complementos se compilan sobre él. Si no se encuentra ningún paquete o hay un error, Discourse recurre a la compilación desde el código fuente.

¿Esto afecta a los usuarios finales?

No. Los activos todavía se sirven a los usuarios finales desde su propio servidor / CDN.

¿Puedo optar por no participar?

¡Sí! Si prefiere compilar sus propios activos y tiene un servidor lo suficientemente potente, establezca DISCOURSE_DOWNLOAD_PRE_BUILT_ASSETS: 0 en su archivo app.yml.

¿Qué pasa si estoy ejecutando una versión bifurcada o parcheada de Discourse?

Los paquetes de activos se nombran por el hash de la confirmación. Si está ejecutando una bifurcación, no se encontrará ningún paquete y los activos se compilarán desde el código fuente. Si su copia de Discourse está parcheada (es decir, el árbol de trabajo de git no está limpio), Discourse no intentará descargar un paquete.

¿Qué pasa con otros pasos de compilación relacionados con activos?

Actualmente, esta optimización se aplica solo a los activos de JS principales. En el futuro, podemos expandirla a algunos complementos y otros pasos como la compresión gz/brotli.

¿Qué pasa con la rama estable?

Los activos precompilados para la rama estable se publicarán a partir de la próxima actualización importante de la versión, prevista para agosto de 2025.

54 Me gusta

Acabo de reconstruir https://discourse-on-a-pi5.falco.dev/ y tardó solo 3 minutos y 35 segundos. ¡Esto es muy impresionante!

23 Me gusta

Configuración de dos contenedores y sin base de datos ~8 minutos.

5 Me gusta

¡Vaya! :scream: :person_bowing:

No tengo esta opción en mi configuración, ¿necesito agregarla con el valor 1 para poder participar? ¿O todo esto sucederá mágicamente la próxima vez que actualice?

FYI esto es lo que sucede cuando tu instalación no cumple los criterios:

I, [2025-08-01T06:43:09.560655 #1]  INFO -- : cd /var/www/discourse & su discourse -c 'bundle exec rake assets:precompile:build'
[assemble_ember_build] El límite de heap de Node.js es inferior a 2048 MB. Estableciendo --max-old-space-size=2048 y CHEAP_SOURCE_MAPS=1
[assemble_ember_build] No se encontró ningún archivo de información de compilación existente.
[assemble_ember_build] El directorio de trabajo de Git no está limpio. No se pueden descargar activos precompilados.
[assemble_ember_build] Ejecutando compilación central completa...

Estoy haciendo algunos ajustes en config/initializers/100-sidekiq.rb en app.yml para añadir soporte para un recuento de reintentos en todos los trabajos de sidekiq (que supongo que es la única forma de lograr esto y no dentro de un plugin. Pero podría revisarlo) así que creo que esto es suficiente para no cumplir los criterios…

2 Me gusta

Está habilitado por defecto. Solo necesitas especificar la configuración si quieres desactivarlo.

Sí, exactamente. Cualquier tipo de diferencia en el repositorio de git hará que falle.

Sobre lo de sidekiq, si abres un tema al respecto, estoy seguro de que podremos encontrar una manera de hacerlo, ya sea desde un plugin, o tal vez podríamos introducir una nueva GlobalSetting para ello.

4 Me gusta

Por cierto, una forma muy sencilla de cronometrar tus compilaciones sin tener que permanecer presente en tu consola es la siguiente:

time ./launcher rebuild app
11 Me gusta

Buen cambio. Obtengo un

real 2m41.898s
user 0m0.372s
sys 0m0.583s

Gracias por tu trabajo.

4 Me gusta

Wow Impressive, ¿se ha definido la fecha? Mi versión es a81eaacb1c53581912519ae6574fa3523ef215dd. ¿Debo esperar para reconstruir?

¡Oh, genial! :star_struck:

Gracias por eso, @merefield. No puedo creer que me entere de esto ahora después de 7 años y varios cientos de reconstrucciones de línea de comandos. :grin:

5 Me gusta

Si sigues nuestro canal de lanzamiento estándar, puedes reconstruir ahora y obtener los beneficios.

4 Me gusta

¡Los Únicos! Gracias.

1 me gusta

4 minutos para reconstruir ¡Lo hice un par de veces hoy, migrado completamente! ¡Impresionante Discourse! La próxima reconstrucción recordaré usar ese hermoso comando, gracias a todos.

1 me gusta

Quizás sea una idea limitar esto a app/assets, config/locales para el núcleo y los plugins. En este momento, esto también causará una reconstrucción completa cuando se hayan aplicado parches solo de Ruby (de seguridad).

Sí, es posible que podamos restringir esto aún más. Aunque en el caso de los parches de seguridad, es bastante común que también afecten a la aplicación JS… por lo que todavía será necesaria una reconstrucción completa.

2 Me gusta

¡Acabo de probarlo, es fantástico, ~3 minutos! Qué función tan inteligente y asombrosa. :star_struck:
Ahora me dan ganas de instalar todos los plugins existentes uno por uno. :rofl:

5 Me gusta

Realmente, realmente, es genial

En realidad, creo que eso lo anularía, si entiendo bien.

Verás, solo puede usar los activos compilados para el código central empaquetado (¡y esto explica en gran medida la reciente decisión de empaquetar los complementos centrales populares!).

Tiene que compilar y empaquetar cualquier complemento “desconocido” durante la compilación, por lo que muchos de estos lo ralentizarían considerablemente.

2 Me gusta

Actualizando a 3.6.0.beta1 y los activos precompilados no se encuentran

Fetching and extracting https://get.discourse.org/discourse-assets/3.6.0.beta1-d63a2431/production.tar.gz...
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
100     9  100     9    0     0     24      0 --:--:-- --:--:-- --:--:--    24
curl: (22) The requested URL returned error: 404
[assemble_ember_build] Failed to download prebuilt assets: Command failed with exit 22: curl
[assemble_ember_build] Running full core build...

2 Me gusta

¿Está dirigiendo la etiqueta beta para esta instalación?