Ativos do Discourse ausentes

Olá,
Instalei o Discourse em um servidor Fedora 31 seguindo o guia de instalação recomendado, mas usei o podman em vez do Docker para executar o container. Tudo funcionou perfeitamente nesta manhã quando configurei inicialmente, porém tive problemas para fazer o HTTP simples chegar ao Nginx no host e precisei usar os certificados SSL em ambas as instâncias do Nginx. Configurei o Discourse e tudo ficou ok.
Mais tarde, decidi reconstruir o Discourse com SSL desativado e fazer a build em uma conta de usuário não root. O HTTP simples para o host funcionou bem, mas apareceu uma página em branco (o título estava correto e o favicon também).


Verifiquei o diretório dentro do 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
...

Os arquivos solicitados realmente estão faltando, e o Nginx confirma isso:

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

Pensei que isso fosse um problema da minha instalação, pois os arquivos estavam presentes na instalação antiga nesta manhã, rodando como root no host! Apaguei a pasta compartilhada e reconstruí como usuário não root, obtendo os mesmos resultados repetidamente. Então tentei novamente, desta vez como root, com as mesmas configurações da manhã, e os mesmos problemas persistiram.
Uma instalação como usuário não root sempre mostra a página “Parabéns, você instalou o Discourse!”, mas, ao finalizar a instalação, obtenho a página em branco porque os arquivos de assets estão faltando.

Existe alguma maneira de corrigir a ausência dos assets?

Caso alguém esteja se perguntando se realmente funcionou esta manhã, aqui está uma captura de tela do meu celular


O Discourse ainda não permite que eu use 2 imagens em uma única postagem :slight_smile:

Mudei isso para um bug. Não consigo obter uma versão com todos os ativos ao executar tests-passed. Tentei entrar no container e executar um rake assets:precompile, mas os mesmos ativos continuam ausentes.

Parece que, depois de toneladas de reconstruções, agora funciona magicamente. Estranho.

Olá Adriany, bem-vindo ao fórum

Pelo que eu sei, o docker é um requisito, não uma opção. Onde você viu esse novo guia de instalação?

Acabei de substituir o Docker pelo Podman, funciona perfeitamente. A sintaxe da linha de comando deles é compatível.

Certo, depois de alguns testes, posso afirmar que ele sempre exibe uma página em branco após cada rebuild. Se eu executar RAILS_ENV=production bin/rake assets:precompile, tudo funciona normalmente em seguida. Não faço ideia do porquê, já que ele deveria compilá-los durante o rebuild de qualquer forma?

Você viu este tópico e, em particular, esta postagem sobre a incompatibilidade do Podman com o Docker?

Bem, realmente funciona. O Podman não deve influenciar quais arquivos serão o resultado do pré-compilamento inicial de ativos.

Na fase de compilação de assets da reconstrução, você vê algum backtrace na saída?

Estamos aqui porque algo não está funcionando. O que deveria acontecer e o que acontece são estados diferentes.

Você está afirmando com confiança que o Podman não está envolvido. Seria bom provar isso para eliminá-lo claramente como um fator. Pelo que sei, você não completou o método de instalação oficial com o Docker para ver se isso elimina o problema.

Sim, eu faço.

I, [2020-01-12T20:58:31.800117 #1]  INFO -- : > cd /var/www/discourse && su discourse -c 'bundle exec rake assets:precompile'
Limpando arquivos temporários
Empacotando assets
I, [2020-01-12T20:58:38.208107 #758]  INFO -- : Escrevendo /var/www/discourse/public/assets/vendor-3b0a3ac5e0bc628422d6e99d3563fad4c474398644f70683eff0893b7a241513.js
I, [2020-01-12T20:59:02.428630 #758]  INFO -- : Escrevendo /var/www/discourse/public/assets/admin-91c2a24a61c0ecd0200db1e808dbadafb9f0f1bb5179acea5b2b7dbd4b4cc5f9.js
I, [2020-01-12T20:59:02.447192 #758]  INFO -- : Escrevendo /var/www/discourse/public/assets/preload-store-d32dcf974dddcac742f8a7a6aa7fcd686185920b201029d0ecb2b85527ef9034.js
I, [2020-01-12T20:59:02.707559 #758]  INFO -- : Escrevendo /var/www/discourse/public/assets/browser-update-1741a2ed67a367faeb0a582af064457e8b1b1354e52e6efcf8bf26301166dec8.js
I, [2020-01-12T20:59:02.753632 #758]  INFO -- : Escrevendo /var/www/discourse/public/assets/break_string-cc617154cd957804f2f6a1f3bc68258c9cdca3d4b9a322bf777d145fed04790e.js
I, [2020-01-12T20:59:04.073148 #758]  INFO -- : Escrevendo /var/www/discourse/public/assets/ember_jquery-c2cca4a19fd4c70eabc95b010a6d7643955ec2a2251aeb1d70f625773eebea21.js
I, [2020-01-12T20:59:06.303026 #758]  INFO -- : Escrevendo /var/www/discourse/public/assets/pretty-text-bundle-fa6ea00e2000bf2f9ed3f069be9253477fed5e7290b5d109a3e2d9498ac70e81.js
... [snip]
108798.339928812 Comprimindo: 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


Finalizado a compressão de vendor-3b0a3ac5e0bc628422d6e99d3563fad4c474398644f70683eff0893b7a241513.js : 3,33 seg

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

Ele compila os arquivos, mas eu sempre tenho que executá-lo novamente após a compilação para que os arquivos ausentes apareçam.

Interessante, então os arquivos são criados corretamente, mas a persistência falha?

Eu investigaria como o volume do Podman está funcionando e qual é o driver que o suporta. No mundo do Docker, tivemos muitos problemas estranhos com drivers de armazenamento ao longo dos anos, o que nos levou até a manter uma lista de drivers “aprovados” em nosso script de inicialização.

Para ficar claro, meus experimentos com o Podman realmente testavam o launcher, não o Discourse. Pelo menos, quando o testei, ele dependia de detalhes de saída do Docker que o Podman não tenta emular.

@Adriany, estou supondo que você esteja usando o driver de armazenamento padrão, que é o mesmo recomendado para o Discourse, que no Docker é “overlay2” — mas não sei se esse é o seu caso.

Estou usando overlayfs, que é o equivalente ao overlay2.
Curiosamente, ele foi compilado sem problemas e sem ativos faltantes após algumas compilações adicionais com ativos faltantes quando tentei adicionar plugins. Quando reconstruí sem plugins, tudo funcionou perfeitamente. Estranho?

Edição: Funcionou para mim e agora os ativos estão em cache aqui. Durante a execução, parou de funcionar para outros usuários.

Edição 2: Outra reconstrução fez com que os ativos falhassem como antes, e a solução foi reconstruir como antes.

Se os arquivos forem gerados com sucesso pelo nosso pipeline de assets e o sistema operacional indicar que não há erro, mas eles desaparecem após a reconstrução (o que efetivamente reinicia o contêiner), eu apostaria (novamente) no driver de armazenamento do Podman.

A menos que alguém consiga reproduzir esse mesmo comportamento usando o Docker (e haveria vários tópicos se fosse esse o caso), temo que você precise abrir um ticket no projeto do Podman sobre isso.

Olá,

Fiz mais investigações e parece que eu estava errado nas minhas apostas sobre onde os arquivos estão armazenados ou simplesmente não sou bom em encontrá-los.

Os arquivos todos retornam 404, no entanto, tome este como exemplo:

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

Eles estão lá, então acho que isso é um problema do Discourse e não do podman; eu apenas não consegui procurar pelos arquivos corretamente.

Pensei que pudesse ser um problema no Cloudflare, mas quando faço um curl rápido no localhost no servidor, também recebo um 404.

Você pode nos fornecer uma reprodução disso acontecendo no Docker?