Consumo excessivo de memória devido à pré-compilação de assets

Olá pessoal,

Muito obrigado por todos os dicas que vocês nos forneceram, são muito apreciadas. Acreditamos que identificamos a causa raiz dos recentes problemas de memória.

Anteriormente, executar bundle exec rake assets:precompile:build no momento da construção (como root) não exigia ter o Redis nem conexão com o banco de dados. Esse comportamento mudou (ref: Introducing pre-compiled JS assets for self-hosters e Introducing a new build system for plugins).

Para acomodar isso, movemos a etapa bundle exec rake assets:precompile:build para um contêiner de inicialização em tempo de execução (antes de executar db:migrate, etc). Isso permite que ele seja executado como o usuário discourse, com o acesso necessário aos serviços tanto ao Redis quanto ao banco de dados.

No entanto, durante a execução, o processo entra em um loop em lib/plugin/js_manager.rb. Ao observar ps -fe, vemos o pnpm tentando repetidamente adicionar a si mesmo, o que leva à saturação de memória:

...
discour+     704     688  5 11:00 pts/0    00:00:00 node /usr/bin/pnpm -C=frontend/asset-processor node build.js
discour+     718     704  5 11:00 pts/0    00:00:00 node /usr/bin/pnpm add pnpm@10.28.0 --loglevel=error --allow-build=@pnpm
discour+     729     718  6 11:00 pts/0    00:00:00 node /usr/bin/pnpm add pnpm@10.28.0 --loglevel=error --allow-build=@pnpm
discour+     740     729  6 11:00 pts/0    00:00:00 node /usr/bin/pnpm add pnpm@10.28.0 --loglevel=error --allow-build=@pnpm
discour+     754     740  7 11:00 pts/0    00:00:00 node /usr/bin/pnpm add pnpm@10.28.0 --loglevel=error --allow-build=@pnpm
...
# e a lista começa a crescer e continua indefinidamente, provocando a saturação de memória

Em nossos testes, descobrimos que executar o contêiner de inicialização como root, em seguida, executar npm uninstall -g pnpm seguido de npm install -g pnpm@10.28.0, resolve o loop e permite que a compilação do plugin seja concluída com sucesso:

...
[Plugin::JsManager] Compilando 49 plugins...
[Plugin::JsManager] Compilação inicial dos plugins concluída em 5,82s

Portanto, antes de superengenhariar nossa infraestrutura e provavelmente alterar nosso design, acho que essa pergunta é mais para @david: há planos de restaurar o comportamento anterior para assets:precompile:build para que ele possa ser executado sem Redis ou conexão com o banco de dados (semelhante ao que você está fazendo com o fluxo DISCOURSE_DOWNLOAD_PRE_BUILT_ASSETS: 0)?

Como nota lateral e por curiosidade: por que executar o processo node como um usuário não root desencadeia esse loop recursivo de instalação do pnpm, enquanto executá-lo como root parece evitá-lo?

Abraços,
Ismael