Встраивание тем активов

Привет, друзья,

Я просмотрел несколько тем в поисках ответов — и нашёл много полезного (ссылки ниже, спасибо!). Благодаря им я смог настроить всё в основном так, как хотел. Но остался один вопрос, который я так и не смог решить.

Он касается файлов ресурсов для встраивания, а именно файла embed_HASH.css.

Кажется, что при сборке этих ресурсов они не компилируются с использованием палитры цветов активной темы. Возможно, это сделано намеренно, а возможно, я что-то упустил.

Вот что я хотел бы прояснить:

  1. Всегда ли embed_[digest].css собирается с использованием палитры по умолчанию?
    Если да, то я могу с этим смириться — я знаю, что в Discourse ведётся много работы по улучшению обработки тем и цветовых палитр.
  2. Если её можно собрать с пользовательской палитрой, как активировать такое поведение?
  3. Я заметил, что её можно собрать с использованием системных светлой или тёмной палитр, поэтому кажется правдоподобным, что может использоваться и пользовательская палитра — но мне не удалось предсказуемо сгенерировать светлый или тёмный файл для встраивания.

Чтобы проверить это, я удалил все темы и палитры, вернул всё к теме Light по умолчанию, а затем выполнил:

rake assets:precompile
rake assets:precompile:build

…ожидаю получить светлый embed_HASH.css. Но результат всё равно выглядел как тёмный стиль.

Я не очень хорошо знаком с внутренним устройством, поэтому, возможно, упускаю что-то очевидное. Если кто-то сможет подсказать, что необходимо сделать, чтобы embed_HASH.css собирался с предсказуемой палитрой, это очень помогло бы.

Заранее спасибо!

Кстати, мой экземпляр Discourse работает в Docker и полностью обновлён. Я использовал скрипт launcher и шаблон standalone.

Связанное чтение (для новых аккаунтов разрешено только 2 ссылки, третья — поисковый заголовок):

Я нашел частичный ответ на свой собственный вопрос и хотел поделиться этим insight:

Файл embed_[digest].css собирается с использованием выбранной цветовой палитры активной темы.

Проблема, как я понял, заключается в чрезмерно агрессивном кэшировании HTTP-ответов.

Что я все еще надеюсь узнать от кого-либо:
Где в Discourse кэшируются HTTP-ответы для файлов ресурсов?

Речь идет не только о кэшировании на стороне браузера — похоже, что кэширование происходит и на стороне сервера.


При отслеживании журнала production в Rails я наблюдаю, что только запросы с новым, ранее не встречавшимся набором параметров запроса вызывают новый рендеринг ресурса:

$ 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 в production?

Если у кого-то есть информация о том, как Discourse кэширует эти ответы ресурсов — или как правильно их инвалидировать — это было бы очень полезно.

О, черт :flushed_face: Это был Nginx!

Кратко:

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 отключит кэширование, но:

  • Файл nginx.sample.conf, используемый Discourse, имеет кэширование включённым по умолчанию, независимо от окружения
  • Это кэширование не связано с RAILS_ENV, поэтому оно не поможет с кэшированием встроенных ассетов

Поэтому, если вы не планируете полностью перенастраивать слой Nginx, просто очистите кэш вручную или закомментируйте эти строки, и всё будет хорошо. Когда будете готовы к продакшену, сможете вернуть всё как было.

:turtle: А что насчёт ./launcher rebuild standalone?

Конечно, это работает. Но если вы активно настраиваете темы, тестируете embed-элементы и подгоняете цвета… вам понадобится что-то быстрее, чем ожидание несколько минут каждый раз.

:speech_balloon: Есть лучший подход для разработки или быстрые решения? Присоединяйтесь к обсуждению!