Fehlende Discourse-Assets

Hallo,

ich habe Discourse auf einem Fedora-31-Server gemäß der empfohlenen Installationsanleitung installiert, dabei jedoch Podman statt Docker zur Ausführung des Containers verwendet. Beim ersten Setup heute Morgen lief alles reibungslos. Allerdings hatte ich Probleme, einfaches HTTP zu meinem Nginx auf dem Host zum Laufen zu bekommen, und musste daher SSL-Zertifikate auf beiden Nginx-Instanzen verwenden. Ich habe Discourse entsprechend konfiguriert, und alles funktionierte.

Später entschied ich mich, Discourse neu zu bauen, diesmal ohne SSL und unter einem Nicht-Root-Benutzerkonto. Einfaches HTTP zum Host funktionierte einwandfrei, doch ich erhielt eine weiße Seite (der Titel wurde korrekt angezeigt, das Favicon ebenfalls).

Ich überprüfte das Verzeichnis im Container:

root@xena-app:/var/www/discourse# ls public/assets -al
total 15640
drwxr-xr-x. 2 discourse discourse      10 Jan 11 13:54 .
drwxr-xr-x. 3 discourse discourse      29 Jan 11 13:57 ..
-rw-r--r--. 1 discourse discourse     595 Jan 11 13:49 _activate-account-7a1f8d46287194007ee607f79af56217e6e6238e4ca159c5da6974005a1254c5.js
-rw-r--r--. 1 discourse discourse     250 Jan 11 13:54 activate-account-7a1f8d46287194007ee607f79af56217e6e6238e4ca159c5da6974005a1254c5.js.br
-rw-r--r--. 1 discourse discourse     420 Jan 11 13:54 activate-account-7a1f8d46287194007ee607f79af56217e6e6238e4ca159c5da6974005a1254c5.js.gz
-rw-r--r--. 1 discourse discourse     695 Jan 11 13:54 activate-account-7a1f8d46287194007ee607f79af56217e6e6238e4ca159c5da6974005a1254c5.js.map
-rw-r--r--. 1 discourse discourse  990519 Jan 11 13:50 _admin-91c2a24a61c0ecd0200db1e808dbadafb9f0f1bb5179acea5b2b7dbd4b4cc5f9.js
-rw-r--r--. 1 discourse discourse   83903 Jan 11 13:54 admin-91c2a24a61c0ecd0200db1e808dbadafb9f0f1bb5179acea5b2b7dbd4b4cc5f9.js.br
-rw-r--r--. 1 discourse discourse  106465 Jan 11 13:54 admin-91c2a24a61c0ecd0200db1e808dbadafb9f0f1bb5179acea5b2b7dbd4b4cc5f9.js.gz
-rw-r--r--. 1 discourse discourse  366446 Jan 11 13:54 admin-91c2a24a61c0ecd0200db1e808dbadafb9f0f1bb5179acea5b2b7dbd4b4cc5f9.js.map
drwxr-xr-x. 2 discourse discourse    4096 Jan 11 13:54 admin-login
...

Die angeforderten Dateien fehlen tatsächlich, was auch Nginx bestätigt:

2020/01/11 13:59:49 [error] 60#60: *20 open() "/var/www/discourse/public/assets/plugins/poll-57c9059384e3daeaee3d974c985d85a2b8462bb2629eb0b1834451056d1e1459.js" failed (2: No such file or directory), client: 10.0.2.2, server: _, request: "GET /assets/plugins/poll-57c9059384e3daeaee3d974c985d85a2b8462bb2629eb0b1834451056d1e1459.js HTTP/1.0", host: "idlerpg.xyz", referrer: "https://idlerpg.xyz/"

Ich dachte zunächst, es liege an meiner Installation, da die Dateien heute Morgen noch bei der Root-Installation auf dem Host vorhanden waren! Ich habe den freigegebenen Ordner gelöscht und die Installation als Nicht-Root-Benutzer mehrfach wiederholt, jedoch mit denselben Ergebnissen. Anschließend habe ich es erneut als Root versucht, mit exakt denselben Einstellungen wie heute Morgen, und bekam dieselben Probleme.

Eine Installation als Nicht-Root-Benutzer zeigt immer die Seite „Congratulations, you have installed Discourse!“, doch sobald ich die Installation abgeschlossen habe, erscheint eine leere Seite, da die Asset-Dateien fehlen.

Gibt es eine Möglichkeit, das Problem mit den fehlenden Assets zu beheben?

Falls sich jemand fragt, ob es heute Morgen wirklich funktioniert hat, hier ist ein Screenshot von meinem Handy:


Discourse erlaubt es mir noch nicht, zwei Bilder in einem Beitrag zu verwenden :slight_smile:

Ich habe dies als Fehler markiert. Ich bekomme keine Version mit allen Assets, wenn ich tests-passed erstelle.
Ich habe versucht, den Container zu betreten und rake assets:precompile auszuführen, aber die gleichen Assets fehlen immer noch.

Nach unzähligen Neubuilds funktioniert es jetzt auf magische Weise. Seltsam.

Hallo Adriany, willkommen im Forum!

Soweit ich weiß, ist Docker eine Voraussetzung und keine Option. Wo hast du diesen neueren Installationsleitfaden gesehen?

Ich habe Docker gerade durch Podman ersetzt, es funktioniert einwandfrei. Ihre Befehlszeilensyntax ist kompatibel.

Okay, nach einigem Testen kann ich jetzt sagen, dass nach jedem Rebuild immer eine leere Seite angezeigt wird. Wenn ich RAILS_ENV=production bin/rake assets:precompile ausführe, funktioniert es danach immer. Keine Ahnung warum, sie sollten bei einem Rebuild sowieso kompiliert werden?

Hast du diesen Beitrag gesehen, insbesondere diesen hier zur Inkompatibilität von Podman mit Docker?

Das funktioniert tatsächlich. Podman sollte keinen Einfluss darauf haben, welche Dateien das Ergebnis des initialen Asset-Precompiles sind.

Siehst du während der Kompilierungsphase der Assets beim Neuaufbau irgendwelche Backtraces in der Ausgabe?

Wir sind hier, weil etwas nicht funktioniert. Sollte und tut sind unterschiedliche Zustände.

Sie behaupten mit Zuversicht, dass Podman nicht beteiligt ist. Es wäre gut, das zu beweisen, um es eindeutig als Faktor auszuschließen. Soweit ich weiß, haben Sie die offizielle Installationsmethode mit Docker noch nicht durchgeführt, um zu prüfen, ob das Problem dadurch behoben wird.

Ja, das tue ich.

I, [2020-01-12T20:58:31.800117 #1]  INFO -- : > cd /var/www/discourse && su discourse -c 'bundle exec rake assets:precompile'
Temporäre Dateien werden bereinigt
Assets werden gebündelt
I, [2020-01-12T20:58:38.208107 #758]  INFO -- : Schreiben von /var/www/discourse/public/assets/vendor-3b0a3ac5e0bc628422d6e99d3563fad4c474398644f70683eff0893b7a241513.js
I, [2020-01-12T20:59:02.428630 #758]  INFO -- : Schreiben von /var/www/discourse/public/assets/admin-91c2a24a61c0ecd0200db1e808dbadafb9f0f1bb5179acea5b2b7dbd4b4cc5f9.js
I, [2020-01-12T20:59:02.447192 #758]  INFO -- : Schreiben von /var/www/discourse/public/assets/preload-store-d32dcf974dddcac742f8a7a6aa7fcd686185920b201029d0ecb2b85527ef9034.js
I, [2020-01-12T20:59:02.707559 #758]  INFO -- : Schreiben von /var/www/discourse/public/assets/browser-update-1741a2ed67a367faeb0a582af064457e8b1b1354e52e6efcf8bf26301166dec8.js
I, [2020-01-12T20:59:02.753632 #758]  INFO -- : Schreiben von /var/www/discourse/public/assets/break_string-cc617154cd957804f2f6a1f3bc68258c9cdca3d4b9a322bf777d145fed04790e.js
I, [2020-01-12T20:59:04.073148 #758]  INFO -- : Schreiben von /var/www/discourse/public/assets/ember_jquery-c2cca4a19fd4c70eabc95b010a6d7643955ec2a2251aeb1d70f625773eebea21.js
I, [2020-01-12T20:59:06.303026 #758]  INFO -- : Schreiben von /var/www/discourse/public/assets/pretty-text-bundle-fa6ea00e2000bf2f9ed3f069be9253477fed5e7290b5d109a3e2d9498ac70e81.js
... [ausgelassen]
108798.339928812 Komprimieren: vendor-3b0a3ac5e0bc628422d6e99d3563fad4c474398644f70683eff0893b7a241513.js
uglifyjs '/var/www/discourse/public/assets/_vendor-3b0a3ac5e0bc628422d6e99d3563fad4c474398644f70683eff0893b7a241513.js' -m -c -o '/var/www/discourse/public/assets/vendor-3b0a3ac5e0bc628422d6e99d3563fad4c474398644f70683eff0893b7a241513.js' --source-map "root='/assets',url='/assets/vendor-3b0a3ac5e0bc628422d6e99d3563fad4c474398644f70683eff0893b7a241513.js.map'" --output '/var/www/discourse/public/assets/vendor-3b0a3ac5e0bc628422d6e99d3563fad4c474398644f70683eff0893b7a241513.js'
gzip -f -c -9 /var/www/discourse/public/assets/vendor-3b0a3ac5e0bc628422d6e99d3563fad4c474398644f70683eff0893b7a241513.js > /var/www/discourse/public/assets/vendor-3b0a3ac5e0bc628422d6e99d3563fad4c474398644f70683eff0893b7a241513.js.gz

brotli -f --quality=11 /var/www/discourse/public/assets/vendor-3b0a3ac5e0bc628422d6e99d3563fad4c474398644f70683eff0893b7a241513.js --output=/var/www/discourse/public/assets/vendor-3b0a3ac5e0bc628422d6e99d3563fad4c474398644f70683eff0893b7a241513.js.br


Komprimieren von vendor-3b0a3ac5e0bc628422d6e99d3563fad4c474398644f70683eff0893b7a241513.js abgeschlossen: 3,33 Sek.

108801.669283898 Komprimieren: admin-91c2a24a61c0ecd0200db1e808dbadafb9f0f1bb5179acea5b2b7dbd4b4cc5f9.js
uglifyjs '/var/www/discourse/public/assets/_admin-91c2a24a61c0ecd0200db1e808dbadafb9f0f1bb5179acea5b2b7dbd4b4cc5f9.js' -m -c -o '/var/www/discourse/public/assets/admin-91c2a24a61c0ecd0200db1e808dbadafb9f0f1bb5179acea5b2b7dbd4b4cc5f9.js' --source-map "root='/assets',url='/assets/admin-91c2a24a61c0ecd0200db1e808dbadafb9f0f1bb5179acea5b2b7dbd4b4cc5f9.js.map'" --output '/var/www/discourse/public/assets/admin-91c2a24a61c0ecd0200db1e808dbadafb9f0f1bb5179acea5b2b7dbd4b4cc5f9.js'
gzip -f -c -9 /var/www/discourse/public/assets/admin-91c2a24a61c0ecd0200db1e808dbadafb9f0f1bb5179acea5b2b7dbd4b4cc5f9.js > /var/www/discourse/public/assets/admin-91c2a24a61c0ecd0200db1e808dbadafb9f0f1bb5179acea5b2b7dbd4b4cc5f9.js.gz
[...]

Es kompiliert sie zwar, aber ich muss es nach dem Build immer wiederholen, damit die fehlenden Dateien erscheinen.

Interessant, die Dateien werden also einwandfrei erstellt, aber die Persistenz schlägt fehl?

Ich würde mir ansehen, wie das Podman-Volume funktioniert und welcher Treiber dahintersteckt. In der Docker-Welt haben wir im Laufe der Jahre viele seltsame Probleme mit Storage-Treibern gehabt, weshalb wir sogar eine Liste „gesegneter

Um klar zu sein: Meine Experimente mit Podman dienten tatsächlich dem Testen von Launcher, nicht von Discourse. Zumindest als ich es getestet habe, hing es von Docker-spezifischen Ausgabe-Details ab, die Podman nicht zu emulieren versucht.

@Adriany, ich vermute, du verwendest den Standard-Speicherdriver, der auch für Discourse empfohlen wird. In Docker ist dies „overlay2* — ich weiß jedoch nicht, ob dies bei dir der Fall ist.

Ich verwende overlayfs, was dem overlay2 entspricht.
Interessanterweise lief es nach einigen weiteren Builds mit fehlenden Assets, als ich Plugins hinzufügen wollte, plötzlich einwandfrei ohne fehlende Assets. Als ich ohne Plugins neu buildete, lief es butterweich. Wie kommt das?

Edit: Es hat bei mir funktioniert, und jetzt sind die Assets hier zwischengespeichert. Während des Betriebs funktionierte es für andere Benutzer nicht mehr.

Edit 2: Ein weiterer Build hat die Assets wieder wie zuvor kaputt gemacht, und die Lösung bestand darin, wie zuvor neu zu builden.

Wenn die Dateien erfolgreich von unserer Asset-Pipeline erstellt werden und das Betriebssystem keinen Fehler meldet, sie aber nach dem Neuaufbau (der effektiv den Container neu startet) verschwinden, würde ich meine Wette erneut auf den Podman-Storage-Treiber setzen.

Sofern niemand dieses Verhalten mit Docker reproduzieren kann (und es gäbe dann mehrere Themen dazu, falls dies der Fall wäre), fürchte ich, dass Sie ein Ticket beim Podman-Projekt zu diesem Thema eröffnen müssen.

Hey,
ich habe weitere Recherchen angestellt und es scheint, als hätte ich mich bei meiner Vermutung, wo die Dateien gespeichert sind, geirrt, oder ich war einfach nur dumm beim Suchen.

Die Dateien liefern alle einen 404-Fehler. Nehmen Sie jedoch dieses Beispiel:

root@idlerpg:/var/www/discourse# find . -type f -name "*discourse-solved*"
./tmp/stylesheet-cache/discourse-solved_9_cb2984706f4402e95fd787160a5588ed0972ccc3.css
./tmp/stylesheet-cache/discourse-solved_9_cb2984706f4402e95fd787160a5588ed0972ccc3.css.map
./public/assets/plugins/_discourse-solved-5b7312e4207059eb2654a46e804b4c899cfc1e2a362d0d60e580943f9eb9d419.js
./public/assets/plugins/discourse-solved-5b7312e4207059eb2654a46e804b4c899cfc1e2a362d0d60e580943f9eb9d419.js.gz
./public/assets/plugins/discourse-solved-5b7312e4207059eb2654a46e804b4c899cfc1e2a362d0d60e580943f9eb9d419.js.br
./public/assets/plugins/discourse-solved-5b7312e4207059eb2654a46e804b4c899cfc1e2a362d0d60e580943f9eb9d419.js.map
./app/assets/javascripts/plugins/discourse-solved.js.erb
./plugins/discourse-solved/test/javascripts/acceptance/discourse-solved-test.js.es6

Sie sind vorhanden. Ich vermute daher, dass es sich um ein Problem mit Discourse und nicht mit Podman handelt. Ich habe die Dateien einfach nicht richtig gesucht.

Ich dachte, es könnte ein Problem bei Cloudflare sein, aber wenn ich einen schnellen curl-Befehl auf localhost des Servers ausführe, erhalte ich ebenfalls einen 404-Fehler.

Könntest du uns eine Reproduktion dieses Problems unter Docker geben?