セルフホスティング者向けの事前コンパイル済みJSアセットの紹介

:mega: Discourse は、事前ビルドされた JavaScript アセットを公開するようになりました。これにより、特にリソースが限られているサーバーでのインストールとアップデートが大幅に高速化されます。


JavaScript アセットのコンパイルと最適化は、常に Discourse を実行する上で最もリソースを消費する部分の 1 つでした。コードベースと JavaScript エコシステムが進化するにつれて、このプロセスはさらに要求が厳しくなっています。

テストでは、これらの変更により、1GB RAM の Digital Ocean ドロップレットでのアセットビルド時間が 45 分からわずか 3 分に短縮されました。

仕組みは?

main にマージされたすべてのコミットで、GitHub Actions ワークフロー がアセットをビルドして .tar.gz ファイル (本番用と開発用がそれぞれ 1 つ) にバンドルします。これらのバンドルは、専用リポジトリの GitHub リリース を介して公開されます。アセットは、コミットが tests-passed に移動する前に公開されることを保証します。

独自のサイトをビルドする際、Discourse は一致する事前ビルド済みバンドルをチェックしてダウンロードします。その後、プラグインがその上にビルドされます。バンドルが見つからない場合やエラーが発生した場合は、Discourse はソースからビルドするようにフォールバックします。

エンドユーザーに影響はありますか?

いいえ。アセットは引き続き、ご自身のサーバー/CDN からエンドユーザーに配信されます。

オプトアウトできますか?

はい!ご自身の責任でアセットをビルドしたい場合、または十分なパワーを持つサーバーをお持ちの場合は、app.yml ファイルで DISCOURSE_DOWNLOAD_PRE_BUILT_ASSETS: 0 を設定してください。

フォークまたはパッチ適用済みの Discourse バージョンを実行している場合はどうなりますか?

アセットバンドルはコミットハッシュで名前が付けられます。フォークを実行している場合、バンドルは見つからず、アセットはソースからビルドされます。Discourse のコピーにパッチが適用されている場合 (つまり、git 作業ツリーがクリーンでない場合)、Discourse はバンドルのダウンロードを試みません。

その他のアセット関連のビルドステップについてはどうですか?

現在、この最適化はコア JS アセットにのみ適用されます。将来的には、一部のプラグインや、gz/brotli 圧縮などの他のステップに拡張する可能性があります。

安定版ブランチについてはどうですか?

安定版ブランチの事前ビルド済みアセットは、2025 年 8 月に計画されている次のメジャーバージョンアップから公開される予定です。

「いいね!」 53

https://discourse-on-a-pi5.falco.dev/ の再構築を行ったところ、わずか3分35秒で完了しました。これは非常に素晴らしいです!

「いいね!」 23

データベースなしの2コンテナセットアップで約8分。

「いいね!」 5

うわー :scream: :person_bowing:

私の設定にはこのオプションがありません。オプトインするために値1を追加する必要がありますか?それとも、次回のアップデート時にすべてが自動的に行われるのでしょうか?

FYI、インストールが基準を満たしていない場合は、次のようになります。

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 は 2048MB 未満です。--max-old-space-size=2048 および CHEAP_SOURCE_MAPS=1 を設定します。
[assemble_ember_build] 既存のビルド情報ファイルは見つかりませんでした。
[assemble_ember_build] Git の作業ディレクトリがクリーンではありません。プリビルドされたアセットをダウンロードできません。
[assemble_ember_build] フルコアビルドを実行しています...

app.ymlconfig/initializers/100-sidekiq.rb をいくつか調整して、すべての sidekiq ジョブにリトライカウントのサポートを追加しています(これはこれを達成する唯一の方法であり、プラグイン内ではないと推測しますが、再検討する可能性はありますか?)。そのため、これは基準を満たしていない十分な理由だと考えています…

「いいね!」 2

デフォルトで有効になっています。オプトアウトしたい場合のみ、設定を指定する必要があります。

はい、その通りです。gitリポジトリのいかなるdiffも、それが失敗する原因となります。

サイドキックの件ですが、それについてトピックを開けば、プラグインから、あるいは新しい GlobalSetting を導入して、それを実現する方法を見つけられると確信しています。

「いいね!」 4

ちなみに、コンソールに張り付かなくてもビルドの時間を計測できる非常に簡単な方法があります。

time ./launcher rebuild app
「いいね!」 11

素晴らしい変更ですね。以下のような結果が得られました。

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

作業いただきありがとうございます。

「いいね!」 4

すごい、すごいですね。日付はいつですか?私のバージョンは a81eaacb1c53581912519ae6574fa3523ef215dd です。再構築を待つべきですか?

おお、いいですね🤩

@merefield、ありがとうございます。7年間、何百回もコマンドラインで再構築してきたのに、今になって初めて知ったなんて信じられません😁

「いいね!」 5

標準リリースチャンネルをご利用の場合、今すぐ再構築してメリットを享受できます。

「いいね!」 4

ザ・オンリー・ワンズ!ありがとうございます。

「いいね!」 1

再構築に4分かかりました。今日はこれを数回行い、完全に移行しました!Impressive Discourse!次の再構築では、その美しいコマンドを使用することを思い出します。皆さん、ありがとうございました。

「いいね!」 1

これをコアとプラグインの app/assetsconfig/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 タグを対象としていますか?