Assets Theme einbetten

Hallo zusammen,

ich habe einige Threads durchsucht, um Antworten zu finden – und viele gefunden (siehe unten – danke!). Dank dieser kann ich die Dinge größtenteils so gestalten, wie ich es möchte. Aber es gibt noch eine Frage, die ich nicht lösen konnte.

Es betrifft die eingebetteten Asset-Dateien, insbesondere die Datei embed_HASH.css.

Es scheint, dass diese Assets beim Erstellen nicht mit der Farbpalette des aktiven Themes kompiliert werden. Das mag beabsichtigt sein oder etwas, das ich übersehen habe.

Hier ist, worüber ich gerne Klarheit hätte:

  1. Wird embed_[digest].css immer mit der Standardpalette erstellt?
    Wenn ja, kann ich damit leben – ich weiß, dass viel Arbeit investiert wird, um die Handhabung von Themes und Farbpaletten in Discourse zu verbessern.
  2. Wenn es mit einer benutzerdefinierten Palette erstellt werden kann, wie kann ich dieses Verhalten auslösen?
  3. Ich habe bemerkt, dass es mit den hellen oder dunklen Paletten des Systems erstellt werden kann, daher scheint es plausibel, dass eine benutzerdefinierte Palette verwendet werden könnte – aber ich konnte keine hellen oder dunklen Embed-Dateien vorhersagbar generieren.

Um dies zu testen, habe ich alle Themes und Paletten gelöscht, alles auf das Standard-Light-Theme zurückgesetzt und dann Folgendes ausgeführt:

rake assets:precompile
rake assets:precompile:build

…in Erwartung einer hellen embed_HASH.css-Datei. Aber das Ergebnis schien immer noch dunkle Stile zu verwenden.

Ich bin mit den Interna nicht tief vertraut, daher könnte ich etwas Offensichtliches übersehen. Wenn mir jemand mitteilen könnte, was erforderlich ist, damit die embed_HASH.css mit einer vorhersagbaren Palette erstellt wird, wäre das eine große Hilfe.

Vielen Dank im Voraus!

Zu Ihrer Information: Meine Discourse-Instanz läuft in Docker und ist auf dem neuesten Stand. Ich habe das launcher-Skript und die Standalone-Vorlage verwendet.

Verwandte Lektüre (nur 2 Links für neue Konten erlaubt, der 3. ist ein durchsuchbarer Titel):

Ich habe eine Teilantwort auf meine eigene Frage gefunden und wollte diese Erkenntnis teilen:

Die Datei embed_[digest].css wird mit der ausgewählten Farbpalette des aktiven Themas erstellt.

Das Problem, wie ich inzwischen erkannt habe, liegt an einem sehr aggressiven HTTP-Antwort-Caching.

Worauf ich immer noch hoffe, dass jemand antwortet, ist:
Wo werden die HTTP-Antworten für Asset-Dateien in Discourse zwischengespeichert?

Dies ist nicht nur Browser-seitiges Caching – es scheint auch serverseitig zu sein.


Beim Verfolgen des Rails-Produktionsprotokolls beobachte ich, dass nur Anfragen mit einem neuen, noch nie gesehenen Satz von Query-Parametern eine erneute Asset-Renderung auslösen:

$ 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

Danach geben alle nachfolgenden Anfragen für dieselbe URL (auch mit unterschiedlichen Query-Strings) die gleiche Antwort zurück – selbst wenn sich das zugrunde liegende Thema geändert hat.

Zum Beispiel:

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

Ich sehe aktualisierte Theme-Stile nur beim ersten Mal, wenn eine eindeutige Abfrage verwendet wird. Alle zukünftigen Anfragen mit denselben Parametern liefern die vorherige Version, selbst nach der Neukompilierung.

Das launcher-Skript verwendet standardmäßig RAILS_ENV=production, und ich habe das so belassen. Ich könnte versuchen, zu RAILS_ENV=development zu wechseln, um das Caching während der Entwicklung vollständig zu deaktivieren, aber idealerweise würde ich gerne wissen:

Wie können wir HTTP-Level-Caching von Asset-Antworten in der Produktion löschen oder deaktivieren?

Wenn jemand Einblicke hat, wie Discourse diese Asset-Antworten zwischenspeichert – oder wie man sie ordnungsgemäß invalidiert –, wäre das sehr hilfreich.

1 „Gefällt mir“

Oh, Mann :flushed_face: Es war Nginx!

TL;DR:

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

Sofortige Lösung!


Optional: Nginx Asset Caching deaktivieren

Bearbeiten Sie diese Datei:

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

Kommentieren Sie um die Zeilen 243-246 herum die Caching-Direktiven aus:

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

Starten Sie dann Nginx neu:

sv restart nginx

:artist_palette: Wenn Sie Farbpaletten ändern…

Nur die Farbeinstellungen im Theme zu bearbeiten, generiert embed_[digest].css nicht neu. Um Discourse zu zwingen, neue Asset-Dateien zu generieren, tun Sie Folgendes:

rm tmp/stylesheet-cache/* # oder, nur für Embed, `rm tmp/stylesheet-cache/embed*`

:thinking: Was ist mit RAILS_ENV=development?

Sie denken vielleicht, dass das Setzen von RAILS_ENV: development das Caching deaktiviert, aber:

  • Die von Discourse verwendete nginx.sample.conf hat das Caching standardmäßig aktiviert, unabhängig von der Umgebung
  • Dieses Caching ist nicht an RAILS_ENV gebunden, daher hilft es nicht beim Caching von eingebetteten Assets

Solange Sie also nicht die gesamte Nginx-Schicht neu konfigurieren möchten, leeren Sie einfach den Cache manuell oder deaktivieren Sie diese Zeilen, und Sie sind fertig. Sobald Sie bereit für die Produktion sind, können Sie zurückkehren.

:turtle: Was ist mit ./launcher rebuild standalone?

Sicher, es funktioniert. Aber wenn Sie aktiv Themes bearbeiten, Embeds testen und Farben abstimmen… werden Sie etwas Schnelleres wollen, als jedes Mal ein paar Minuten zu warten.

:speech_balloon: Haben Sie ein besseres Entwicklungssetup oder schnelle Lösungen? Melden Sie sich!

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