Consommation excessive de mémoire due à la précompilation des assets

Salut à tous,

Un grand merci pour tous les conseils que vous nous avez donnés, nous les apprécions vraiment. Nous pensons avoir identifié la cause racine des problèmes de mémoire récents.

Auparavant, l’exécution de bundle exec rake assets:precompile:build au moment de la construction (en tant que root) ne nécessitait ni Redis ni de connexion à la base de données. Ce comportement a changé (réf. : Introducing pre-compiled JS assets for self-hosters et Introducing a new build system for plugins).

Pour nous adapter à cela, nous avons déplacé l’étape bundle exec rake assets:precompile:build vers un conteneur d’initialisation au moment de l’exécution (avant d’exécuter db:migrate, etc.). Cela permet de l’exécuter en tant qu’utilisateur discourse, avec l’accès nécessaire aux services Redis et à la base de données.

Cependant, lors de l’exécution, le processus entre dans une boucle dans lib/plugin/js_manager.rb. En examinant ps -fe, nous constatons que pnpm tente à plusieurs reprises de s’ajouter lui-même, ce qui entraîne une saturation de la mémoire :

...
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
...
# et la liste commence à s'allonger et continue indéfiniment, provoquant la saturation de la mémoire

Lors de nos tests, nous avons constaté que l’exécution du conteneur d’initialisation en tant que root, suivie de npm uninstall -g pnpm puis de npm install -g pnpm@10.28.0, résout la boucle et permet à la compilation des plugins de se terminer avec succès :

...
[Plugin::JsManager] Compilation de 49 plugins...
[Plugin::JsManager] Compilation initiale des plugins terminée en 5,82 s

Ainsi, avant de trop complexifier notre infrastructure et probablement de modifier notre conception, je pense que cette question s’adresse davantage à @david : y a-t-il des projets visant à restaurer le comportement précédent pour assets:precompile:build afin qu’il puisse s’exécuter sans Redis ni connexion à une base de données (similaire à ce que vous faites avec le flux DISCOURSE_DOWNLOAD_PRE_BUILT_ASSETS: 0) ?

En passant, et par curiosité : pourquoi l’exécution du processus node en tant qu’utilisateur non root déclenche-t-elle cette boucle d’installation récursive de pnpm, alors que l’exécution en tant que root semble l’éviter ?

Cordialement,
Ismael