Introduzione di asset JS precompilati per self-hoster

:mega: Discourse ora pubblica asset JavaScript precompilati, che accelereranno significativamente l’installazione e gli aggiornamenti, specialmente per i server con risorse limitate.


La compilazione e l’ottimizzazione degli asset JavaScript sono sempre state una delle parti più dispendiose in termini di risorse per l’esecuzione di Discourse. Con l’evoluzione della nostra codebase e dell’ecosistema JavaScript, questo processo è diventato ancora più impegnativo.

Nei nostri test, queste modifiche riducono il tempo di compilazione degli asset su un droplet Digital Ocean con 1 GB di RAM da 45 minuti a soli 3 minuti.

Come funziona?

Su ogni commit unito a main, un flusso di lavoro di GitHub Actions compila e raggruppa gli asset in file .tar.gz (uno per la produzione, uno per lo sviluppo). Questi bundle vengono pubblicati tramite le release di GitHub in un repository dedicato. Ci assicuriamo che gli asset vengano pubblicati prima che qualsiasi commit passi a tests-passed.

Quando compila il tuo sito, Discourse ora verifica la presenza di un bundle precompilato corrispondente e lo scarica. I plugin vengono quindi compilati sopra. Se non viene trovato alcun bundle o si verifica un errore, Discourse torna alla compilazione dalla sorgente.

Questo ha un impatto sugli utenti finali?

No. Gli asset vengono ancora serviti agli utenti finali dal tuo server / CDN.

Posso disattivarla?

Sì! Se preferisci compilare i tuoi asset e hai un server sufficientemente potente, imposta DISCOURSE_DOWNLOAD_PRE_BUILT_ASSETS: 0 nel tuo file app.yml.

Cosa succede se sto eseguendo una versione forkata o patchata di Discourse?

I bundle di asset sono denominati per hash di commit. Se stai eseguendo un fork, non verrà trovato alcun bundle e gli asset verranno compilati dalla sorgente. Se la tua copia di Discourse è patchata (cioè, l’area di lavoro git non è pulita), Discourse non tenterà di scaricare un bundle.

Cosa ne è degli altri passaggi di compilazione relativi agli asset?

Attualmente, questa ottimizzazione si applica solo agli asset JS principali. In futuro, potremmo estenderla ad alcuni plugin e ad altri passaggi come la compressione gz/brotli.

Cosa ne è del branch stabile?

I bundle di asset precompilati per il branch stabile verranno pubblicati a partire dal prossimo aggiornamento della versione principale, previsto per agosto 2025.

53 Mi Piace

Ho appena ricostruito https://discourse-on-a-pi5.falco.dev/ e ci sono voluti solo 3 minuti e 35 secondi, è molto impressionante!

23 Mi Piace

Configurazione di due container e senza database ~8 minuti.

5 Mi Piace

Whoa :scream: :person_bowing:

Non ho questa opzione nella mia configurazione, devo aggiungerla con un valore di 1 per poterla attivare? O succederà tutto magicamente al mio prossimo aggiornamento?

FYI questo è ciò che accade quando la tua installazione non soddisfa i criteri:

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] Il limite heap di Node.js è inferiore a 2048 MB. Impostazione di --max-old-space-size=2048 e CHEAP_SOURCE_MAPS=1
[assemble_ember_build] Nessun file di informazioni di build esistente trovato.
[assemble_ember_build] La directory di lavoro Git non è pulita. Impossibile scaricare asset precompilati.
[assemble_ember_build] Esecuzione della build core completa...

Sto apportando alcune modifiche a config/initializers/100-sidekiq.rb in app.yml per aggiungere il supporto per un conteggio dei tentativi su tutti i job di sidekiq (che presumo sia l’unico modo per ottenerlo e non all’interno di un plugin? Ma potrei rivederlo) quindi credo che questo sia sufficiente per non soddisfare i criteri…

2 Mi Piace

È abilitata per impostazione predefinita. Devi specificare la configurazione solo se vuoi disabilitarla.

Sì, esatto. Qualsiasi tipo di diff nel repository git causerà l’interruzione.

Per quanto riguarda la cosa di sidekiq, se apri un argomento a riguardo, sono sicuro che potremo trovare un modo per farlo o da un plugin, o forse potremmo introdurre una nuova GlobalSetting per questo.

4 Mi Piace

tra l’altro, un modo molto semplice per cronometrare le tue build senza dover rimanere presente alla tua console è il seguente:

time ./launcher rebuild app
11 Mi Piace

Belissimo cambiamento. Ottengo un

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

Grazie per il tuo lavoro

4 Mi Piace

Wow Impressive è stata definita la data? la mia versione è a81eaacb1c53581912519ae6574fa3523ef215dd Devo aspettare per ricostruire?

Oh bello :star_struck:

Grazie mille @merefield - non posso credere di scoprirlo solo ora dopo 7 anni e diverse centinaia di ricostruzioni da riga di comando :grin:

5 Mi Piace

Se stai seguendo il nostro normale canale di rilascio, puoi ricostruire ora e raccogliere i benefici.

4 Mi Piace

The Only Ones! grazie.

1 Mi Piace

4 minuti per ricostruire, l’ho fatto un paio di volte oggi, completamente migrato! Impressionante Discourse! Alla prossima ricostruzione mi ricorderò di usare quel bellissimo comando, grazie a tutti.

1 Mi Piace

Forse è un’idea limitare questo a app/assets, config/locales per il core e i plugin? Al momento, questo causerà anche una ricostruzione completa quando sono state applicate patch (di sicurezza) solo per Ruby.

Sì, è possibile limitare ulteriormente. Sebbene nel caso delle patch di sicurezza sia abbastanza comune che interessino anche l’app JS, sarà comunque necessaria una ricompilazione completa.

2 Mi Piace

L’ho appena provato, è fantastico, ~3 minuti! Che funzionalità intelligente e straordinaria. :star_struck:
Ora mi fa venire voglia di installare ogni plugin esistente uno per uno. :rofl:

5 Mi Piace

Davvero davvero, è fantastico

In realtà, credo che questo lo vanificherebbe, se ho capito bene.

Lo vedi che può usare solo gli asset compilati per il codice core integrato (e questo spiega in gran parte la recente decisione di integrare anche i plugin core più diffusi!)

Deve compilare e integrare qualsiasi plugin “sconosciuto” durante la compilazione, quindi molti di questi lo rallenterebbero considerevolmente.

2 Mi Piace

Aggiornamento a 3.6.0.beta1 e le risorse precompilate non vengono trovate

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 Mi Piace

Stai puntando al tag beta per questa installazione?