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
-
Ouvrez CMD / Terminal
-
Connectez-vous à l’instance AWS EC2 via SSH
Exemple d’écran une fois connecté à l’instance EC2
EFFECTUER LES MISES À JOUR DU SYSTÈME
- Effectuez les mises à jour du système en exécutant la commande suivante dans la console / terminal
$ sudo yum update
INSTALLATION DE DOCKER
- Recherchez le package Docker AWS en exécutant la commande suivante dans la console / terminal
$ sudo yum search docker
- Obtenez les informations sur la version en exécutant la commande suivante dans la console / terminal
$ sudo yum info docker
- Installez Docker en exécutant la commande suivante dans la console / terminal
$ sudo yum install docker
- 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
- 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
- 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
- Démarrez le service Docker en exécutant la commande suivante dans la console / terminal
$ sudo systemctl start docker.service
- 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
- Créez le dossier Discourse
$ sudo mkdir /var/discourse
- Clonez l’image Docker Discourse dans le répertoire nouvellement créé
$ sudo git clone https://github.com/discourse/discourse_docker.git /var/discourse
- Copiez le fichier standalone.yml dans le dossier containers
$ cp /var/discourse/samples/standalone.yml /var/discourse/containers/discourse.yml
- É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"
- 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.
- 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
- 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>
- 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.


