안녕하세요,
제공해 주신 모든 팁에 진심으로 감사드립니다. 정말 큰 도움이 되었습니다. 최근 발생한 메모리 문제의 근본 원인을 파악한 것으로 보입니다.
이전에는 빌드 시점에 루트 권한으로 bundle exec rake assets:precompile:build를 실행할 때 Redis나 데이터베이스 연결이 필요하지 않았습니다. 하지만 이 동작이 변경되었습니다(참조: Introducing pre-compiled JS assets for self-hosters 및 Introducing a new build system for plugins ).
이러한 변경에 대응하기 위해, bundle exec rake assets:precompile:build 단계를 런타임 시점의 init 컨테이너로 이동시켰습니다(이전에는 db:migrate 등을 실행하기 전에 수행). 이를 통해 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 컨테이너를 루트 권한으로 실행하고 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 프로세스를 실행할 때 이 재귀적 pnpm 설치 루프가 발생하는 반면, 루트 권한으로 실행하면 이를 피할 수 있는 이유는 무엇인가요?
감사합니다,
Ismael