Personnaliser le comportement du serveur web de Discourse à l'aide de outlets

Résumé

Depuis ce commit, la configuration nginx par défaut pour Discourse inclut ce que l’on appelle des « outlets » (points de sortie) - une manière prise en charge d’injecter des instructions supplémentaires dans la configuration nginx aux endroits appropriés.

Ce changement permet une approche plus robuste de la gestion de la configuration et du comportement d’un serveur web, alors que nous nous appuyions auparavant sur des commandes de recherche/remplacement relativement fragiles.

Au fil du temps, nous adapterons nos propres modèles de configuration pour utiliser les points de sortie.

Utilisation

Il existe trois sections de points de sortie prises en charge :

  • before-server : instructions de configuration du contexte http
  • server : instructions de configuration du contexte server
  • discourse : instructions de configuration du contexte location - celles-ci sont appliquées aux requêtes transmises à Discourse

Exemples

Voici quelques exemples d’utilisation de ces points de sortie dans votre fichier de configuration app.yml pour atteindre certains objectifs.

Ils peuvent être ajoutés n’importe où vous pouvez utiliser une commande run ou file ; ma recommandation est de le faire dans le hook after_code afin que la reconstruction puisse échouer rapidement si la syntaxe est incorrecte.

Ajout d’un en-tête de réponse

Cet exemple ajoute un en-tête à chaque réponse transmise à 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";

Résultat :

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

Ajout d’un fichier statique sur un seul chemin

Cet exemple ajoute un fichier statique servi par nginx sur un seul chemin, en dehors de l’arborescence normale de 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}

Résultat :

○ → 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 « J'aime »

Je pense que je suis vraiment excité par cela, sauf… Je ne le comprends pas très bien. Le deuxième exemple nous donne-t-il un moyen de servir une page statique de notre choix ?

C’est exactement ça.

Ce n’est pas une solution très évolutive en termes de gestion du contenu, mais elle a l’avantage d’être facile à mettre en œuvre.

1 « J'aime »

Merci Michael, au moins j’ai compris assez pour savoir ce qui se passe.

sympa, merci pour les indices