Übermäßiger Speicherverbrauch durch Vorkompilieren von Assets

Hallo zusammen,

vielen Dank für alle Tipps, die ihr uns gegeben habt – das wird sehr geschätzt. Wir glauben, die Grundursache der jüngsten Speicherprobleme identifiziert zu haben.

Früher erforderte die Ausführung von bundle exec rake assets:precompile:build zur Build-Zeit (als root) weder Redis noch eine Datenbankverbindung. Dieses Verhalten hat sich geändert (siehe: Introducing pre-compiled JS assets for self-hosters und Introducing a new build system for plugins).

Um dem Rechnung zu tragen, haben wir den Schritt bundle exec rake assets:precompile:build in einen Init-Container zur Laufzeit verschoben (vor der Ausführung von db:migrate usw.). Dadurch kann er als Discourse-Benutzer mit dem notwendigen Servicezugriff auf Redis und die Datenbank ausgeführt werden.

Allerdings stößt der Prozess während der Ausführung in lib/plugin/js_manager.rb in eine Schleife. Wenn wir ps -fe betrachten, sehen wir, dass pnpm wiederholt versucht, sich selbst hinzuzufügen, was zu einer Speichersättigung führt:

...
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
...
# und die Liste wächst weiter und weiter, was die Speichersättigung verursacht

In unseren Tests haben wir festgestellt, dass die Ausführung des Init-Containers stattdessen als root, gefolgt von npm uninstall -g pnpm und dann npm install -g pnpm@10.28.0, die Schleife auflöst und den erfolgreichen Abschluss der Plugin-Kompilierung ermöglicht:

...
[Plugin::JsManager] Kompilierung von 49 Plugins...
[Plugin::JsManager] Initiale Kompilierung der Plugins in 5,82 s abgeschlossen

Bevor wir unsere Infrastruktur übermäßig komplex machen und wahrscheinlich unser Design ändern, denke ich, dass diese Frage eher an @david gerichtet ist: Gibt es Pläne, das vorherige Verhalten für assets:precompile:build wiederherzustellen, sodass es ohne Redis- oder Datenbankverbindung ausgeführt werden kann (ähnlich wie bei dem DISCOURSE_DOWNLOAD_PRE_BUILT_ASSETS: 0-Flow)?

Nebenbei und aus Neugier: Warum löst die Ausführung des node-Prozesses als Nicht-Root-Benutzer diese rekursive pnpm-Installations-Schleife aus, während die Ausführung als root dies zu vermeiden scheint?

Viele Grüße,
Ismael