Asset di Discourse mancanti

Ciao,
Ho installato Discourse su un server Fedora 31 seguendo la guida di installazione consigliata, ma ho utilizzato podman invece di Docker per eseguire il container. All’inizio, questa mattina, tutto è andato perfettamente, ma ho avuto problemi a far funzionare HTTP semplice sul mio Nginx sull’host e ho dovuto utilizzare i certificati SSL su entrambe le istanze di Nginx. Ho configurato Discourse e tutto è stato ok.
Più tardi ho deciso di ricostruire Discourse disattivando SSL e costruendolo con un account utente non root. HTTP semplice sull’host ha funzionato correttamente, ma ho ottenuto una pagina bianca (il titolo era corretto e l’icona favicon funzionava).


Ho controllato la directory nel 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
...

I file richiesti sono effettivamente mancanti, come conferma anche Nginx:

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/"

Pensavo che si trattasse di un problema della mia installazione, dato che stamattina erano presenti nell’installazione precedente eseguita come root sull’host! Ho cancellato la cartella condivisa e ricostruito come utente non root, ottenendo sempre gli stessi risultati. Poi ho riprovato, stavolta come root con impostazioni identiche a quelle di stamattina, ma ho riscontrato gli stessi problemi.
Un’installazione come utente non root mostra sempre la pagina “Congratulations, you have installed Discourse!”, ma dopo aver completato l’installazione ottengo una pagina vuota perché i file delle risorse sono mancanti.

Esiste un modo per risolvere il problema delle risorse mancanti?

Nel caso qualcuno si chieda se abbia funzionato davvero questa mattina, ecco uno screenshot dal mio cellulare


Discourse non mi permette ancora di usare due immagini in un singolo post :slight_smile:

Ho modificato questo come un bug. Non riesco a ottenere una versione con tutte le risorse durante la compilazione di tests-passed. Ho provato ad entrare nel contenitore ed eseguire rake assets:precompile, ma le stesse risorse risultano ancora assenti.

Sembra che dopo un mucchio di rebuild, ora funzioni magicamente. Strano.

Ciao Adriany, benvenuto nel forum

Per quanto ne sappia, Docker è un requisito obbligatorio, non un’opzione. Dove hai trovato questa nuova guida all’installazione?

Ho appena sostituito Docker con Podman, funziona perfettamente. La loro sintassi da riga di comando è compatibile.

Ok, dopo alcuni test, posso confermare che mostra sempre una pagina vuota dopo ogni rebuild. Se eseguo RAILS_ENV=production bin/rake assets:precompile, funziona sempre dopo. Non ho idea del perché, dato che dovrebbe comunque compilarli durante un rebuild?

Hai visto questo argomento e in particolare questo post sull’incompatibilità di Podman con Docker?

Funziona effettivamente. Podman non dovrebbe influenzare quali file saranno il risultato della precompilazione iniziale delle risorse.

Nella fase di compilazione delle risorse del rebuild, vedi qualche backtrace nell’output?

Siamo qui perché qualcosa non funziona. Dovrebbe e funziona sono stati diversi.

Stai affermando con sicurezza che Podman non è coinvolto. Sarebbe utile dimostrarlo per eliminarlo chiaramente come fattore. Per quanto ne so, non hai completato il metodo di installazione ufficiale con Docker per verificare se questo risolve il problema.

Sì, lo faccio.

Io, [2020-01-12T20:58:31.800117 #1]  INFO -- : > cd /var/www/discourse && su discourse -c 'bundle exec rake assets:precompile'
Eliminazione dei file temporanei
Bundling degli asset
I, [2020-01-12T20:58:38.208107 #758]  INFO -- : Scrittura di /var/www/discourse/public/assets/vendor-3b0a3ac5e0bc628422d6e99d3563fad4c474398644f70683eff0893b7a241513.js
I, [2020-01-12T20:59:02.428630 #758]  INFO -- : Scrittura di /var/www/discourse/public/assets/admin-91c2a24a61c0ecd0200db1e808dbadafb9f0f1bb5179acea5b2b7dbd4b4cc5f9.js
I, [2020-01-12T20:59:02.447192 #758]  INFO -- : Scrittura di /var/www/discourse/public/assets/preload-store-d32dcf974dddcac742f8a7a6aa7fcd686185920b201029d0ecb2b85527ef9034.js
I, [2020-01-12T20:59:02.707559 #758]  INFO -- : Scrittura di /var/www/discourse/public/assets/browser-update-1741a2ed67a367faeb0a582af064457e8b1b1354e52e6efcf8bf26301166dec8.js
I, [2020-01-12T20:59:02.753632 #758]  INFO -- : Scrittura di /var/www/discourse/public/assets/break_string-cc617154cd957804f2f6a1f3bc68258c9cdca3d4b9a322bf777d145fed04790e.js
I, [2020-01-12T20:59:04.073148 #758]  INFO -- : Scrittura di /var/www/discourse/public/assets/ember_jquery-c2cca4a19fd4c70eabc95b010a6d7643955ec2a2251aeb1d70f625773eebea21.js
I, [2020-01-12T20:59:06.303026 #758]  INFO -- : Scrittura di /var/www/discourse/public/assets/pretty-text-bundle-fa6ea00e2000bf2f9ed3f069be9253477fed5e7290b5d109a3e2d9498ac70e81.js
... [snip]
108798.339928812 Compressione: 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


Compressione completata per vendor-3b0a3ac5e0bc628422d6e99d3563fad4c474398644f70683eff0893b7a241513.js: 3,33 secondi

108801.669283898 Compressione: 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
[...]

Li compila effettivamente, ma devo sempre rifarlo dopo la build per far apparire i file mancanti.

Interessante, quindi i file vengono creati correttamente, ma la persistenza fallisce?

Dovresti verificare come funziona il volume di Podman e quale driver lo supporta. Nel mondo Docker abbiamo avuto tantissimi problemi strani con i driver di archiviazione nel corso degli anni, tanto che abbiamo persino mantenuto un elenco di driver “approvati” nel nostro script di avvio.

Per essere chiari, i miei esperimenti con Podman stavano testando davvero launcher, non Discourse. Almeno al momento dei test, dipendeva dai dettagli dell’output di Docker che Podman non cerca di emulare.

@Adriany, immagino tu stia utilizzando il driver di archiviazione predefinito, che è lo stesso raccomandato per Discourse, ovvero “overlay2” in Docker — ma non so se sia effettivamente questo il tuo caso.

Sto utilizzando overlayfs, che è l’equivalente di overlay2.
È interessante notare che, dopo alcuni build con asset mancanti quando ho provato ad aggiungere plugin, è stato costruito correttamente senza alcun asset mancante. Quando ho ricostruito senza plugin, tutto è andato liscio come il burro. Strano?

Modifica: Ha funzionato per me e ora gli asset sono memorizzati nella cache qui. Durante l’esecuzione, ha smesso di funzionare per altri utenti.

Modifica 2: Un’altra ricostruzione ha fatto rompere gli asset come prima e la soluzione è stata ricostruire come prima.

Se i file vengono creati correttamente dal nostro asset pipeline e il sistema operativo non segnala errori, ma scompaiono dopo la ricompilazione (che di fatto riavvia il container), punterei di nuovo (o nuovamente) sul driver di storage di Podman.

A meno che qualcuno non riesca a riprodurre lo stesso comportamento usando Docker (e in tal caso ci sarebbero diversi argomenti da trattare), temo che dobbiate aprire un ticket sul progetto Podman per questo problema.

Ciao,
ho fatto ulteriori indagini e sembra che mi fossi sbagliato sulle mie ipotesi su dove siano archiviati i file, o semplicemente non sono stato bravo a trovarli.

I file restituiscono tutti un errore 404, però prendi questo come esempio:

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

Sono lì, quindi immagino che si tratti di un problema di Discourse e non di Podman; semplicemente non sono riuscito a cercare i file nel modo giusto.

Pensavo potesse essere un problema di Cloudflare, ma quando eseguo un rapido curl su localhost dal server, ottengo comunque un errore 404.

Puoi fornirci una riprova di questo problema su Docker?