Tema de Embutir Recursos

Olá pessoal,

Percorri alguns tópicos em busca de respostas — e encontrei muitas (linkadas abaixo — obrigado!). Graças a elas, consigo fazer com que as coisas fiquem na maior parte do jeito que eu quero. Mas ainda há uma questão que não consegui resolver.

Trata-se dos arquivos de assets incorporados, especificamente o arquivo embed_HASH.css.

Parece que, quando esses assets são compilados, eles não são compilados usando a paleta de cores do tema ativo. Isso pode ser intencional, ou pode ser algo que eu perdi.

É sobre isso que eu gostaria de ter clareza:

  1. O embed_[digest].css é sempre compilado usando a paleta padrão?
    Se sim, posso conviver com isso — sei que há muito trabalho em andamento para melhorar a forma como os temas e as paletas de cores são tratados no Discourse.
  2. Se ele pode ser compilado com uma paleta personalizada, como posso acionar esse comportamento?
  3. Notei que ele pode ser compilado usando as paletas clara ou escura do sistema, então parece plausível que uma paleta personalizada possa ser usada — mas não consegui gerar de forma previsível um arquivo incorporado claro ou escuro.

Para testar isso, excluí todos os temas e paletas, restaurei tudo para o tema Claro padrão e, em seguida, executei:

rake assets:precompile
rake assets:precompile:build

…esperando obter um embed_HASH.css com tema claro. Mas o resultado ainda parecia usar estilos escuros.

Não sou familiarizado com os detalhes internos, então posso estar perdendo algo óbvio. Se alguém pudesse compartilhar o que é necessário para que o embed_HASH.css seja compilado com uma paleta previsível, isso ajudaria muito.

Agradeço antecipadamente!

Para sua informação, minha instância do Discourse está rodando em Docker e está atualizada. Usei o script launcher e o template standalone.

Leitura relacionada (apenas 2 links permitidos para novas contas, o 3º é um título pesquisável):

Encontrei uma resposta parcial para minha própria pergunta e queria compartilhar a percepção:

O arquivo embed_[digest].css é construído usando a paleta de cores selecionada do tema ativo.

O problema, como percebi, é devido ao cache de resposta HTTP muito agressivo.

O que ainda espero que alguém possa responder é:
Onde as respostas HTTP para arquivos de assets são cacheadas no Discourse?

Isso não é apenas cache do lado do navegador - parece ser do lado do servidor também.


Ao rastrear o log de produção do Rails, observo que apenas requisições com um conjunto novo e não visto de parâmetros de consulta acionam uma nova renderização de asset:

$ 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

Depois disso, quaisquer requisições subsequentes para o mesmo URL (mesmo com strings de consulta diferentes) retornam a mesma resposta - mesmo que o tema subjacente tenha mudado.

Por exemplo:

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

Eu só vejo estilos de tema atualizados na primeira vez que uma consulta única é usada. Todas as requisições futuras com os mesmos parâmetros servem a versão anterior, mesmo após a recompilação.

O script launcher tem como padrão RAILS_ENV=production, e eu deixei assim. Eu poderia tentar mudar para RAILS_ENV=development para desativar o cache completamente durante o desenvolvimento, mas idealmente, eu gostaria de saber:

Como podemos limpar ou desativar o cache em nível HTTP de respostas de assets em produção?

Se alguém tiver alguma informação sobre como o Discourse armazena em cache essas respostas de assets - ou como invalidá-las corretamente - isso seria muito útil.

1 curtida

Oh, cara :flushed_face: Era o Nginx!

TL;DR:

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

Correção instantânea!


Opcional: Desabilitar o cache de assets do Nginx

Edite este arquivo:

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

Por volta das linhas 243-246, comente as diretivas de cache:

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

Em seguida, reinicie o Nginx:

sv restart nginx

:artist_palette: Se você está alterando paletas de cores…

Apenas editar as configurações de cores no tema não regenerará embed_[digest].css. Para forçar o Discourse a gerar novos arquivos de assets, faça o seguinte:

rm tmp/stylesheet-cache/* # ou, apenas para embed, `rm tmp/stylesheet-cache/embed*`

:thinking: E quanto a RAILS_ENV=development?

Você pode pensar que definir RAILS_ENV: development desabilitaria o cache, mas:

  • O nginx.sample.conf usado pelo Discourse tem o cache habilitado por padrão, independentemente do ambiente.
  • Esse cache não está vinculado a RAILS_ENV, portanto, não ajudará com o cache de assets incorporados.

Portanto, a menos que você planeje reconfigurar completamente a camada Nginx, apenas limpe o cache manualmente ou desabilite essas linhas, e você estará pronto. Quando estiver pronto para produção, você pode reverter.

:turtle: E quanto a ./launcher rebuild standalone?

Claro, funciona. Mas se você está ajustando temas, testando embeds e definindo cores ativamente… você vai querer algo mais rápido do que esperar alguns minutos toda vez.

:speech_balloon: Tem uma configuração de desenvolvimento melhor ou correções rápidas? Participe!

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