Personalizando o comportamento do servidor web do Discourse usando outlets

Resumo

A partir do commit a configuração padrão do nginx para Discourse inclui o que são conhecidos como “outlets” - uma maneira suportada de injetar declarações adicionais na configuração do nginx em locais apropriados.

Essa alteração permite uma abordagem mais robusta para gerenciar a configuração e o comportamento de um servidor web, onde anteriormente dependíamos de comandos de busca/substituição relativamente frágeis.

Com o tempo, adaptaremos nossos próprios modelos de configuração para usar outlets.

Uso

Existem três seções de outlet suportadas:

  • before-server: declarações de configuração no contexto http
  • server: declarações de configuração no contexto server
  • discourse: declarações de configuração no contexto location - estas são aplicadas a requisições encaminhadas para o Discourse

Exemplos

Aqui estão alguns exemplos de como usar esses outlets em seu arquivo de configuração app.yml para atingir objetivos.

Estes podem ser adicionados em qualquer lugar onde você possa usar um comando run ou file; minha recomendação é fazê-lo no hook after_code para que a reconstrução possa falhar rapidamente se houver algo errado com a sintaxe.

Adicionando um cabeçalho de resposta

Este exemplo adiciona um cabeçalho a cada resposta que é encaminhada para o Discourse:

hooks:
  after_code:
    - file:
        path: /etc/nginx/conf.d/outlets/discourse/clacks-overhead.conf
        chmod: 444
        contents: |
          add_header x-clacks-overhead "GNU Terry Pratchett";

Resultado:

○ → curl -I https://example.contoso.com/
HTTP/2 200 
…
x-clacks-overhead: GNU Terry Pratchett

Adicionando um arquivo estático em um único caminho

Este exemplo adiciona um arquivo estático servido pelo nginx em um único caminho, fora da árvore normal do Discourse.

hooks:
  after_code:
    - file:
        path: /etc/nginx/conf.d/outlets/server/well-known-important-file.conf
        chmod: 444
        contents: |
          location = /.well-known/important-file {
            default_type application/json;
            root /var/www/static/;
          }
    - file:
        path: /var/www/static/.well-known/important-file
        chmod: 444
        contents: |
          {"content-free":true}

Resultado:

○ → curl -i https://example.contoso.com/.well-known/important-file
HTTP/2 200 
server: nginx
date: Fri, 07 Mar 2025 23:22:38 GMT
content-type: application/json
content-length: 22
last-modified: Fri, 07 Mar 2025 23:12:08 GMT
strict-transport-security: max-age=63072000
accept-ranges: bytes

{"content-free":true}
8 curtidas

Eu acho que estou muito animado com isso, exceto… Eu não entendo muito bem. O segundo exemplo nos dá uma maneira de servir uma página estática de nossa escolha?

É exatamente isso.

Não é uma solução muito escalável em termos de gerenciamento de conteúdo, mas tem o benefício de ser fácil de implementar.

1 curtida

Obrigado Michael, pelo menos entendi o suficiente para descobrir o que está acontecendo.

legal, obrigado pelas dicas