Apresentando assets JS pré-compilados para auto-hospedadores

:mega: O Discourse agora publica ativos JavaScript pré-compilados, o que acelerará significativamente a instalação e as atualizações, especialmente para servidores com recursos limitados.


A compilação e otimização de ativos JavaScript sempre foram uma das partes mais intensivas em recursos da execução do Discourse. À medida que nossa base de código e o ecossistema JavaScript evoluíram, esse processo se tornou ainda mais exigente.

Em nossos testes, essas alterações reduzem o tempo de compilação de ativos em um droplet Digital Ocean de 1GB de RAM de 45 minutos para apenas 3 minutos.

Como funciona?

Em cada commit mesclado ao main, um fluxo de trabalho do GitHub Actions compila e agrupa os ativos em arquivos .tar.gz (um para produção, um para desenvolvimento). Esses pacotes são publicados via releases do GitHub em um repositório dedicado. Garantimos que os ativos sejam publicados antes que qualquer commit passe para tests-passed.

Ao compilar seu próprio site, o Discourse agora verifica se há um pacote pré-compilado correspondente e o baixa. Os plugins são então compilados por cima. Se nenhum pacote for encontrado ou houver um erro, o Discourse volta a compilar a partir do código-fonte.

Isso afeta os usuários finais?

Não. Os ativos ainda são servidos aos usuários finais do seu próprio servidor / CDN.

Posso optar por não participar?

Sim! Se você preferir compilar seus próprios ativos e tiver um servidor suficientemente poderoso, defina DISCOURSE_DOWNLOAD_PRE_BUILT_ASSETS: 0 em seu arquivo app.yml.

E se eu estiver executando uma versão bifurcada ou modificada do Discourse?

Os pacotes de ativos são nomeados por hash de commit. Se você estiver executando um fork, nenhum pacote será encontrado e os ativos serão compilados a partir do código-fonte. Se sua cópia do Discourse estiver modificada (ou seja, a árvore de trabalho do git não estiver limpa), o Discourse não tentará baixar um pacote.

E quanto a outras etapas de compilação relacionadas a ativos?

Atualmente, essa otimização se aplica apenas aos ativos JS principais. No futuro, podemos expandi-la para alguns plugins e outras etapas, como compressão gz/brotli.

E quanto ao branch estável?

Os ativos pré-compilados para o branch estável serão publicados a partir da próxima atualização de versão principal, planejada para agosto de 2025.

53 curtidas

Acabei de fazer uma reconstrução de https://discourse-on-a-pi5.falco.dev/ e levou apenas 3 minutos e 35s, isso é muito impressionante!

23 curtidas

Configuração de dois contêineres e sem banco de dados ~8 minutos.

5 curtidas

Uau :scream: :person_bowing:

Não tenho essa opção na minha configuração, preciso adicioná-la com o valor 1 para poder optar? Ou tudo isso acontecerá magicamente na próxima vez que eu atualizar?

FYI, isto é o que acontece quando a sua instalação não atende aos critérios:

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] O limite de heap do Node.js é inferior a 2048MB. Definindo --max-old-space-size=2048 e CHEAP_SOURCE_MAPS=1
[assemble_ember_build] Nenhum arquivo de informações de build existente encontrado.
[assemble_ember_build] O diretório de trabalho Git não está limpo. Não é possível baixar os ativos pré-compilados.
[assemble_ember_build] Executando build principal completo...

Estou fazendo alguns ajustes em config/initializers/100-sidekiq.rb em app.yml para adicionar suporte a uma contagem de tentativas em todos os jobs do sidekiq (que presumo ser a única maneira de conseguir isso e não dentro de um plugin? Mas poderia revisitar) então acredito que isso é o suficiente para não atender aos critérios…

2 curtidas

Está habilitado por padrão. Você só precisa especificar a configuração se quiser sair.

Sim, exatamente. Qualquer tipo de diff no repositório git fará com que ele falhe.

Sobre a questão do sidekiq, se você abrir um tópico sobre isso, tenho certeza que podemos encontrar uma maneira de fazer isso, seja por meio de um plugin, ou talvez possamos introduzir uma nova GlobalSetting para isso.

4 curtidas

aliás, uma forma muito simples de cronometrar suas compilações sem ter que permanecer presente no seu console é a seguinte:

time ./launcher rebuild app
11 curtidas

Ótima mudança. Eu recebo um

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

Obrigado pelo seu trabalho

4 curtidas

Uau, impressionante. A data foi definida? Minha versão é a81eaacb1c53581912519ae6574fa3523ef215dd. Devo esperar para reconstruir?

Ah, legal :star_struck:

Obrigado por isso @merefield - não acredito que estou descobrindo isso agora depois de 7 anos e várias centenas de reconstruções de linha de comando :grin:

5 curtidas

Se você estiver seguindo nosso canal de lançamento padrão, pode reconstruir agora e colher os benefícios.

4 curtidas

Os Únicos! obrigado.

1 curtida

4 minutos para reconstruir. Fiz isso algumas vezes hoje, totalmente migrado! Impressionante Discourse! Na próxima reconstrução, lembrarei de usar esse belo comando. Obrigado a todos.

1 curtida

Talvez seja uma ideia limitar isso a app/assets, config/locales para o núcleo e plugins? No momento, isso também causará uma reconstrução completa quando patches apenas de Ruby (segurança) tiverem sido aplicados.

Sim, é possível restringirmos isso ainda mais. Embora, no caso de patches de segurança, seja bastante comum que eles afetem também o aplicativo JS… então uma reconstrução completa ainda será necessária.

2 curtidas

Acabei de experimentar, é fantástico, ~3min! Que recurso inteligente e incrível. :star_struck:
Agora me dá vontade de instalar todos os plugins existentes um por um. :rofl:

5 curtidas

Realmente, realmente, é ótimo

Na verdade, acredito que isso o prejudicaria, se eu entendi corretamente.

Você vê, ele só pode usar os ativos compilados para o código principal empacotado (e isso explica em grande parte a decisão recente de empacotar os plugins principais populares, aliás!)

Ele tem que compilar e empacotar qualquer plugin “desconhecido” durante a compilação, então muitos deles o tornariam consideravelmente mais lento.

2 curtidas

Atualizando para 3.6.0.beta1 e os assets pré-compilados não são encontrados

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 curtidas

Você está direcionando a tag beta para esta instalação?