Personalizzare il comportamento del server web di Discourse usando outlet

Riepilogo

A partire da questo commit la configurazione nginx predefinita per Discourse include quelli che sono noti come “outlets” - un modo supportato per iniettare istruzioni aggiuntive nella configurazione nginx in punti appropriati.

Questa modifica abilita un approccio più robusto alla gestione della configurazione e del comportamento di un web server, dove in precedenza ci affidavamo a comandi di ricerca/sostituzione relativamente fragili.

Nel tempo adatteremo i nostri modelli di configurazione per utilizzare gli outlets.

Utilizzo

Sono disponibili tre sezioni di outlet supportate:

  • before-server: istruzioni di configurazione del contesto http
  • server: istruzioni di configurazione del contesto server
  • discourse: istruzioni di configurazione del contesto location - queste vengono applicate alle richieste inoltrate a Discourse

Esempi

Ecco alcuni esempi di come utilizzare questi outlets nel tuo file di configurazione app.yml per raggiungere determinati obiettivi.

Questi possono essere aggiunti ovunque tu possa utilizzare un comando run o file; la mia raccomandazione è di farlo nell’hook after_code in modo che la ricostruzione possa fallire rapidamente se c’è qualcosa di sbagliato nella sintassi.

Aggiunta di un header di risposta

Questo esempio aggiunge un header a ogni risposta inoltrata a 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";

Risultato:

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

Aggiunta di un file statico su un singolo percorso

Questo esempio aggiunge un file statico servito da nginx su un singolo percorso, al di fuori del normale albero di 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}

Risultato:

○ → 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 Mi Piace

Penso di essere davvero entusiasta di questo, tranne… Non lo capisco molto bene. Il secondo esempio ci dà un modo per servire una pagina statica a nostra scelta?

Esattamente.

Non è una soluzione molto scalabile in termini di gestione dei contenuti, ma ha il vantaggio di essere facile da implementare.

1 Mi Piace

Grazie Michael, almeno ho capito abbastanza per capire cosa sta succedendo.

bene, grazie per gli indizi