Configurer Discourse - Environnement AWS Linux 2 AMI et Apache2 (httpd)

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.io vers 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.io est 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

C’est trop compliqué pour que je comprenne complètement, alors considérez ceci plus comme une supposition éclairée qu’une solution. Si le problème est que vous n’obtenez pas quelque chose pour vous connecter à votre conteneur docker en cours d’exécution via localhost, vous pourriez essayer d’utiliser l’IP Docker. Il serait également possible d’utiliser le modèle de socket web et d’utiliser le socket plutôt que le port. Certains soutiennent que c’est préférable pour un certain nombre de raisons.

MKJ’s Opinionated Discourse Deployment Configuration pourrait être utile à lire.

@pfaffman@Matthew_Lucas utilise déjà le modèle avec socket, pourtant…

J’utilise définitivement localhost pour mon proxy externe, et cela devrait fonctionner avec le réglage expose. Je ne m’attendrais pas à ce qu’il ait besoin d’utiliser l’IP de docker. Et je ne m’attendrais pas à ce que cela échoue uniquement avec Apache devant le conteneur docker pour cette raison.

Vous pourriez avoir besoin d’une configuration d’en-tête — voir Add an offline page to display when Discourse is rebuilding or starting up - #2 by codinghorror

J’ai fait de mon mieux pour oublier la configuration Apache, mais cette section de la configuration nginx est quelque chose que vous voudriez savoir comment reproduire avec Apache, je pense.

    proxy_set_header Host $http_host;
    proxy_http_version 1.1;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto https;
    proxy_set_header X-Real-IP $remote_addr;

En particulier, je ne pense pas que cela fonctionne correctement sans l’en-tête Host.

Puisque vous n’utilisez pas HTTPS, vous devriez pouvoir utiliser tcpdump pour capturer des traces de paquets afin de voir exactement ce qui ne va pas.

Cependant, pourquoi mettre Apache là-dedans du tout ? C’est juste un obstacle supplémentaire. Si j’essayais quelque chose comme ça, je configurerais l’équilibreur de charge Amazon pour qu’il communique directement avec le port 8000 sur l’instance EC2. Je suppose que vous terminez HTTPS sur l’ELB de toute façon. Je soupçonne que leur équilibreur de charge connaît les en-têtes normaux à ajouter sans que vous ayez besoin de les spécifier, mais sinon, bien sûr, allez-y et définissez-les. Assurez-vous simplement que le port est accessible via le pare-feu.

Je doute d’avoir beaucoup plus de valeur à apporter ici, mais j’espère que certaines de ces informations vous aideront dans votre configuration. Bonne chance.

INSTALLATION DE DOCKER ET DISCOURSE SUR AWS EC2 LINUX AVEC UN PROXY INVERSE HTTPD EXISTANT

Bonjour à tous,

J’ai trouvé la solution. Je suis reparti de zéro avec une installation propre de Docker et Discourse. Voici le détail de ma démarche :

Hypothèses

• Vous disposez déjà d’une instance Linux AWS EC2
• Vous pouvez accéder à votre instance EC2 via SSH
• Apache 2 est déjà configuré et en cours d’exécution sur votre serveur

ACCÈS À VOTRE INSTANCE EC2 VIA SSH

  1. Ouvrez CMD / Terminal

  2. Connectez-vous à l’instance AWS EC2 via SSH

Exemple d’écran une fois connecté à l’instance EC2

EFFECTUER LES MISES À JOUR DU SYSTÈME

  1. Effectuez les mises à jour du système en exécutant la commande suivante dans la console / terminal

$ sudo yum update

INSTALLATION DE DOCKER

  1. Recherchez le package Docker AWS en exécutant la commande suivante dans la console / terminal

$ sudo yum search docker

  1. Obtenez les informations sur la version en exécutant la commande suivante dans la console / terminal

$ sudo yum info docker

  1. Installez Docker en exécutant la commande suivante dans la console / terminal

$ sudo yum install docker

  1. Ajoutez une appartenance au groupe pour l’utilisateur ec2-user par défaut afin de pouvoir exécuter toutes les commandes Docker sans utiliser la commande sudo, en exécutant la commande suivante dans la console / terminal
$ sudo usermod -a -G docker ec2-user
$ id ec2-user

# Recharger les affectations de groupe d'un utilisateur Linux vers Docker sans se déconnecter

$ newgrp docker
  1. Installez docker-compose en exécutant la commande suivante dans la console / terminal
# 1. Obtenir pip3 (paquet d'installation Python)
$ sudo yum install python3-pip
 
# 2. Ensuite, exécutez l'une des commandes suivantes
$ sudo pip3 install docker-compose # avec accès root
 
# OU
 
$ pip3 install --user docker-compose # sans accès root pour des raisons de sécurité

# Vérifier les permissions
$ sudo chmod -v +x /usr/local/bin/docker-compose
  1. Activez le service Docker pour qu’il démarre automatiquement au démarrage en exécutant la commande suivante dans la console / terminal

$ sudo systemctl enable docker.service

  1. Démarrez le service Docker en exécutant la commande suivante dans la console / terminal

$ sudo systemctl start docker.service

  1. Vérifiez que le service Docker est en cours d’exécution en exécutant la commande suivante dans la console / terminal, la sortie ressemblera à ceci

Commandes Docker de base qu’il est bon de connaître :

# Version de Docker
$ docker version

# Version de Docker Compose
$ docker-compose version

# Démarrer le service Docker
$ sudo systemctl start docker.service

# Arrêter le service Docker
$ sudo systemctl stop docker.service

# Redémarrer le service Docker
$ sudo systemctl restart docker.service

# État du service Docker
$ sudo systemctl status docker.service

INSTALLATION DE DISCOURSE

  1. Créez le dossier Discourse

$ sudo mkdir /var/discourse

  1. Clonez l’image Docker Discourse dans le répertoire nouvellement créé

$ sudo git clone https://github.com/discourse/discourse_docker.git /var/discourse

  1. Copiez le fichier standalone.yml dans le dossier containers

$ cp /var/discourse/samples/standalone.yml /var/discourse/containers/discourse.yml

  1. Éditez le nouveau fichier discourse.yml comme suit (les éléments importants sont les ports exposés pour HTTP et les détails de l’e-mail pour SMTP ; modifiez-les dans le fichier, ne les copiez pas et ne les collez pas)

Options d’édition :

1. Vous pouvez utiliser nano et éditer via la ligne de commande / terminal
2. Sur AWS, si vous utilisez MATE avec PLUMA, vous pouvez utiliser PLUMA pour éditer le fichier
3. Vous pouvez utiliser WINSCP pour vous connecter en SSH à la machine et éditer le fichier via l’interface graphique Windows

## 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 EXTRÊMEMENT SENSIBLES AUX ERREURS D'ESPACE 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"
  ## Décommentez la ligne suivante pour activer l'écouteur IPv6
  #- "templates/web.ipv6.template.yml"
  - "templates/web.ratelimited.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:
  - "8080:80"   # http (exécuté sur le port local 8080, port Docker 80)
  #- "443:443" # https (assurez-vous que ceci est commenté)

params:
  db_default_text_search_config: "pg_catalog.english"

  ## Définir 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 ajoute 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: 'faq.mobiloan.io'

  ## Décommentez si vous souhaitez que le conteneur soit démarré avec le même
  ## nom d'hôte (option -h) que spécifié ci-dessus (par défaut « $hostname-$config »)
  #DOCKER_USE_HOSTNAME: true

  ## TODO : Liste d'e-mails séparé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: « entrez l'e-mail ici »

  ## 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: ENTREZ SMTP ICI
  DISCOURSE_SMTP_PORT: 587
  DISCOURSE_SMTP_USER_NAME: ENTREZ LE NOM D'UTILISATEUR ICI
  DISCOURSE_SMTP_PASSWORD: ENTREZ LE MOT DE PASSE ICI
  DISCOURSE_SMTP_ENABLE_START_TLS: true           # (optionnel, par défaut true, nous utilisons Amazon SES)

 

  #DISCOURSE_SMTP_DOMAIN: discourse.example.com    # (requis par certains fournisseurs)
  #DISCOURSE_NOTIFICATION_EMAIL: noreply@discourse.example.com    # (adresse à partir de laquelle envoyer les 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)
  ## voir 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
  ## voir 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
## voir 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

## Toutes les commandes personnalisées à 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"
  1. Une fois le fichier édité et enregistré, reconstruisez l’application Discourse en exécutant la commande suivante dans le terminal

$ /var/discourse/launcher rebuild discourse

Note : si votre fichier yaml porte un autre nom, remplacez « discourse » par le nom de votre fichier yaml.

Notez que la reconstruction prend du temps.

  1. Une fois votre application reconstruite, elle devrait être en cours d’exécution sur le port 8080. Pour vérifier, exécutez la commande suivante dans le terminal

$ sudo lsof -i -P -n | grep LISTEN

Exemple de sortie des ports

Remarquez que Docker écoute sur le port 8080, et httpd (Apache) écoute sur le port 80.

En termes de routage du trafic, Apache recevra la requête web et, le cas échéant, la redirigera vers le conteneur Discourse sur le port 8080.

Pour garantir que le routage fonctionne, vous devez configurer l’hôte virtuel dans le fichier de configuration Apache.

CONFIGURATION DE L’HÔTE VIRTUEL APACHE

  1. Le fichier de configuration Apache se trouve dans /etc/httpd/conf.d/00-virtualhosts.conf. httpd / apache / apache2 sont différentes versions d’Apache. Vos fichiers peuvent se trouver à des emplacements différents si vous n’utilisez pas le service httpd, mais la configuration de l’hôte virtuel sera dans ce cas identique.

Options d’édition :

1. Vous pouvez utiliser nano et éditer via la ligne de commande / terminal
2. Sur AWS, si vous utilisez MATE avec PLUMA, vous pouvez utiliser PLUMA pour éditer le fichier
3. Vous pouvez utiliser WINSCP pour vous connecter en SSH à la machine et éditer le fichier via l’interface graphique Windows

Éditez le fichier /etc/httpd/conf.d/00-virtualhosts.conf en ajoutant ce qui suit :

# FAQ (ROUTES DISCOURSE)

<VirtualHost *:80>
  	ServerName  sub.domain.com
  	ProxyPreserveHost On
    ProxyPass "/" "http://localhost:8080/"
    ProxyPassReverse "/" "http://localhost:8080/"
</VirtualHost>
  1. Vous devez créer l’enregistrement DNS CNAME correspondant, en faisant pointer le sous-domaine vers votre serveur AWS / équilibreur de charge.

Notre configuration est un peu compliquée car nous avons un fournisseur de domaine qui redirige tout le trafic vers un équilibreur de charge AWS.

L’équilibreur de charge gère notre SSL/TLS grâce à un certificat fourni par AWS.

L’équilibreur de charge redirige également le trafic vers l’instance AWS.

Apache est installé sur l’instance AWS et redirige le trafic vers nos :

  • Applications Node Express
  • Application Docker / Discourse.

CONCLUSION

Il s’agit d’une seule solution, mais c’est celle qui a fonctionné avec notre configuration existante.

Un grand merci à :

@Kane York pour son article sur Discourse,
@Axel Fernandes pour son article sur Medium et ses notes sur le téléchargement des fichiers Discourse nécessaires,
@Vivek Gite de nixCraft et son article sur cyberciti concernant l’installation de Docker sur AWS Linux 2.