Bonjour à tous,
J’ai parcouru la documentation, lu les configurations et recommandations publiées, et j’ai tenté d’adapter ces éléments à ma situation particulière.
Pour une tâche qui semble assez simple, il est incroyablement frustrant qu’aucune des solutions proposées ne fonctionne.
Notre environnement :
- Nous utilisons une instance AWS EC2, plus précisément une image AMI AWS Linux 2 ;
- Apache2 est installé et configuré ;
- L’instance fait partie d’un groupe cible AWS référencé par notre équilibreur de charge AWS ;
- Notre certificat SSL/TLS est fourni par AWS et associé à l’équilibreur de charge ;
- Notre fournisseur de domaine est
name.com; - Dans le cadre de notre configuration, plusieurs sous-domaines sont acheminés via des enregistrements CNAME pointant tous vers l’équilibreur de charge AWS, qui gère ensuite le trafic vers l’instance EC2 ;
- Tout le trafic acheminé vers l’équilibreur de charge et servi aux utilisateurs web est sécurisé ;
- Sur notre serveur, nous exécutons trois applications Node Express distinctes ;
- Les ports sont définis dans Express dans le cadre de la configuration du serveur Express, actuellement les ports 3000, 4000 et 5000 ;
- Le trafic est acheminé par Apache en fonction du sous-domaine vers l’application web correspondante, par exemple :
<VirtualHost *:80>
ServerName subdomain.domain.io
ProxyPreserveHost On
ProxyPass "/" "http://localhost:4000/"
ProxyPassReverse "/" "http://localhost:4000/"
</VirtualHost>
-
Bien que cela ne soit pas particulièrement pertinent, nous utilisons PM2 pour gérer nos applications Express afin qu’elles démarrent automatiquement après un redémarrage du serveur.
-
Sur le même serveur, Docker est installé ;
-
Nous avons ensuite installé Discourse en utilisant une copie de app.yaml (en nous inspirant de Run other websites on the same machine as Discourse - #182 by angus).
État actuel :
- Docker est en cours d’exécution ;
- L’application Discourse (conteneur) est en cours d’exécution ;
- Les applications Express sont toutes en cours d’exécution et correctement acheminées par Apache.
Remarques :
- J’ai d’abord essayé de construire l’application sans exposer les ports, conformément à la documentation. Lorsque cela n’a pas fonctionné, j’ai exposé le port 8000 sur le port HTTP 80 ;
- Dans ma compréhension simplifiée, Docker est comme une maison et les différents conteneurs sont les pièces. Docker détermine comment l’application est accessible, c’est-à-dire quelle pièce accéder. Mon idée en exposant le port 8000 était de pouvoir ensuite référencer ce port comme je le fais avec mes autres applications Express, maintenant que 8000 était exposé. Mais cela ne fonctionne pas. Voici un exemple de ce que j’ai essayé de faire dans Apache :
# FAQ (ROUTES DISCOURSE)
<VirtualHost *:80>
ServerName discourse.domain.io
ProxyPreserveHost On
ProxyPass "/" "http://localhost:8000/"
ProxyPassReverse "/" "http://localhost:8000/"
</VirtualHost>
- Le test simple consistait à essayer d’ouvrir localhost:8000 dans le navigateur sur le serveur. Le serveur est une instance AWS avec Chromium installé. Le fait que cela ne se résolve pas immédiatement indique qu’il y a un problème et que ma compréhension manque quelque chose de fondamental. Mes applications web fonctionnent et sont accessibles sur les ports que je spécifie dans la configuration Express ; j’attendais donc que ce soit la même chose pour le conteneur Docker.
Remarques supplémentaires :
- Je réalise qu’une solution potentielle consisterait à placer NGINX « devant » Apache et Docker pour acheminer le trafic de
discourse.domain.iovers le port 8000 sur le serveur local, c’est-à-dire le port exposé pour le conteneur Docker, et également acheminer tout le reste du trafic de *.domain.io vers Apache sur le port 9000, puis modifier ma configuration de VirtualHost pour acheminer le trafic depuis le port 9000 en conséquence, c’est-à-dire :
# ROUTAGE DES APPLICATIONS EXPRESS DANS APACHE
<VirtualHost *:9000>
ServerName other_sub_domains.domain.io
ProxyPreserveHost On
ProxyPass "/" "http://localhost:4000/"
ProxyPassReverse "/" "http://localhost:4000/"
</VirtualHost>
- Pour moi, cela semble complètement inutile. Si le domaine
discourse.domain.ioest acheminé vers Apache et qu’Apache reçoit la requête puis tente de la router, cela devrait être aussi simple que de pointer vers le port exposé du conteneur Docker. - De plus, si localhost:8000 sur le serveur lui-même ne se résout pas, cela ne fonctionnerait de toute façon pas.
Actuellement, j’obtiens une erreur 502 dans Chrome lorsque j’essaie de naviguer vers mon conteneur Docker Discourse. (Voir la capture d’écran ci-dessus).
Extrait de app.yml
## Ceci est le modèle de conteneur Docker Discourse tout-en-un, autonome
##
## Après avoir apporté des modifications à ce fichier, vous DEVEZ reconstruire
## /var/discourse/launcher rebuild app
##
## SOYEZ *TRÈS* PRUDENT EN ÉDITANT !
## LES FICHIERS YAML SONT SUPER SUPER SENSIBLES AUX ERREURS D'ESPACEMENT OU D'ALIGNEMENT !
## Visitez http://www.yamllint.com/ pour valider ce fichier si nécessaire
templates:
- "templates/postgres.template.yml"
- "templates/redis.template.yml"
- "templates/web.template.yml"
- "templates/web.ratelimited.template.yml"
- "templates/web.socketed.template.yml"
## Décommentez ces deux lignes si vous souhaitez ajouter Lets Encrypt (https)
#- "templates/web.ssl.template.yml"
#- "templates/web.letsencrypt.ssl.template.yml"
## Quels ports TCP/IP ce conteneur doit-il exposer ?
## Si vous souhaitez que Discourse partage un port avec un autre serveur web comme Apache ou nginx,
## consultez https://meta.discourse.org/t/17247 pour plus de détails
expose:
- "8000:80" # http
#- "443:443" # https
params:
db_default_text_search_config: "pg_catalog.english"
## Définissez db_shared_buffers à un maximum de 25 % de la mémoire totale.
## Sera défini automatiquement par bootstrap en fonction de la RAM détectée, ou vous pouvez le remplacer
#db_shared_buffers: "256MB"
## Peut améliorer les performances de tri, mais augmente l'utilisation de la mémoire par connexion
#db_work_mem: "40MB"
## Quelle révision Git ce conteneur doit-il utiliser ? (par défaut : tests-passed)
#version: tests-passed
env:
LC_ALL: en_US.UTF-8
LANG: en_US.UTF-8
LANGUAGE: en_US.UTF-8
# DISCOURSE_DEFAULT_LOCALE: en
## Combien de requêtes web simultanées sont prises en charge ? Dépend de la mémoire et des cœurs CPU.
## Sera défini automatiquement par bootstrap en fonction des CPU détectés, ou vous pouvez le remplacer
#UNICORN_WORKERS: 3
## TODO : Le nom de domaine auquel cette instance Discourse répondra
## Requis. Discourse ne fonctionnera pas avec une adresse IP brute.
DISCOURSE_HOSTNAME: 'discourse.domain.io'
## Décommentez si vous souhaitez que le conteneur soit démarré avec le même
## nom d'hôte (-h option) que spécifié ci-dessus (par défaut "$hostname-$config")
#DOCKER_USE_HOSTNAME: true
## TODO : Liste d'e-mails délimités par des virgules qui seront administrateurs et développeurs
## lors de l'inscription initiale, exemple 'user1@example.com,user2@example.com'
DISCOURSE_DEVELOPER_EMAILS: 'user@domain.io'
## TODO : Le serveur de messagerie SMTP utilisé pour valider les nouveaux comptes et envoyer des notifications
# L'adresse SMTP, le nom d'utilisateur et le mot de passe sont requis
# ATTENTION : le caractère '#' dans le mot de passe SMTP peut causer des problèmes !
DISCOURSE_SMTP_ADDRESS: email-smtp.us-east-1.amazonaws.com
DISCOURSE_SMTP_PORT: 587
DISCOURSE_SMTP_USER_NAME: ******
DISCOURSE_SMTP_PASSWORD: ******
#DISCOURSE_SMTP_ENABLE_START_TLS: true # (optionnel, par défaut true)
#DISCOURSE_SMTP_DOMAIN: ****** # (requis par certains fournisseurs)
#DISCOURSE_NOTIFICATION_EMAIL: ****** # (adresse d'envoi des notifications)
## Si vous avez ajouté le modèle Lets Encrypt, décommentez ci-dessous pour obtenir un certificat SSL gratuit
#LETSENCRYPT_ACCOUNT_EMAIL: me@example.com
## L'adresse CDN http ou https pour cette instance Discourse (configurée pour récupérer)
## consultez https://meta.discourse.org/t/14857 pour plus de détails
#DISCOURSE_CDN_URL: https://discourse-cdn.example.com
## La clé d'adresse IP Maxmind pour la recherche d'adresses IP
## consultez https://meta.discourse.org/t/-/137387/23 pour plus de détails
#DISCOURSE_MAXMIND_LICENSE_KEY: 1234567890123456
## Le conteneur Docker est sans état ; toutes les données sont stockées dans /shared
volumes:
- volume:
host: /var/discourse/shared/standalone
guest: /shared
- volume:
host: /var/discourse/shared/standalone/log/var-log
guest: /var/log
## Les plugins vont ici
## consultez https://meta.discourse.org/t/19157 pour plus de détails
hooks:
after_code:
- exec:
cd: $home/plugins
cmd:
- git clone https://github.com/discourse/docker_manager.git
## Toute commande personnalisée à exécuter après la construction
run:
- exec: echo "Début des commandes personnalisées"
## Si vous souhaitez définir l'adresse e-mail « De » pour votre première inscription, décommentez et modifiez :
## Après avoir reçu le premier e-mail d'inscription, re-commentez la ligne. Elle ne doit être exécutée qu'une seule fois.
#- exec: rails r "SiteSetting.notification_email='info@unconfigured.discourse.org'"
- exec: echo "Fin des commandes personnalisées"
Mon domaine, mon adresse e-mail et ma configuration e-mail sont corrects. Comme mentionné, je ne nécessite pas de configuration SSL/TLS.
Demande :
- La solution NGINX est-elle la seule façon de faire fonctionner cette configuration, et si oui, existe-t-il une explication plus claire concernant les étapes de configuration ? Je ne suis pas en mesure de repartir de zéro avec le serveur juste pour faire fonctionner Discourse et sans garanties.
- Dans Discourse behind reverse proxy and https - #2 by itsbhanusharma, @Dark Matter a fourni la solution suivante pour Apache2, mais je ne pense pas que cette solution soit conçue pour un environnement Node Express et, avec mon localhost:8000 qui ne se résout pas, je ne suis pas sûr que cela fonctionnerait :
<VirtualHost *:80>
ServerAdmin webmaster@localhost
ServerName discourse.example.com
DocumentRoot /website/discourse
RewriteEngine On
ProxyPreserveHost On
ProxyRequests Off
ProxyPass / unix:/var/discourse/shared/socket-only/nginx.http.sock|http://localhost/
ProxyPassReverse / unix:/var/discourse/shared/socket-only/nginx.http.sock|http://localhost/
ErrorLog /var/log/apache2/discourse.error.log
LogLevel warn
CustomLog /var/log/apache2/discourse.access.log combined
RewriteCond %{SERVER_NAME} =discourse.example.com
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>
- Le problème vient-il de ma configuration Discourse ? Est-ce peut-être mon routage Apache (je le soupçonne) ? Ou manque-t-il quelque chose de plus fondamental ici ?
- Je pense que résoudre ce problème aidera beaucoup d’utilisateurs à l’avenir.
- La première option serait d’acheminer vers Discourse localement sur le serveur.
- Ensuite, l’acheminement via l’URL serait la deuxième option.
Cordialement,
Matthew Lucas



