こんにちは皆さん、
これまで提供していただいた多くのアドバイスに心から感謝しています。最近のメモリ問題の原因を特定できたと考えています。
以前は、ビルド時に(root として)bundle exec rake assets:precompile:buildを実行しても、Redis やデータベースへの接続は不要でした。しかし、この動作は変更されました(参照:Introducing pre-compiled JS assets for self-hosters および https://meta.discourse.org/t/introducing-a-new-build-system-for-plugins/398713)。
これに対応するため、bundle exec rake assets:precompile:buildのステップを、db:migrate などの実行前に init コンテナ内で実行するよう変更しました。これにより、Redis とデータベースの両方への必要なサービスアクセス権を持つ discourse ユーザーとして実行できるようになります。
しかし、実行中にプロセスが 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
...
# リストは増加し続け、メモリ飽和を引き起こします
テストの結果、init コンテナを 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 や DB 接続なしで実行可能)を復元する予定はありますか?(DISCOURSE_DOWNLOAD_PRE_BUILT_ASSETS: 0 フローで実施されていることと同様に)
余談ですが、好奇心から質問させてください:なぜ非 root ユーザーとして node プロセスを実行すると、この再帰的な pnpm インストールループがトリガーされるのに、root として実行すると回避されるのでしょうか?
よろしくお願いいたします、
イスマエル