埋め込みアセットテーマ

皆さん、

回答を探していくつかのスレッドを読みましたが、(以下にリンクされているように)多くの回答を見つけました。それらのおかげで、ほとんど望んでいたとおりの外観にすることができました。しかし、まだ解決できていない質問が1つあります。

それは、埋め込みアセットファイル、特に embed_HASH.css ファイルに関するものです。

これらのアセットがビルドされるとき、アクティブなテーマのカラーパレットを使用してコンパイルされていないように思われます。これは意図したものであったり、何か見落としている点であったりする可能性があります。

以下について明確にしたいと考えています。

  1. embed_[digest].css は常にデフォルトのパレットを使用してビルドされますか?
    もしそうなら、それでも構いません。Discourse のテーマとカラーパレットの処理に関する継続的な作業がたくさんあることは承知しています。
  2. カスタムパレットを使用してビルドできる場合、その動作をトリガーするにはどうすればよいですか?
  3. システムがライトまたはダークのパレットを使用してビルドできることに気づきましたので、カスタムパレットが使用できる可能性はありますが、ライトまたはダークの埋め込みファイルを予測可能に生成することができませんでした。

これをテストするために、すべてのテーマとパレットを削除し、すべてをデフォルトのライトテーマに戻してから、以下を実行しました。

rake assets:precompile
rake assets:precompile:build

…ライトテーマの embed_HASH.css が生成されることを期待していましたが、結果はダークスタイルが使用されているように見えました。

内部構造に深く精通しているわけではないので、何か明白なことを見落としている可能性があります。 embed_HASH.css が予測可能なパレットでビルドされるために必要なことがあれば、共有していただけると大変助かります。

よろしくお願いいたします。

参考までに、私の Discourse インスタンスは Docker で実行されており、最新の状態です。 launcher スクリプトとスタンドアロンテンプレートを使用しました。

関連資料(新規アカウントはリンク2つまで、3つ目は検索可能なタイトル):

自身の質問に対する部分的な回答が見つかったので、その洞察を共有したいと思います。

embed_[digest].css ファイルは、アクティブなテーマで選択されたカラーパレットを使用してビルドされます。

問題は、私が気づいたように、非常に積極的な HTTP レスポンスキャッシングによるものです。

まだ誰かに答えてほしいのは次の点です。
Discourse では、アセットファイルの HTTP レスポンスはどこでキャッシュされますか?

これはブラウザ側のキャッシュだけでなく、サーバー側のキャッシュでもあるようです。


Rails の本番ログを tailing すると、新しい、見たことのないクエリパラメータのセットを持つリクエストのみが、新しいアセットレンダリングをトリガーすることがわかります。

$ tail -n 50 shared/standalone/log/rails/production.log -f
Started GET "/stylesheets/embed_afe162195ad0a7185309a19d8c36036d2e53708c.css?__ws=domain.tld&foo=bif" for fd00:aaaa::f1a at 2025-06-27 01:14:38 +0000
Processing by StylesheetsController#show as CSS
  Parameters: {"__ws"=>"domain.tld", "foo"=>"bif", "name"=>"embed_afe162195ad0a7185309a19d8c36036d2e53708c"}
Sent file /var/www/discourse/tmp/stylesheet-cache/embed_afe162195ad0a7185309a19d8c36036d2e53708c.css (0.2ms)
Completed 200 OK in 22ms

その後、同じ URL への後続のリクエスト(異なるクエリ文字列が含まれていても)は、根本的なテーマが変更されていても、同じレスポンスを返します。

例えば:

  1. https://domain.tld/stylesheets/embed_[digest].css?__ws=domain.tld
  2. https://domain.tld/stylesheets/embed_[digest].css?__ws=domain.tld&foo=bar

ユニークなクエリが使用された最初の回にのみ、更新されたテーマスタイルが表示されます。それ以降の同じパラメータを持つリクエストは、再コンパイル後でも、以前のバージョンを提供します。

launcher スクリプトはデフォルトで RAILS_ENV=production に設定されており、そのままにしています。開発中はキャッシュを完全に無効にするために RAILS_ENV=development に切り替えることを試すことができますが、理想的には次のことを知りたいです。

本番環境でアセットレスポンスの HTTP レベルのキャッシュをクリアまたは無効にするにはどうすればよいですか?

Discourse がこれらのアセットレスポンスをどのようにキャッシュするか、またはそれらを適切に無効化する方法について、誰かが洞察を持っていれば、非常に役立ちます。

「いいね!」 1

ああ、しまった :flushed_face: Nginxだった!

TL;DR:

rm -rf /var/nginx/cache/*`

即効性がある!


オプション:Nginxアセットキャッシュの無効化

このファイルを編集します:

/etc/nginx/conf.d/discourse.conf

243〜246行目あたりで、キャッシュディレクティブをコメントアウトします:

      # proxy_cache one;
      # proxy_cache_key "$scheme,$host,$request_uri";
      # proxy_cache_valid 200 301 302 7d;
      # proxy_cache_bypass $bypass_cache;

その後、Nginxを再起動します:

sv restart nginx

:artist_palette: カラーパレットを変更する場合…

テーマのカラー設定を編集するだけでは、embed_[digest].css は再生成されません。Discourseに新しいアセットファイルを生成させるには、次のようにします:

rm tmp/stylesheet-cache/* # または、embedのみの場合は `rm tmp/stylesheet-cache/embed*`

:thinking: RAILS_ENV=development については?

RAILS_ENV: development を設定するとキャッシュが無効になると思うかもしれませんが、以下の理由によります:

  • Discourseが使用する nginx.sample.conf は、環境に関係なくデフォルトでキャッシュが有効になっています。
  • そのキャッシュは RAILS_ENV に紐づいていないため、埋め込みアセットキャッシュには役立ちません。

Nginxレイヤーを完全に再設定する予定がない限り、手動でキャッシュをクリアするか、それらの行を無効にするだけで済みます。本番環境の準備ができたら、元に戻すことができます。

:turtle: ./launcher rebuild standalone については?

確かに、それは機能します。しかし、テーマを積極的に調整したり、埋め込みをテストしたり、色を調整したりしている場合は、毎回数分待つよりも速い方法が必要になるでしょう。

:speech_balloon: より良い開発環境や簡単な修正方法は? ぜひ共有してください!

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.