GNU/Linux >> Tutoriels Linux >  >> Linux

Comment installer plusieurs conteneurs Discourse sur le même serveur

L'installation de Discourse est vraiment simple lorsqu'il s'agit d'une seule instance de Discourse sur le serveur. Les choses se compliquent lorsque vous souhaitez installer plusieurs instances de Discourse sur le même serveur pour réduire les coûts.

L'installation officielle de Discourse ne suit pas les pratiques habituelles de Docker. Le programme d'installation de Discourse effectue d'abord quelque chose appelé démarrage, qui vous apparaîtra comme une procédure d'installation de l'hôte. Une fois le processus d'amorçage terminé, le lanceur démarre un conteneur nommé "app" en fonction des commentaires qu'il a reçus de votre part lors de la première installation.

Une telle procédure d'installation hybride est différente lorsqu'il s'agit de la configurer avec d'autres services Web et applications comme WordPress.

Dans ce didacticiel, je vais vous montrer comment installer plusieurs installations de Discourse avec d'autres applications basées sur Docker sur un seul serveur Linux. Ce n'est pas difficile du tout si vous connaissez les bases de Docker et de la ligne de commande Linux.

Installer plusieurs forums Discourse sur le même serveur

En général, une configuration de discours multiples est comprise comme une configuration multisite et le processus a été illustré ici.

Officiellement, Discourse ne fournit aucune documentation pour plusieurs installations de Discourse sur un seul serveur. Mais ne vous inquiétez pas. Je vais vous montrer le processus d'installation pour 3 à 5 conteneurs individuels autonomes fonctionnant sous Nginx, chaque conteneur autonome correspondant à son propre domaine respectif.

J'utilise Ubuntu 18.04 dans ce tutoriel. Veuillez vous assurer que Docker est installé sur Ubuntu ou sur la distribution Linux que vous utilisez.

Je suggère d'utiliser un fournisseur de serveur cloud comme Linode pour déployer rapidement un serveur Linux dans le cloud.

J'ai utilisé domain.com comme exemple de nom de domaine dans le tutoriel. Assurez-vous de le modifier en fonction de vos propres domaines ou sous-domaines.

1. Modifier les enregistrements DNS de votre domaine

Dans le panneau d'enregistrement DNS de votre fournisseur de nom de domaine, assurez-vous que le domaine et les sous-domaines (y compris www) pointent vers l'adresse IP de votre serveur.

Par exemple, pour le domaine racine, laissez le champ du nom d'hôte vide (ou @) et pour les sous-domaines, utilisez un caractère générique « * » lors de la définition de l'adresse IP du serveur.

2. Espace d'échange

Pour vous assurer que toutes vos applications de conteneur sont à l'aise et ne manquent jamais de mémoire après leur déploiement, il est essentiel que vous disposiez de l'espace d'échange nécessaire sur votre système.

Vous pouvez toujours ajuster le swap en fonction de la RAM disponible sur votre système. Vous pouvez décider de l'espace d'échange en fonction du groupe de conteneurs d'applications sur le serveur unique et en estimant leur utilisation cumulative de la RAM. Discourse vérifie et configure également l'échange pour vous.

3. Créer un réseau Docker

Ce réseau docker permettra aux conteneurs de communiquer entre eux selon les besoins. Appelons cela chaîne pour une meilleure compréhension.

Vous utiliserez ce réseau lors de la configuration de tous vos conteneurs.

docker network create chain

4. Configurer le proxy inverse Nginx

Passez maintenant à la configuration du proxy inverse Nginx. Notez que cela agit comme une interface qui mappera tous les différents ports de conteneur sur lui-même afin que vous puissiez y accéder via des URL. Vous pouvez également l'appeler le "conteneur mère".

docker run --name nginx-proxy --net chain -p 80:80 -p 443:443 -v ~/certs:/etc/nginx/certs -v /etc/nginx/vhost.d -v /usr/share/nginx/html -v /var/run/docker.sock:/tmp/docker.sock:ro --label com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy -d --restart always jwilder/nginx-proxy

5. Configurer Let's Encrypt Nginx Proxy Companion

Notez que nous disons à docker d'utiliser les volumes déjà déclarés sur le premier conteneur nginx-proxy. Il utilise le même réseau "chaîne" que vous avez créé à l'étape 3.

docker run --name letsencrypt-nginx-proxy-companion --net chain -v ~/certs:/etc/nginx/certs:rw -v /var/run/docker.sock:/var/run/docker.sock:ro --volumes-from nginx-proxy -d --restart always jrcs/letsencrypt-nginx-proxy-companion

Ce conteneur compagnon pour nginx-proxy s'occupe de la configuration des certificats SSL avec Let's Encrypt. Vous le verrez en configurant enfin vos conteneurs Discourse.

6. Redirection WWW via Nginx (CNAME non requis, étape facultative pour l'utilisation de sous-domaines)

Pour assurer la redirection des demandes de domain.com vers www.domain.com comme n'importe quel autre site, vous devez effectuer une étape supplémentaire.

Entrez le conteneur nginx-proxy :

docker exec -ti nginx-proxy /bin/bash

Vous verriez maintenant une invite racine comme celle-ci :

[email protected]:/app#

Vous souvenez-vous de l'emplacement /etc/nginx/vhost.d que j'ai mentionné à l'étape 4 ? Créez un nouveau fichier ici qui sera le même que votre nom de domaine racine. Vous n'avez pas vim ou nano ici. Au lieu d'installer Vim ou Nano, utilisez le cat commande.

cat >> /etc/nginx/vhost.d/domain.com

À la prochaine invite, tout ce que vous écrivez modifiera le fichier. Assurez-vous donc de remplacer www.domain.com par votre propre domaine dans la ligne suivante :

rewrite ^/(.*)$ https://www.domain.com/$1 permanent;

Appuyez sur Entrée puis sur Ctrl+D pour l'enregistrer. Entrez exit pour sortir du conteneur.

[email protected]:/app# exit

Arrêtons tous les conteneurs ci-dessus (dans l'ordre indiqué) que vous avez créés jusqu'à présent. Vous n'utiliserez pas le redémarrage, redémarrez-les simplement car vous ne voulez pas que d'autres conteneurs écoutent lors du redémarrage de chacun d'eux.

docker stop nginx-proxy
docker stop letsencrypt-nginx-proxy-companion
docker start nginx-proxy
docker start letsencrypt-nginx-proxy-companion

7. Clonez l'image officielle de Discourse Docker

Conformément au guide officiel, clonez l'image docker officielle du discours dans le répertoire /var/discourse. C'est là que Discourse peut stocker tous ses volumes Docker appartenant à ses conteneurs respectifs après la configuration.

sudo -s
git clone https://github.com/discourse/discourse_docker.git /var/discourse
cd /var/discourse

8. Copiez la configuration autonome

L'étape suivante consiste maintenant à vous assurer de copier le fichier /var/discourse/standalone.yml dans /var/discourse/containers/ en tant qu'app.yml avant de le modifier en fonction de vos besoins.

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

Un fichier yml autonome typique ressemble à ceci.

9. Préparer la configuration autonome

Vous devez maintenant modifier ce fichier car votre configuration va se baser sur nginx.

Les ports 80 et 443 sont déjà utilisés par le même. Vous avez également déjà notre conteneur Letsencrypt et vous devez montrer à Discourse votre réseau Docker existant dans lequel vous souhaitez l'installer.

Lors de la configuration de votre domaine ici, vous aurez également besoin d'un serveur de messagerie pour configurer vos e-mails de notification de forum (j'ai utilisé Sendgrid ici).

Notez que LETSENCRYPT_EMAIL (pour notifier les mises à jour SSL) et DISCOURSE_DEVELOPER_EMAILS (pour l'administrateur) peuvent être différents si nécessaire.

nano /var/discourse/containers/app.yml

10. Personnalisez la configuration autonome

Voici mon fichier modifié renommé en app.yml à des fins de démonstration. Il est recommandé de modifier votre propre fichier yml pour éviter les problèmes d'alignement.

this is the all-in-one, standalone Discourse Docker container template
 #
 After making changes to this file, you MUST rebuild
 /var/discourse/launcher rebuild app
 #
 BE VERY CAREFUL WHEN EDITING!
 YAML FILES ARE SUPER SUPER SENSITIVE TO MISTAKES IN WHITESPACE OR ALIGNMENT!
 visit http://www.yamllint.com/ to validate this file as needed
 templates:
 "templates/postgres.template.yml"
 "templates/redis.template.yml"
 "templates/web.template.yml"
 "templates/web.ratelimited.template.yml" 
 Uncomment these two lines if you wish to add Lets Encrypt (https)
 #- "templates/web.ssl.template.yml"
 #- "templates/web.letsencrypt.ssl.template.yml"
 which TCP/IP ports should this container expose?
 If you want Discourse to share a port with another webserver like Apache or nginx,
 see https://meta.discourse.org/t/17247 for details
 expose:
   - "80" 
 #- "80:80"   # http
 #- "443:443" # https
 docker_args:
   - "--net chain" 
 params:
   db_default_text_search_config: "pg_catalog.english"
 ## Set db_shared_buffers to a max of 25% of the total memory.
   ## will be set automatically by bootstrap based on detected RAM, or you can override
   #db_shared_buffers: "256MB"
 ## can improve sorting performance, but adds memory usage per-connection
   #db_work_mem: "40MB"
 ## Which Git revision should this container use? (default: tests-passed)
   #version: tests-passed
 env:
   LANG: en_US.UTF-8
   # DISCOURSE_DEFAULT_LOCALE: en
 ## How many concurrent web requests are supported? Depends on memory and CPU cores.
   ## will be set automatically by bootstrap based on detected CPUs, or you can override
   #db_shared_buffers: "256MB"
 ## can improve sorting performance, but adds memory usage per-connection
   #db_work_mem: "40MB"
 ## Which Git revision should this container use? (default: tests-passed)
   #version: tests-passed
 env:
   LANG: en_US.UTF-8
   # DISCOURSE_DEFAULT_LOCALE: en
 ## How many concurrent web requests are supported? Depends on memory and CPU cores.
   ## will be set automatically by bootstrap based on detected CPUs, or you can override
   #UNICORN_WORKERS: 3
 ## TODO: The domain name this Discourse instance will respond to
   ## Required. Discourse will not work with a bare IP number.
   DISCOURSE_HOSTNAME: 'domain.com'
   VIRTUAL_HOST: 'domain.com,www.domain.com'
   LETSENCRYPT_HOST: 'domain.com,www.domain.com'
   LETSENCRYPT_EMAIL: '[email protected]'
 ## Uncomment if you want the container to be started with the same
   ## hostname (-h option) as specified above (default "$hostname-$config")
   #DOCKER_USE_HOSTNAME: true
 ## TODO: List of comma delimited emails that will be made admin and developer
   ## on initial signup example '[email protected],[email protected]'
   DISCOURSE_DEVELOPER_EMAILS: '[email protected]'
 ## TODO: The SMTP mail server used to validate new accounts and send notifications
   # SMTP ADDRESS, username, and password are required
   # WARNING the char '#' in SMTP password can cause problems!
   DISCOURSE_SMTP_ADDRESS: smtp.sendgrid.net
   DISCOURSE_SMTP_PORT: 587
   DISCOURSE_SMTP_USER_NAME: apikey
   DISCOURSE_SMTP_PASSWORD: yourpassword
   DISCOURSE_SMTP_ENABLE_START_TLS: true           # (optional, default true)
 ## If you added the Lets Encrypt template, uncomment below to get a free SSL certificate
   #LETSENCRYPT_ACCOUNT_EMAIL: [email protected]
 ## The http or https CDN address for this Discourse instance (configured to pull)
   ## see https://meta.discourse.org/t/14857 for details
   #DISCOURSE_CDN_URL: https://discourse-cdn.example.com
 The Docker container is stateless; all data is stored in /shared
 volumes:
 volume:
   host: /var/discourse/shared/standalone
   guest: /shared
 volume:
   host: /var/discourse/shared/standalone/log/var-log
   guest: /var/log 
 Plugins go here
 see https://meta.discourse.org/t/19157 for details
 hooks:
   after_code:
     - exec:
         cd: $home/plugins
         cmd:
           - git clone https://github.com/discourse/docker_manager.git
 Any custom commands to run after building
 run:
 exec: echo "Beginning of custom commands"
 ## If you want to set the 'From' email address for your first registration, uncomment and change:
 ## After getting the first signup email, re-comment the line. It only needs to run once.
 #- exec: rails r "SiteSetting.notification_email='[email protected]'"
 exec: echo "End of custom commands" 

Vérifiez les détails suivants :

La configuration du port doit être :

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

Nom de réseau existant correctement configuré dans le fichier comme indiqué ci-dessus.

docker_args:
  - "--net chain"

Sinon, vous verrez une page vierge lorsque vous vérifierez votre domaine après l'installation.

12. Amorcer et lancer

Après avoir enregistré le fichier ci-dessus, exécutez les commandes suivantes :

cd /var/discourse
./launcher bootstrap app

Cela prendra un temps considérable. À la fin du processus d'amorçage, il vous sera demandé :

./launcher start app

Notez que si vous aviez nommé le fichier xyz.yml, la commande aurait été modifiée en conséquence (./launcher start xyz).

C'est le nom du conteneur en cours d'exécution que vous pouvez vérifier avec "docker ps “. Désormais, lorsque vous visiterez le domaine dans votre navigateur, vous verrez la page suivante :

13. Paramètres SSL

À partir de ce moment, le processus d'inscription est assez simple. Une fois que vous avez terminé l'enregistrement, dans le dashbaird d'administration Docker, allez dans paramètres> sécurité et activez "force https".

Après l'avoir enregistré, arrêtez le conteneur et redémarrez-le :

./launcher stop app
./launcher start app

Après quelques instants, SSL commencera à fonctionner sur votre forum. Assurez-vous également de prendre soin des dépendances pour https.

14. Installez plus d'instances Discourse dans plus de conteneurs autonomes

Pour plus de conteneurs Discourse, vous devez répéter le même processus à partir de l'étape 8 .

Au départ, vous avez utilisé l'application. Maintenant, vous devez utiliser d'autres noms comme app2, app3 etc.

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

Une étape supplémentaire serait également nécessaire pour que chacun d'eux spécifie un nouvel emplacement (par exemple, standalone2, standalone3, etc.) dans leurs fichiers yml respectifs pour les volumes Docker (vérifiez l'étape 10). Bien entendu, vous devrez également modifier le nom de domaine.

## The Docker container is stateless; all data is stored in /shared
 volumes:
 volume:
   host: /var/discourse/shared/standalone2
   guest: /shared
 volume:
   host: /var/discourse/shared/standalone2/log/var-log
   guest: /var/log

Avec cela, suivez le reste des étapes et vous aurez plus de Discourse installé sur le même serveur.

J'espère que vous trouverez cet article utile pour configurer plusieurs forums Discourse avec leurs conteneurs Docker respectifs.

Si vous avez des questions ou des suggestions, n'hésitez pas à laisser un commentaire ci-dessous.


Linux
  1. Héberger plusieurs sites Web sur des conteneurs Docker

  2. Comment installer Discourse sur Ubuntu 20.04 LTS

  3. Comment installer le serveur Web Apache sur Ubuntu

  4. Comment installer Discourse sur Ubuntu 20.04

  5. Comment installer Docker sur Ubuntu 18.04 ?

Comment installer Docker Portainer pour gérer les conteneurs

Comment auto-héberger plusieurs sites WordPress sur le même serveur avec Docker

Comment installer OpenLDAP sur Ubuntu Server 22.04

Comment installer Lighttpd sur le serveur Ubuntu

Comment installer le serveur FTP sur Ubuntu ?

Comment installer Docker sur Ubuntu 18.04