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