자체 호스팅 사용자를 위한 사전 컴파일된 JS 자산 소개

:mega: Discourse는 이제 미리 빌드된 JavaScript 자산을 게시합니다. 이는 특히 리소스가 제한된 서버에서 설치와 업데이트 속도를 크게 향상시킵니다.


JavaScript 자산을 컴파일하고 최적화하는 것은 항상 Discourse 운영에서 가장 많은 리소스를 소비하는 부분 중 하나였습니다. 우리의 코드베이스와 JavaScript 생태계가 발전하면서 이 과정은 더욱 복잡해졌습니다.

우리의 테스트에 따르면, 이러한 변경 사항은 1GB RAM의 Digital Ocean droplet에서 자산 빌드 시간을 45분에서 단 3분으로 줄입니다.

어떻게 작동하나요?

main에 병합되는 모든 커밋마다 GitHub Actions 워크플로가 자산을 빌드하고 번들링하여 .tar.gz 파일(프로덕션용 1개, 개발용 1개)로 생성합니다. 이 번들은 전용 저장소에서 GitHub 릴리스를 통해 게시됩니다. 커밋이 tests-passed로 이동하기 전에 자산이 게시되었는지 확인합니다.

자신의 사이트를 빌드할 때, Discourse는 이제 일치하는 미리 빌드된 번들을 확인하고 다운로드합니다. 이후 플러그인이 그 위에 빌드됩니다. 번들을 찾지 못하거나 오류가 발생하면 Discourse는 소스에서 빌드하는 방식으로 폴백합니다.

최종 사용자에게 영향을 미치나요?

아니요. 자산은 여전히 최종 사용자에게 자신의 서버/CDN에서 제공됩니다.

선택적으로 비활성화할 수 있나요?

네! 자신의 자산을 직접 빌드하기를 원하고 충분히 강력한 서버를 보유하고 있다면, app.yml 파일에서 DISCOURSE_DOWNLOAD_PRE_BUILT_ASSETS: 0으로 설정하세요.

Discourse의 포크나 패치된 버전을 실행 중인 경우 어떻게 되나요?

자산 번들은 커밋 해시로 이름이 지정됩니다. 포크를 실행 중이라면 번들을 찾지 못하여 소스에서 자산이 빌드됩니다. Discourse 사본에 패치가 적용된 경우(즉, git 작업 트리가 깨끗하지 않은 경우), Discourse는 번들을 다운로드하지 않습니다.

다른 자산 관련 빌드 단계는 어떻게 되나요?

현재 이 최적화는 핵심 JS 자산에만 적용됩니다. 향후 일부 플러그인 및 gz/brotli 압축과 같은 다른 단계로 확장될 수 있습니다.

stable 브랜치는 어떻게 되나요?

stable 브랜치의 미리 빌드된 자산은 2025년 8월에 계획된 다음 주요 버전 업데이트부터 게시될 예정입니다.

55개의 좋아요

https://discourse-on-a-pi5.falco.dev/를 재빌드했는데 딱 3분 35초밖에 걸리지 않았습니다. 정말 인상 깊네요!

23개의 좋아요

컨테이너 2개 구성 및 데이터베이스 미사용 환경에서 약 8분 소요.

5개의 좋아요

:scream: :person_bowing:

제 설정 파일에 이 옵션이 없는데, 1로 추가해서 활성화해야 하나요? 아니면 다음 업데이트 시 자동으로 적용되나요?

참고로, 설치 환경이 기준을 충족하지 않을 때 발생하는 내용은 다음과 같습니다:

I, [2025-08-01T06:43:09.560655 #1]  INFO -- : > cd /var/www/discourse && su discourse -c 'bundle exec rake assets:precompile:build'
[assemble_ember_build] Node.js heap_size_limit is less than 2048MB. Setting --max-old-space-size=2048 and CHEAP_SOURCE_MAPS=1
[assemble_ember_build] No existing build info file found.
[assemble_ember_build] Git working directory is not clean. Cannot download prebuilt assets.
[assemble_ember_build] Running full core build...

app.ymlconfig/initializers/100-sidekiq.rb를 조정하여 모든 sidekiq 작업에 재시도 횟수(retry count) 지원을 추가하고 있습니다(이것이 플러그인 외부에서 이 기능을 구현하는 유일한 방법이라고 생각하지만, 다시 검토할 수도 있습니다). 따라서 이는 기준을 충족하지 못하는 충분한 이유라고 생각합니다 …

2개의 좋아요

기본적으로 활성화되어 있습니다. 옵트아웃을 원할 경우에만 설정을 지정하면 됩니다.

네, 맞습니다. git 저장소에서 어떤 종류의 diff(변경 사항)가 발생하든 프로세스가 중단됩니다.

사이드킥 관련해서, 해당 주제에 대해 토픽을 열면 플러그인에서 처리하거나, 아니면 새로운 GlobalSetting을 도입하는 등 해결 방법을 함께 찾아낼 수 있을 것입니다.

4개의 좋아요

참고로, 콘솔 앞에서 계속 대기하지 않고 빌드 시간을 측정하는 아주 간단한 방법은 다음과 같습니다:

time ./launcher rebuild app

(단일 컨테이너를 사용하지 않는 경우 컨테이너 종류에 따라 명령이 다를 수 있습니다)

이렇게 하면 빌드가 완료될 때 경과 시간을 보고해 줍니다 :stopwatch:

11개의 좋아요

좋은 변경이네요. 다음 결과가 나왔습니다.

real 2m41.898s
user 0m0.372s
sys 0m0.583s

수고하셨습니다.

4개의 좋아요

와, 인상적이다. 날짜가 정의되어 있나요? 제 버전은 a81eaacb1c53581912519ae6574fa3523ef215dd입니다. 재빌드할 때까지 기다려야 할까요?

오, 멋지네요 :star_struck:

@merefield님, 감사합니다 - 7년 동안 수백 번의 커맨드 라인 재빌드를 해놓고 이제서야 이 방법을 알게 되다니 믿기지가 않아요 :grin:

5개의 좋아요

표준 릴리스 채널을 따르고 계시다면, 지금 바로 다시 빌드하여 그 이점을 누릴 수 있습니다.

4개의 좋아요

오직 당신뿐이야! 고마워.

1개의 좋아요

재구축에 4분이 걸렸어요. 오늘 몇 번이나 해봤는데 완전히 마이그레이션 완료! 정말 인상적인 Discourse! 다음 재구축 때 그 멋진 명령어를 사용하도록 잊지 않겠습니다. 감사합니다.

1개의 좋아요

핵심 및 플러그인의 경우 이 범위를 app/assets, config/locales로 제한하는 것이 좋은 아이디어일 수 있습니다. 현재 상태에서는 Ruby 전용(보안) 패치가 적용된 경우에도 완전한 재빌드가 발생하게 됩니다.

네, 더 제한할 수 있습니다. 다만 보안 패치의 경우 JS 앱에도 영향을 미치는 경우가 꽤 흔해서… 결국 전체 재빌드가 필요합니다.

2개의 좋아요

방금 해봤는데, 정말 멋져요, 약 3분이면 됩니다! 정말 똑똑하고 놀라운 기능이네요. :star_struck:
이제 하나씩 모든 기존 플러그인을 설치하고 싶어지네요. :rofl:

5개의 좋아요

정말 정말, 정말 멋져

실제로 제가 이해한 바로는, 그렇게 하면 오히려 의도가 무너질 것 같습니다.

이 시스템은 번들된 코어 코드에 대한 컴파일된 에셋만 사용할 수 있습니다(참고로, 이것이 최근 인기 있는 코어 플러그인을 번들링하기로 결정한 주요 이유이기도 합니다!)

“알 수 없는” 플러그인은 빌드 시점에 빌드 및 번들링해야 하므로, 이 중 많은 플러그인이 성능을 상당히 저하시킬 것입니다.

2개의 좋아요

3.6.0.beta1로 업데이트했는데 사전 빌드된 자산을 찾을 수 없습니다

Fetching and extracting https://get.discourse.org/discourse-assets/3.6.0.beta1-d63a2431/production.tar.gz...
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
100     9  100     9    0     0     24      0 --:--:-- --:--:-- --:--:--    24
curl: (22) The requested URL returned error: 404
[assemble_ember_build] Failed to download prebuilt assets: Command failed with exit 22: curl
[assemble_ember_build] Running full core build...

2개의 좋아요

이번 설치에서 beta 태그를 대상으로 하고 있나요?