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

MODIF : @pfaffman a réécrit ceci en un sujet autonome à partir de ce que @tophee avait écrit plus tôt. Ce n’est pas encore testé par moi, et j’ai réorganisé les mots de Chris, donc toute erreur est probablement de la responsabilité de @pfaffman.

Y a-t-il des raisons de ne pas utiliser NGINX Proxy Manager au lieu de faire cela manuellement comme décrit dans Run other websites on the same machine as Discourse ?

Je l’utilise déjà. Je l’ai eu sur mon serveur personnel pendant un certain temps et lorsque j’ai migré mon instance Discourse vers un nouveau serveur cloud, j’ai réalisé que j’avais oublié la majeure partie de la configuration du proxy inverse NGINX que j’avais faite il y a 4 ans sur l’ancien serveur, alors je me suis dit : pourquoi ne pas le faire avec NGINX Proxy Manager ? À ma surprise, j’ai constaté qu’il avait été mentionné assez rarement ici sur Meta, ce qui m’a fait me demander s’il y avait des inconvénients que j’aurais pu manquer…

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 façon de faire — en fait, je sais qu’il doit y avoir une meilleure méthode — donc les corrections et améliorations sont les bienvenues) :

Pour commencer, il y a deux façons d’accéder à votre instance Discourse : 1. en exposant un port, 2. via websocket. Je crois avoir appris quelque part sur ce forum que le websocket est plus rapide / plus efficace, c’est donc ce que j’utilise, mais exposer un port devrait être beaucoup plus simple, donc si vous ne parvenez pas à faire fonctionner le socket, essayez d’exposer un port. Donc, pour éviter toute confusion : pour accéder à Discourse via un port, suivez les étapes 0, 1, 2, 3, 4 et 8 ci-dessous. Si vous souhaitez utiliser un websocket, suivez les étapes 0, 1, 5, 6, 7, 8 et 9.

0. Point de départ

Supposons donc que vous ayez terminé l’installation standard de 30 minutes et supposons que vous n’ayez pas encore laissé Discourse obtenir un certificat Let’s Encrypt — car vous n’en avez pas besoin lorsque vous utilisez un proxy inverse. NGINX Proxy Manager s’en chargera. Cela n’a pas d’importance non plus si vous avez déjà un certificat. NGINX Proxy Manager en obtiendra simplement un nouveau.

1. Installer NGINX Proxy Manager

La prochaine étape consiste à installer NGINX Proxy Manager afin d’avoir deux conteneurs Docker supplémentaires en cours d’exécution (NGINX Proxy Manager et son conteneur de base de données).

Ensuite vient la partie délicate dont vous parlez.

Le premier obstacle est que Discourse s’exécute sur le réseau bridge par défaut de Docker, tandis que NGINX Proxy Manager s’exécute par défaut sur un réseau « créé par l’utilisateur » par défaut (appelé npm_default dans mon cas), ce qui signifie que NGINX Proxy Manager 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 NGINX Proxy Manager vers le réseau bridge par défaut. Nous pouvons le faire en ajoutant network_mode: bridge aux deux conteneurs NGINX Proxy Manager dans notre fichier docker compose.

3. Utiliser l’adresse IP au lieu du 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. NGINX Proxy Manager ne pourra plus trouver son conteneur de base de données. En effet, la résolution DNS interne des noms de service (sur laquelle repose 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’IP du conteneur de base de données NGINX Proxy Manager, 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 NGINX Proxy Manager 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 NGINX Proxy Manager lui transmet. Si vous ne vous souciez pas d’utiliser le websocket, je suppose que vous pouvez simplement pointer NGINX Proxy Manager vers le port 80 (pas 443) de l’IP de votre conteneur Discourse, comme ceci :

Je n’ai pas testé cela, cependant. Comme je l’ai mentionné, j’utilise la configuration websocket, 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 utilisez 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 NGINX Proxy Manager

Nous devons donner à NGINX Proxy Manager 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 par défaut de NGINX Proxy Manager, 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 NGINX Proxy Manager pour utiliser le websocket

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

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

8. N’oubliez pas d’activer SSL

Je n’ai pas mentionné la configuration SSL dans NGINX Proxy Manager 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. Attention

tl;dr Chaque fois que vous redémarrez le conteneur Discourse, vous devez également redémarrer le conteneur principal NGINX Proxy Manager (pas besoin de redémarrer la base de données).
Si vous accédez à Discourse via le websocket, vous devez être conscient que lorsque vous reconstruisez votre conteneur Discourse (ce qui est nécessaire tous les quelques mois pour mettre à jour l’image de base), l’ancien websocket sera supprimé et un nouveau créé. Par conséquent, NGINX Proxy Manager perdra le contact avec votre instance Discourse et renverra une erreur 502. Peut-être qu’une future mise à jour de NGINX Proxy Manager pourra trouver automatiquement le nouveau websocket, mais actuellement (janvier 2022), NGINX Proxy Manager ne trouvera pas votre conteneur Discourse reconstruit à moins que vous ne redémarriez NGINX Proxy Manager.

Explication

Si vous vous demandez pourquoi les instructions ci-dessus combinent le websocket avec les ports, la raison simple est que, alors que j’écrivais ce post, il m’est soudainement venu à l’esprit que NGINX Proxy Manager et Discourse n’ont probablement même pas besoin d’être sur le même réseau Docker lorsque nous utilisons le websocket. Et lorsque cela a été confirmé, personne n’avait envie de réécrire complètement les instructions.

C’est l’aspect le plus fascinant des forums de support : faire du bon travail en décrivant votre problème vous conduit souvent à la solution sans même 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:

9 « J'aime »

Discuter duquel des proxies inverses vous devriez utiliser dépasse clairement le champ du support. :wink: Mais après avoir examiné NGINX Proxy Manager pendant 12 secondes ou plus, je pense qu’il fera très bien l’affaire. Il existe un autre outil « magique » de proxy NGINX dont j’ai déjà vu la discussion, mais avec ma profonde connaissance de NGINX Proxy Manager, je pense qu’il pourrait être préférable. Je pourrais jeter un coup d’œil, car je me désenchante de plus en plus avec Traefik.

EDIT : Maintenant, je l’ai examiné pendant 3 minutes. Je préfère les outils qui facilitent l’automatisation ; ainsi, Traefik et jwilder/nginx-proxy - Docker Image (je l’ai trouvé), qui vous permettent d’ajouter des labels ou des variables d’environnement au conteneur Docker afin qu’aucun clic dans une interface web ne soit requis, correspondent davantage à ce que je cherche. Il semble que pour faire fonctionner cet outil, vous deviez utiliser l’interface web ou trouver un moyen de mettre à jour manuellement la base de données avec les hôtes que vous souhaitez ajouter. Mais si vous êtes prêt à fouiller et à cliquer dans une interface web comme une personne normale (plutôt qu’un « administrateur système »), alors il semble que cet outil pourrait être exactement ce que vous recherchez.

4 « J'aime »

J’ai essayé d’installer Nginx Proxy Manager, mais je ne parviens pas à comprendre comment « lier » (ou faire office de proxy, désolé, je suis encore très novice en gestion de système) le conteneur Discourse afin d’accéder à Discourse via le web.
Pourriez-vous me donner quelques pistes ? Le conteneur Discourse doit-il exposer les ports 80 et 443 ou non, comme le suggère ce sujet du forum ?

1 « J'aime »

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 »

Un grand merci pour cette réponse excellente et bien structurée ! Je vais essayer vos conseils dès que possible. Au fait, les adresses IP à entrer dans NPM sont-elles celles du serveur (c’est-à-dire l’adresse IP externe pour accéder au serveur) ou celles du réseau interne de Docker (j’ai remarqué que Docker utilise des adresses commençant par 172… pour les conteneurs) ?
Désolé si mes questions semblent triviales, je ne maîtrise pas encore bien les questions de réseau.

1 « J'aime »

Je recommande d’utiliser le websocket. Dans ce cas, vous pouvez mettre n’importe quelle adresse IP car elle ne sera pas utilisée. Sinon, il s’agit de l’adresse IP interne du conteneur, et non de l’adresse IP publique de l’hôte.

BTW : Il semble que votre réponse par e-mail n’ait pas été affichée correctement. Peut-être souhaitez-vous modifier (raccourcir) votre message ci-dessus ?

2 « J'aime »

Oui, j’ai vu. J’ai utilisé « Répondre » depuis l’e-mail et cela a essayé d’inclure tout le message original, mais je ne trouve pas de moyen de le modifier. Est-ce possible ? Je suis nouveau sur Discourse, même en tant qu’utilisateur… :pensive:

1 « J'aime »

Vous pouvez modifier vos messages en utilisant l’icône de crayon en bas de votre message. Cependant… le niveau de confiance 1 et inférieur n’obtient que 24 heures (par défaut), tandis que le niveau de confiance 2 et supérieur obtient 30 jours (par défaut).

Il semble que vous soyez actuellement au niveau de confiance 1 (de base), mais vous pouvez en savoir plus sur ce que vous devez faire pour « passer au niveau supérieur » dans Niveaux de confiance. :+1:

2 « J'aime »

Désolé si cela fait longtemps depuis votre dernière question, mais j’ai perdu beaucoup de temps à essayer de suivre vos conseils. Sans aucun succès. Lorsque j’ai modifié app.yml et reconstruit l’application avec vos modifications, les journaux ont commencé à afficher « config/unicorn_launcher: line 71: kill: (898) - No such process ». Donc, quoi que j’aie essayé, impossible d’arrêter ce comportement. J’ai également essayé de reconstruire l’application dans son état original (avec les ports exposés, sans websocket), d’arrêter npm, mais sans aucun résultat : « unicorn » ne tourne pas.

J’ai aussi suivi tout ce que Google propose sur le sujet (cela semble être un problème répandu), mais je n’ai absolument pas réussi à comprendre comment reconstruire un conteneur Discourse fonctionnel. Le problème actuel (et c’est l’un des plus graves, je suis près d’abandonner Discourse) est que, pour une raison obscure et confuse, PostgreSQL interne est toujours en train de « redémarrer ».

Je ne sais pas pourquoi. J’ai simplement appliqué vos modifications, reconstruit l’application, et depuis, « unicorn » :roll_eyes est mort.

Existe-t-il un moyen de résoudre ce problème PostgreSQL ? Pourquoi cela est-il arrivé ? Y a-t-il une chance (j’ai peur que non !) de ne pas perdre toutes les modifications que j’ai apportées à Discourse quand il fonctionnait ?

Et au passage, est-il normal que chaque petite modification ou tentative de correction entraîne un dysfonctionnement ailleurs ? :rage:

Je ne suis pas en colère, ce n’est pas contre vos suggestions : j’ai passé beaucoup de temps à essayer de faire fonctionner ce forum « apparemment » sympa, mais à chaque fois, quelque chose d’autre se met à dysfonctionner. Mon impression que Discourse est très peu fiable ne fait que se renforcer.

1 « J'aime »

Si vous aviez une installation standard fonctionnelle, vous devriez pouvoir remettre les choses en l’état et que tout fonctionne toujours.

Le problème avec PostgreSQL pourrait être lié à la mise à jour de PostgreSQL 13 ?

Si vous avez effectué une sauvegarde avant de commencer, vous pouvez installer sur un nouveau serveur et restaurer cette sauvegarde. Cela devrait être le scénario le pire.

2 « J'aime »

Comment puis-je savoir si le problème PostgreSQL est lié à la mise à jour vers la version 13 ? Je n’ai pas choisi de la mettre à jour ; j’ai simplement tapé ./launcher rebuild app, et tout s’est produit.
Oui, il s’agit bien de la version 13. Après avoir passé des heures à lire sur Internet les témoignages d’autres personnes confrontées au même problème, j’ai découvert que cela pourrait en être la cause, mais je n’ai pas trouvé de solution pour redémarrer Discourse.

1 « J'aime »

Dans ce cas, ce n’est pas le problème. Désolé.

1 « J'aime »

Je suis désolé d’apprendre que vous rencontrez ces problèmes. Je connais bien cette frustration de passer des heures à essayer de résoudre quelque chose. Mais on apprend aussi quelque chose à chaque fois, même si le chemin vers la solution est rarement une ligne droite…

Je suis désolé, mais je ne suis pas la bonne personne pour vous aider sur ce sujet. Je n’ai aucune expérience avec PostgreSQL ou Unicorn. Il y a trois façons dont je traverse ce genre de scénarios où « rien ne fonctionne » : 1. faire une sauvegarde pour pouvoir toujours revenir à l’état initial. 2. essayer ou modifier une seule chose à la fois et tester d’abord sur une machine non productive (ou un forum moins important). 3. investir encore plus d’heures pour comprendre ce qui se passe.

Au passage : rédiger des descriptions détaillées de problèmes ou des tickets de support plus d’une fois m’a aidé à résoudre le problème. Je n’ai même pas eu besoin de soumettre le ticket. Le fait de l’écrire m’a permis de voir la solution.

Dans votre cas, ce que j’essaierais de comprendre, c’est : dans quelles circonstances la modification du fichier app.yml, puis son retour à son état original, peut-elle conduire à un résultat différent de l’issue initiale ? En examinant cela, vous réaliserez soit que vous n’avez pas vraiment restauré l’état original exact, soit vous comprendrez ce qu’il faut encore « réinitialiser » pour que cela fonctionne.

5 « J'aime »

Je suis vraiment désolé, mais je ne comprends pas : d’abord, vous m’avez demandé si le problème PostgreSQL pouvait être lié à la mise à jour de PostgreSQL 13, et quand j’ai répondu « oui, c’est la version 13 » (je jure que je ne savais pas quelle était la version précédente, il y a longtemps que je n’ai pas reconstruit l’application), vous répondez que ce n’est pas le problème… alors, pourquoi PostgreSQL est-il toujours en train de « démarrer » et que Discourse ne démarre pas ?

1 « J'aime »

Salut @Wanderer. Je ne peux pas déterminer quel est ton problème, donc la mise à niveau de PostgreSQL était une supposition hasardeuse. Je suis presque certain que si tu utilises PostgreSQL 13, le problème ne vient pas d’un blocage lors de la mise à niveau depuis la version 10 ou 12. Ainsi, bien qu’il puisse y avoir un problème avec PostgreSQL, il n’est probablement pas lié à la mise à niveau vers PostgreSQL 13.

Ma meilleure recommandation pour quelqu’un qui n’est pas expert dans ces domaines est d’effectuer une installation propre et de restaurer ta sauvegarde la plus récente.

Si tu souhaites obtenir une aide plus spécifique concernant ton problème et que tu as un budget, tu peux me contacter ou publier dans Marketplace.

Je vais travailler sur l’amélioration des instructions pour Nginx Proxy Manager, mais je pense que ton problème, bien qu’il ait été révélé en essayant de passer à ces configurations complexes, n’est probablement pas dû à des instructions défectueuses. (Je ne sais pas, mais c’est ma meilleure hypothèse.)

2 « J'aime »

Voici ma version. J’ai presque abandonné, mais @tophee a lié à un post que j’ai (!?) écrit et qui fournissait la magie nécessaire ! C’est maintenant une méthode simple pour configurer Nginx Proxy Manager pour Discourse. Je pense que cela rend cela similaire à Run other websites on the same machine as Discourse - #396.

Installer Nginx Proxy Manager selon leurs instructions sur

Supprimer les modèles SSL et Let’s Encrypt :

Vérifiez que ces lignes dans votre fichier yml sont commentées ou supprimées :

## Décommentez ces deux lignes si vous souhaitez ajouter Lets Encrypt (https)
#- "templates/web.ssl.template.yml"
#- "templates/web.letsencrypt.ssl.template.yml"

Faire en sorte que Discourse utilise le réseau npm-default.

Si vous suivez aveuglément les instructions d’installation de Nginx Proxy Manager, il créera un réseau docker appelé npm_default.

Ajoutez ce bloc à votre(s) fichier(s) yml. Si vous avez des conteneurs web_only et data séparés, vous devrez ajouter ceci à chacun d’eux (je n’ai pas testé le conteneur mail-receiver). docker_args n’est pas indenté.

docker_args: |
  --network npm_default

Pas besoin d’exposer de ports

Commentez ou supprimez ces lignes de votre fichier yml :

# expose:
#  - "80:80"   # http
#  - "443:443" # https

Vous pouvez ensuite reconstruire vos conteneurs et configurer Nginx Proxy Manager comme ceci :

image

Une manière simple (mais pas nécessairement recommandée) de lancer un deuxième site Discourse serait celle-ci :

cd /var/discourse/containers
cp app.yml othersite.yml
# d'une manière ou d'une autre, éditez au minimum le nom d'hôte dans othersite.yml
./launcher rebuild othersite

Ensuite, ajoutez-le à NPM comme ci-dessus, en utilisant othersite au lieu de app.

J’ai testé cela avec un app.yml plus deux conteneurs de style web_only et un seul conteneur data plus un conteneur othersite-redis séparé qui est une copie du conteneur data contenant uniquement les modèles redis. (Mais une solution plus simple consisterait à mettre le redis supplémentaire dans le conteneur web_only).

2 « J'aime »

Alors, après quelques difficultés, j’ai réussi à faire fonctionner tout le monde.

Je dois préciser : bien que je sois un développeur de la « vieille génération » (années 80), j’ai toujours cherché les meilleures et plus nouvelles façons de développer ou de gérer mes projets. C’est pourquoi je déteste, en 2021, devoir écrire des commandes étranges pleines d’options cryptiques comme autrefois avec CP/M ou DOS. Je privilégie toujours une interface qui me simplifie la vie et la rend plus claire.

Par exemple, j’utilise Portainer pour gérer mes conteneurs. Cela permet de démarrer, arrêter, modifier ou dupliquer tous les conteneurs à la volée, sans devoir fouiller le système de fichiers à la recherche d’un fichier unique sur un million. Par exemple, pour changer le réseau d’un conteneur, il suffit de choisir une option dans une liste et de cliquer ; c’est pareil pour ajouter des paramètres ou un volume, comme dans l’exemple écrit par @tophee. C’est pourquoi j’ai essayé NPM, car je préfère « contenir » mon proxy Nginx et que cela semble permettre de tout faire en quelques clics, tout en comprenant ce que je fais, sans avoir à mémoriser un nouvel ensemble de commandes et d’options étranges.

Revenons à mon conteneur Discourse : j’ai dû le configurer à nouveau avec « discourse-setup ». Tout s’est bien passé, Postgres a été installé « méchamment » en version 13, sans « licorne ivre » (désolé, mais l’idée d’une licorne en train de courir sur mon serveur me fait rire ! :laughing:). Bref, tout s’est déroulé comme prévu. Ensuite, j’ai apporté les modifications nécessaires pour faire fonctionner Discourse avec les websockets : tout a fonctionné cette fois aussi. Heureusement, la configuration précédente de Discourse avait créé des sauvegardes automatiques, donc en quelques clics, j’ai tout restauré (plus j’utilise Discourse, plus je l’apprécie !).

J’ai dû tester plusieurs fois la configuration de NPM. Au début, j’ai rencontré des problèmes avec les certificats, mais au final, tout a fonctionné correctement.

J’ai ajouté un deuxième proxy pointant vers mon conteneur WordPress (oui, je « contiens » tout ; j’aime l’idée d’un serveur plus propre où tous les principaux packages sont contenus dans un endroit géré), et cela fonctionne également très bien.

Au final, j’ai mon serveur (un VPS) avec son serveur de messagerie (j’ai aussi essayé de le « contenir », mais après des semaines de lutte acharnée, j’ai abandonné), Discourse pointant vers lui, WordPress tournant dans un autre conteneur, et NPM gérant les deux : le tout sur mon serveur, sans dépendre d’autres services (beaucoup, beaucoup plus chers) pour le déploiement, l’envoi d’e-mails, etc.

Prochaine étape : importer quelques centaines de milliers de posts de l’« ancien et bon Phpbb » : préparez-vous à d’autres messages de ma part ! :grinning_face_with_smiling_eyes:

Un grand merci à @tophee et @pfaffman pour leur aide. Je comprends maintenant à quel point il peut être difficile d’aider des personnes qui travaillent de manière non conventionnelle comme moi.

3 « J'aime »

Heureux que vous ayez réussi à le faire fonctionner avec WebSocket. Pour toute autre personne ayant des difficultés avec cela, suivez les instructions de @pfaffman pour le faire sans WebSocket ci-dessus.

Je ne sais pas ce qui a causé votre problème, mais il me semble que c’est un point à clarifier pour toute personne relativement nouvelle dans l’administration de Discourse : vous devez comprendre comment fonctionne le certificat Let’s Encrypt dans l’installation par défaut (sans aucun proxy externe) par rapport à son fonctionnement avec NPM (et si vous vous demandez pourquoi on l’appelle proxy externe, vous devez aussi comprendre cela).

Puisque j’avais initialement configuré manuellement mon proxy externe et aussi configuré Let’s Encrypt manuellement, je comprenais toute la magie que Discourse ainsi que NPM font pour vous afin que le HTTPS fonctionne simplement, et donc j’ai pu éviter divers pièges lors du passage des certificats gérés par Discourse aux certificats gérés par NPM.

Je ne vois vraiment pas pourquoi vous voudriez placer le serveur de messagerie derrière NPM…

1 « J'aime »

Non Christoph, pas derrière NPM, juste dans un conteneur. J’ai essayé Zimbra, mais c’était un énorme gâchis. Ensuite, un simple Postfix « conteneurisé », mais sans succès non plus. J’étais au début de mon expérience avec Linux (je suis toujours débutant, mais je gagne en confiance, du moins concernant certains concepts d’administration), alors j’ai abandonné et j’ai essayé directement sur le serveur. Il démarre sans trop de problèmes, alors j’ai continué ainsi, même si configurer Discourse pour utiliser mon serveur de messagerie a été assez difficile. Mais maintenant, tout semble fonctionner.

2 « J'aime »

Ça semble bon avec l’installation jusqu’à ce que je sois bloqué avec npm pour communiquer avec l’hôte discourse ; vous mentionnez de mettre l’IP du conteneur de données dans l’hôte mySQL du fichier compose npm

 environment:
      DB_MYSQL_HOST: "db"
      DB_MYSQL_PORT: 3306
      DB_MYSQL_USER: "npm"
      DB_MYSQL_PASSWORD: "npm"
      DB_MYSQL_NAME: "npm"

mais quand je change le (DB_MYSQL_HOST) en conteneur de données, il m’affiche connexion refusée.

connect ECONNREFUSED 172.17.0.2:3306 <-- erreur quand npm dans le réseau discours (network_mode: bridge).
getaddrinfo ENOTFOUND db <-- erreur quand le mySQL dans le fichier compose npm est défini comme "db".

des suggestions pour que l’étape 3 fonctionne pour moi ?

1 « J'aime »