Utilisez Nginx Proxy Manager pour gérer plusieurs sites avec Discourse

En effet, cela a nécessité quelques essais et erreurs, mais j’ai réussi à le faire fonctionner comme suit (aucune garantie que ce soit la meilleure méthode – en fait, je sais qu’il doit exister une meilleure solution – donc les corrections et améliorations sont les bienvenues) :

Instructions que @pfaffman a déplacées dans le message d'origine

Pour commencer, il existe deux façons d’accéder à votre instance Discourse : 1. en exposant un port, 2. via un websocket. J’ai cru comprendre quelque part sur ce forum que le websocket est plus rapide et plus efficace, c’est donc ce que j’utilise, mais l’exposition d’un port devrait être beaucoup plus simple. Si vous n’arrivez pas à faire fonctionner le socket, essayez d’exposer un port (plus de détails ci-dessous).

Supposons donc que vous ayez terminé l’installation standard de 30 minutes et que vous n’ayez pas encore laissé Discourse obtenir un certificat Let’s Encrypt, car ce n’est pas nécessaire lorsque vous utilisez un proxy inverse. NPM s’en chargera. Peu importe si vous avez déjà un certificat ; NPM en obtiendra simplement un nouveau.

1. Installer NPM

L’étape suivante consiste à installer NPM afin d’avoir deux conteneurs Docker supplémentaires en cours d’exécution (NPM et son conteneur de base de données).

Vient ensuite la partie délicate sur laquelle vous posez votre question.

Le premier obstacle est que Discourse s’exécute sur le réseau bridge par défaut de Docker, tandis que NPM s’exécute par défaut sur un réseau « créé par l’utilisateur » (appelé npm_default dans mon cas), ce qui signifie que NPM ne peut pas voir Discourse. :cry:

2. Placer tous les conteneurs sur le réseau bridge par défaut

Donc, tant que je ne sais pas si et comment Discourse peut être déplacé vers un réseau personnalisé, nous devons déplacer NPM vers le réseau bridge par défaut. Nous pouvons le faire en ajoutant network_mode: bridge aux deux conteneurs NPM dans notre fichier docker compose.

3. Utiliser une adresse IP au lieu d’un nom de service

Le problème suivant est que le fichier docker compose standard ne fonctionnera plus si vous le déplacez simplement vers le réseau bridge. NPM ne pourra plus trouver son conteneur de base de données. En effet, la résolution DNS interne pour les noms de service (sur laquelle s’appuie le fichier docker-compose) n’est disponible que sur les réseaux créés par l’utilisateur, et non sur les réseaux Docker par défaut. Nous devons donc recourir à des adresses IP codées en dur (ce qui explique pourquoi ce n’est absolument pas la solution optimale, car cela échouera si les adresses IP de vos conteneurs changent). Vous devez donc démarrer le conteneur, même si vous savez qu’il ne fonctionnera pas, noter l’adresse IP du conteneur de base de données NPM, et remplacer DB_MYSQL_HOST: "db" dans votre fichier docker compose par DB_MYSQL_HOST: "<ip_conteneur_db>".

Maintenant, tous les conteneurs devraient être sur le réseau bridge par défaut afin que NPM puisse voir à la fois Discourse et sa base de données.

4. Rendre Discourse accessible

Mais « voir » Discourse et pouvoir y accéder ne sont pas la même chose. Vous devez donc vous assurer que Discourse acceptera tout le trafic que NPM lui transmet. Si vous ne vous souciez pas d’utiliser le websocket, je suppose que vous pouvez simplement pointer NPM vers le port 80 (et non 443) de l’adresse IP de votre conteneur Discourse, comme ceci :

Je n’ai pas testé cela, cependant. Comme je l’ai mentionné, j’utilise la configuration websocket, ce qui nécessite quelques étapes supplémentaires. Notez que le nom d’hôte/IP et le port ci-dessus seront ignorés lorsque vous utiliserez le websocket.

5. Configurer app.yml pour utiliser le websocket

Ceci est expliqué dans le message d’origine, donc je n’entrerai pas dans les détails.

6. Monter le websocket dans le conteneur NPM

Nous devons donner à NPM accès au websocket en le montant comme volume : - /var/discourse/shared/standalone/nginx.http.sock:/var/discourse/shared/standalone/nginx.http.sock. C’est le dernier changement à apporter au fichier docker compose NPM par défaut, voici donc la version finale qui fonctionne pour moi :

version: '3'
services:
  app:
    image: 'jc21/nginx-proxy-manager:latest'
    restart: unless-stopped
    network_mode: bridge
    ports:
      - '80:80'
      - '81:81'
      - '443:443'
    environment:
      DB_MYSQL_HOST: "172.17.0.6"
      DB_MYSQL_PORT: 3306
      DB_MYSQL_USER: "npm"
      DB_MYSQL_PASSWORD: "my-super-safe-pwd"
      DB_MYSQL_NAME: "npm"
    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt
      - /var/discourse/shared/standalone/nginx.http.sock:/var/discourse/shared/standalone/nginx.http.sock
  db:
    image: 'jc21/mariadb-aria:latest'
    restart: unless-stopped
    network_mode: bridge
    environment:
      MYSQL_ROOT_PASSWORD: 'my-super-safe-pwd'
      MYSQL_DATABASE: 'npm'
      MYSQL_USER: 'npm'
      MYSQL_PASSWORD: 'my-super-safe-pwd'
    volumes:
      - ./data/mysql:/var/lib/mysql

7. Configurer NPM pour utiliser le websocket

Dernière étape : dire à NPM d’utiliser le websocket. Pour autant que je me souvienne, il ne suffisait pas d’activer simplement « Support des Websockets », j’ai donc copié l’emplacement NGINX du message d’origine dans l’onglet « Avancé », comme ceci :

Je n’ai pas réussi à le faire fonctionner sous l’onglet « Emplacements personnalisés ».

8. N’oubliez pas d’activer SSL

Je n’ai pas mentionné la configuration SSL dans NPM car elle semble assez évidente et je ne pense pas qu’il importe à quel moment du processus vous l’activez. Donc, si vous ne l’avez pas encore fait, voici à quoi ressemble la mienne :


9. Avertissement final

En écrivant ce post, il m’est soudainement venu à l’esprit que NPM et Discourse n’ont probablement même pas besoin d’être sur le même réseau Docker lorsque nous utilisons le websocket. Je n’ai pas le temps de vérifier cela pour le moment, mais si c’est vrai, vous pouvez simplement oublier les étapes 2, 3 et 4 ci-dessus et cela devrait fonctionner.

C’est l’aspect le plus fascinant des forums d’entraide : faire un bon travail en décrivant votre problème vous mène souvent à la solution sans même avoir à poster votre question. Et dans ce cas, je répondais à la question de quelqu’un d’autre mais j’ai peut-être aussi trouvé la réponse à ma propre question. :smiley:

4 « J'aime »