Vorkompilierte JS-Assets für Self-Hosters vorgestellt

:mega: Discourse veröffentlicht jetzt vorkompilierte JavaScript-Assets, was die Installation und Updates erheblich beschleunigt, insbesondere für Server mit begrenzten Ressourcen.


Das Kompilieren und Optimieren von JavaScript-Assets war schon immer einer der ressourcenintensivsten Teile des Betriebs von Discourse. Da sich unsere Codebasis und das JavaScript-Ökosystem weiterentwickelt haben, ist dieser Prozess noch anspruchsvoller geworden.

In unseren Tests reduzieren diese Änderungen die Zeit für das Erstellen von Assets auf einem Digital Ocean Droplet mit 1 GB RAM von 45 Minuten auf nur 3 Minuten.

Wie funktioniert das?

Bei jedem Commit, der in main zusammengeführt wird, erstellt ein GitHub Actions Workflow die Assets und bündelt sie in .tar.gz-Dateien (eine für die Produktion, eine für die Entwicklung). Diese Bundles werden über GitHub Releases in einem dedizierten Repository veröffentlicht. Wir stellen sicher, dass die Assets veröffentlicht werden, bevor ein Commit zu tests-passed wechselt.

Beim Erstellen Ihrer eigenen Website prüft Discourse nun auf ein passendes vorkompiliertes Bundle und lädt es herunter. Plugins werden dann darauf aufgebaut. Wenn kein Bundle gefunden wird oder ein Fehler auftritt, greift Discourse auf das Erstellen aus dem Quellcode zurück.

Beeinträchtigt dies Endbenutzer?

Nein. Assets werden weiterhin von Ihrem eigenen Server / CDN an Endbenutzer ausgeliefert.

Kann ich mich abmelden?

Ja! Wenn Sie es vorziehen, Ihre eigenen Assets zu erstellen und über einen ausreichend leistungsfähigen Server verfügen, setzen Sie DISCOURSE_DOWNLOAD_PRE_BUILT_ASSETS: 0 in Ihrer app.yml-Datei.

Was ist, wenn ich eine geforkte oder gepatchte Version von Discourse ausführe?

Asset-Bundles werden nach dem Commit-Hash benannt. Wenn Sie einen Fork ausführen, wird kein Bundle gefunden und die Assets werden aus dem Quellcode erstellt. Wenn Ihre Discourse-Kopie gepatcht ist (d. h. der Git-Arbeitsbaum ist nicht sauber), versucht Discourse nicht, ein Bundle herunterzuladen.

Was ist mit anderen Asset-bezogenen Build-Schritten?

Derzeit gilt diese Optimierung nur für Kern-JS-Assets. In Zukunft könnten wir sie auf einige Plugins und andere Schritte wie gz/brotli-Kompression ausweiten.

Was ist mit dem stabilen Branch?

Vorkompilierte Assets für den stabilen Branch werden ab dem nächsten Major-Versionssprung veröffentlicht, der für August 2025 geplant ist.

54 „Gefällt mir“

Ich habe gerade einen Neuaufbau von https://discourse-on-a-pi5.falco.dev/ durchgeführt und es hat nur 3 Minuten und 35 Sekunden gedauert, das ist sehr beeindruckend!

23 „Gefällt mir“

Zwei Container-Setup und ohne Datenbank ~8 Minuten.

5 „Gefällt mir“

Wow :scream: :person_bowing:

Ich habe diese Option nicht in meiner Konfiguration. Muss ich sie mit dem Wert 1 hinzufügen, um mich anzumelden? Oder geschieht all dies einfach magisch, wenn ich das nächste Mal aktualisiere?

FYI, das passiert, wenn Ihre Installation die Kriterien nicht erfüllt:

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 ist kleiner als 2048MB. Setze --max-old-space-size=2048 und CHEAP_SOURCE_MAPS=1
[assemble_ember_build] Keine vorhandene Build-Info-Datei gefunden.
[assemble_ember_build] Git-Arbeitsverzeichnis ist nicht sauber. Vorkompilierte Assets können nicht heruntergeladen werden.
[assemble_ember_build] Führe vollständigen Core-Build aus...

Ich nehme einige Anpassungen an config/initializers/100-sidekiq.rb in app.yml vor, um Unterstützung für eine Wiederholungsanzahl für alle Sidekiq-Jobs hinzuzufügen (was ich für den einzigen Weg halte, dies zu erreichen und nicht innerhalb eines Plugins? Aber das könnte ich noch einmal überdenken), daher glaube ich, dass dies ausreicht, um die Kriterien nicht zu erfüllen …

2 „Gefällt mir“

Es ist standardmäßig aktiviert. Sie müssen die Konfiguration nur angeben, wenn Sie sich abmelden möchten.

Ja, genau. Jede Art von Unterschied im Git-Repository führt dazu, dass es fehlschlägt.

Bezüglich des Sidekiq-Dings: Wenn Sie ein Thema dazu eröffnen, bin ich sicher, dass wir einen Weg finden können, dies entweder über ein Plugin zu tun, oder wir könnten eine neue GlobalSetting dafür einführen.

4 „Gefällt mir“

Übrigens, eine sehr einfache Methode, Ihre Builds zu timen, ohne dass Sie an Ihrer Konsole bleiben müssen, ist die folgende:

time ./launcher rebuild app
11 „Gefällt mir“

Schöne Änderung. Ich bekomme ein

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

Vielen Dank für Ihre Arbeit

4 „Gefällt mir“

Wow Beeindruckend, wurde das Datum festgelegt? Meine Version ist a81eaacb1c53581912519ae6574fa3523ef215dd Sollte ich auf einen neuen Build warten?

Oh, nett :star_struck:

Danke dafür, @merefield – ich kann nicht glauben, dass ich das erst jetzt nach 7 Jahren und mehreren hundert Kommandozeilen-Neuerstellungen herausfinde :grin:

5 „Gefällt mir“

Wenn Sie unseren Standard-Release-Kanal befolgen, können Sie jetzt neu bauen und die Vorteile nutzen.

4 „Gefällt mir“

Die Einzigen! Danke.

1 „Gefällt mir“

4 Minuten zum Wiederaufbau. Ich habe das heute ein paar Mal gemacht, vollständig migriert! Beeindruckend, Discourse! Beim nächsten Wiederaufbau werde ich daran denken, diesen schönen Befehl zu verwenden, danke an alle.

1 „Gefällt mir“

Vielleicht wäre es eine Idee, dies auf app/assets, config/locales für Core und Plugins zu beschränken? Im Moment führt dies auch zu einem vollständigen Neuaufbau, wenn nur Ruby-spezifische (Sicherheits-)Patches angewendet wurden.

Ja, es ist möglich, dies weiter einzuschränken. Bei Sicherheitspatches ist es jedoch recht üblich, dass sie sich auch auf die JS-Anwendung auswirken … sodass ein vollständiger Neuaufbau immer noch notwendig sein wird.

2 „Gefällt mir“

Ich habe es gerade ausprobiert, es ist fantastisch, ~3 Minuten! Was für eine clevere und erstaunliche Funktion. :star_struck:
Jetzt möchte ich jedes vorhandene Plugin einzeln installieren. :rofl:

5 „Gefällt mir“

Wirklich wirklich, das ist großartig

Eigentlich glaube ich, dass das das Gegenteil bewirken würde, wenn ich es richtig verstehe.

Sie sehen, es kann nur die kompilierten Assets für den gebündelten Kerncode verwenden (und das erklärt weitgehend die jüngste Entscheidung, die beliebten Kern-Plugins zu bündeln!)

Es muss jedes „unbekannte“ Plugin während des Builds erstellen und bündeln, sodass viele davon es erheblich verlangsamen würden.

2 „Gefällt mir“

Aktualisierung auf 3.6.0.beta1 und die vorkompilierten Assets werden nicht gefunden

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 „Gefällt mir“

Zielen Sie mit dieser Installation auf das beta-Tag ab?