Чрезмерное потребление памяти из-за предварительной компиляции ассетов

Привет, ребята,

Большое спасибо за все советы, которые вы нам предоставили, мы очень ценим это. Мы считаем, что нам удалось выявить корневую причину недавних проблем с памятью.

Ранее запуск bundle exec rake assets:precompile:build во время сборки (от имени root) не требовал наличия Redis или подключения к базе данных. Это поведение изменилось (см.: Introducing pre-compiled JS assets for self-hosters и Introducing a new build system for plugins).

Чтобы учесть это, мы перенесли шаг bundle exec rake assets:precompile:build в инициализационный контейнер во время выполнения (перед выполнением db:migrate и т. д.). Это позволяет запускать его от имени пользователя discourse с необходимым доступом к сервисам Redis и базы данных.

Однако во время выполнения процесс попадает в цикл в lib/plugin/js_manager.rb. Просмотрев вывод ps -fe, мы видим, что pnpm неоднократно пытается добавить сам себя, что приводит к исчерпанию памяти:

...
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
...
# и список начинает расти и продолжает расти, вызывая исчерпание памяти

В наших тестах мы обнаружили, что запуск инициализационного контейнера от имени root, а затем выполнение npm uninstall -g pnpm, за которым следует npm install -g pnpm@10.28.0, устраняет цикл и позволяет завершить компиляцию плагинов успешно:

...
[Plugin::JsManager] Compiling 49 plugins...
[Plugin::JsManager] Finished initial compilation of plugins in 5.82s

Поэтому, прежде чем усложнять нашу инфраструктуру и, возможно, менять наш дизайн, я думаю, что этот вопрос больше для @david: есть ли планы восстановить предыдущее поведение для assets:precompile:build, чтобы он мог работать без подключения к Redis или базе данных (аналогично тому, что вы делаете с потоком DISCOURSE_DOWNLOAD_PRE_BUILT_ASSETS: 0)?

Кстати, и из любопытства: почему запуск процесса node от имени не root-пользователя вызывает этот рекурсивный цикл установки pnpm, тогда как запуск от root, похоже, его избегает?

С уважением,
Исмаэль