Discourse ne se charge pas avec Apache et la redirection de proxy

J’ai passé les derniers jours à chercher un moyen de coupler Discourse avec Apache sur le même droplet DigitalOcean, et les tutoriels disponibles ici sur Discourse sont soit obsolètes, soit inapplicables à mon cas. L’un d’eux utilise CentOS et HAProxy (j’utilise Ubuntu) et l’autre utilise Nginx (j’utilise Apache).

Je suis tombé sur un commentaire dans un fil de discussion de DigitalOcean et j’ai suivi les instructions qui s’y trouvaient sur un droplet de test : Install Discourse on a droplet with WordPress served by Apache ? | DigitalOcean

Tout semble s’être déroulé sans encombre, y compris le certificat SSL Let’s Encrypt. Ma page d’accueil et quelques documents HTML statiques fonctionnent parfaitement. Discourse, bien qu’installé sans erreur, n’apparaît pas. Lorsque je navigue vers community.mysite.com, je vois simplement ma page d’accueil avec une URL HTTPS non sécurisée. Oui, mes paramètres DNS sont exacts et pointent vers le bon serveur.

Voici mon fichier mysite.com.conf :

<VirtualHost *:80>
	ServerAdmin webmaster@localhost
	ServerName mysite.com
	ServerAlias www.mysite.com
	DocumentRoot /var/www/mysite.com
	ErrorLog ${APACHE_LOG_DIR}/error.log
	CustomLog ${APACHE_LOG_DIR}/access.log combined
RewriteEngine on
RewriteCond %{SERVER_NAME} =www.mysite.com [OR]
RewriteCond %{SERVER_NAME} =mysite.com
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>

Voici mon fichier mysite.com-le-ssl.conf :

<IfModule mod_ssl.c>
<VirtualHost *:443>
	ServerAdmin webmaster@localhost
	ServerName mysite.com
	ServerAlias www.mysite.com
	DocumentRoot /var/www/mysite.com
	ErrorLog ${APACHE_LOG_DIR}/error.log
	CustomLog ${APACHE_LOG_DIR}/access.log combined

Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateFile /etc/letsencrypt/live/mysite.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/mysite.com/privkey.pem
</VirtualHost>
</IfModule>

Voici mon fichier community.mysite.com.conf :

<VirtualHost *:80>
  ServerName community.mysite.com
  ServerAlias www.community.mysite.com

  <IfModule proxy_module>
    ProxyPreserveHost on
    ProxyPass / http://localhost:8080/
    ProxyPassReverse / http://localhost:8080/
  </IfModule>
</VirtualHost>

Et enfin, voici mon fichier app.yml (évidemment modifié) :

## il s'agit du 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 MODIFIANT !
## LES FICHIERS YAML SONT EXTRÊMEMENT 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"
## 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"   # transfert du port hôte 8080 vers le port du conteneur 80 (http)
      - "8443:443"   # transfert du port hôte 8443 vers le port du conteneur 443 (http)

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: "128MB"

  ## 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:
  LANG: 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: 2

  ## TODO : Le nom de domaine auquel cette instance Discourse répondra
  ## Requis. Discourse ne fonctionnera pas avec une adresse IP brute.
  DISCOURSE_HOSTNAME: community.mysite.com

  ## 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 séparés par des virgules qui seront administrateurs et développeurs
  ## lors de l'inscription initiale, par exemple 'user1@example.com,user2@example.com'
  DISCOURSE_DEVELOPER_EMAILS: 'myemail'

  ## 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: smtp.mailgun.org
  DISCOURSE_SMTP_PORT: 587
  DISCOURSE_SMTP_USER_NAME: my-smtp-username
  DISCOURSE_SMTP_PASSWORD: "my-smtp-password"
  #DISCOURSE_SMTP_ENABLE_START_TLS: true           # (facultatif, par défaut true)

  ## Si vous avez ajouté le modèle Lets Encrypt, décommentez ci-dessous pour obtenir un certificat SSL gratuit
  LETSENCRYPT_ACCOUNT_EMAIL: myemail

  ## 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

## 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"

Quelqu’un peut-il me dire où j’ai fait une erreur ou ce qui pourrait me manquer ? Merci !

Vous aurez beaucoup plus de chances en essayant nginx comme proxy inverse.

Si votre système le permet, envisagez d’utiliser nginx à la place d’apache2

Donc, la communauté ne redirige pas vers votre domaine mais pointe vers votre adresse IP. Le lien symbolique est-il présent dans /etc/apache2/sites-enabled/ ?

Le module proxy est-il chargé ?
apache2ctl -M

Aucun lien symbolique.

Oui. Heureusement, c’est l’une des étapes du tutoriel que j’ai lié.

a2enmod proxy
a2enmod proxy_http
a2enmod proxy_balancer
a2enmod lbmethod_byrequests

l’étape

a2ensite community.yoursite.com

n’a peut-être pas bien fonctionné alors, il faudra peut-être utiliser sudo.

sudo ln -s /etc/apache2/sites-available/community.yoursite.com.conf /etc/apache2/sites-enabled/

devrait aussi fonctionner.
ensuite

sudo apachectl configtest

et croisez les doigts

sudo systemctl restart apache2

Cher @OrbitStorm,

J’ai jeté un coup d’œil rapide à votre configuration des hôtes virtuels Apache2 et à votre fichier yml pour Discourse, et il semble qu’ils ne soient pas correctement configurés.

Voici quelques pistes :

Tout d’abord, lorsque vous exécutez Discourse derrière un proxy inverse, vous ne devez pas activer SSL LETSENCRYPT dans la configuration yml de Discourse (voir l’exemple fonctionnel ci-dessous). Discourse n’a besoin que d’un seul port pour communiquer avec le proxy inverse, et cette connexion n’est pas chiffrée en SSL.

Ensuite, si vous examinez votre configuration principale de l’hôte virtuel, qui correspond au port 443 sur le proxy inverse :

<IfModule mod_ssl.c>
<VirtualHost *:443>
	ServerAdmin webmaster@localhost
	ServerName mysite.com
	ServerAlias www.mysite.com
	DocumentRoot /var/www/mysite.com
	ErrorLog ${APACHE_LOG_DIR}/error.log
	CustomLog ${APACHE_LOG_DIR}/access.log combined

       Include /etc/letsencrypt/options-ssl-apache.conf
       SSLCertificateFile /etc/letsencrypt/live/mysite.com/fullchain.pem
       SSLCertificateKeyFile /etc/letsencrypt/live/mysite.com/privkey.pem
</VirtualHost>
</IfModule>

Cette configuration ci-dessus manque toutes les informations nécessaires relatives au proxy inverse (voir les configurations fonctionnelles jointes ci-dessous).

Voici une configuration fonctionnelle pour vous, qui est essentiellement la même que celle décrite dans les différents tutoriels sur Meta (bien documentée sur ce site dans d’autres publications, donc il s’agit essentiellement de dupliquer d’autres documentations ici sur Meta) :

<VirtualHost *:80>
        ServerName discourse.your-great-web-site.com
        ServerAdmin webmaster@localhost
        ProxyPreserveHost On
        ErrorLog ${APACHE_LOG_DIR}/discourse_errors.log
        CustomLog ${APACHE_LOG_DIR}/discourse.log combined
        ModPagespeed Off
        RewriteEngine on
        RewriteCond %{SERVER_NAME} =discourse.your-great-web-site.com
        RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>

Notez que dans la configuration du port 80, les directives principales requises sont ServerName, RewriteEngine et les règles de réécriture pour rediriger vers le port 443.

De plus, si vous exécutez Apache2 avec mod_pagespeed, vous devriez le désactiver, car je n’ai pas encore réussi à faire fonctionner mod_pagespeed avec Discourse (et je ne vois aucune raison de le faire non plus).

Voici la configuration principale où le « vrai travail » est effectué :

<IfModule mod_ssl.c>
<VirtualHost *:443>
        ServerName discourse.your-great-web-site.com
        ServerAdmin webmaster@localhost
        SSLProxyEngine on      # activez ceci uniquement après que Let's Encrypt est configuré et fonctionnel
  	    RewriteEngine on
  	    ProxyPreserveHost On
  	    ProxyRequests Off
  	    RequestHeader set X-Forwarded-Proto expr=%{REQUEST_SCHEME}
 	    RequestHeader set X-Real-IP expr=%{REMOTE_ADDR}

        #ProxyPass / http://127.0.0.1:8888/           # nous n'utilisons pas de port, nous utilisons les sockets your-great-web-site
        #ProxyPassReverse / http://127.0.0.1:8888/    # nous n'utilisons pas de port, nous utilisons les sockets your-great-web-site
        ProxyPass / your-great-web-site:/var/discourse/shared/socket-only/nginx.http.sock|http://localhost/
        ProxyPassReverse  / your-great-web-site:/var/discourse/shared/socket-only/nginx.http.sock|http://localhost/

        ErrorLog ${APACHE_LOG_DIR}/discourse_errors_ssl.log
        #CustomLog ${APACHE_LOG_DIR}/discourse_ssl.log combined   # journal d'accès désactivé pour la production

        ModPagespeed Off
        SSLCertificateFile /etc/letsencrypt/live/discourse.your-great-web-site.com/fullchain.pem
        SSLCertificateKeyFile /etc/letsencrypt/live/discourse.your-great-web-site.com/privkey.pem
        Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>
</IfModule>

Toutes nos configurations Discourse utilisent des sockets de domaine Unix, vous devrez donc modifier la configuration pour qu’elle corresponde à votre configuration souhaitée.

Le point principal à comprendre (en résumé) est que vous devez désactiver LETSENCRYPT dans votre configuration de build Discourse (fichier yml) et n’exposer qu’un seul point d’entrée vers Discourse, dans notre cas un socket de domaine Unix, dans votre cas un seul socket TCP/IP.

Ensuite, vous configurez le proxy inverse vers ce point d’entrée depuis le fichier de l’hôte virtuel pour le port 443 (et non depuis l’hôte virtuel du port 80). L’hôte virtuel du port 80 se contente de rediriger vers le port 443. Votre SSL 443 est entièrement géré par LETSENCRYPT dans le proxy inverse. Aucun SSL n’est requis dans votre fichier yml Discourse (voir l’exemple fonctionnel ci-dessous).

Voici l’un de nos fichiers yml fonctionnels (pour la configuration ci-dessus) que vous pouvez examiner :

/var/discourse/containers$ cat socket-only.yml
# IMPORTANT : DÉFINIR UN MOT DE PASSE SECRET dans Postgres pour l'utilisateur Discourse
# TODO : changer SOME_SECRET dans ce modèle

templates:
  - "templates/web.template.yml"
  - "templates/web.ratelimited.template.yml"
  - "templates/web.socketed.template.yml"
#  - "templates/sshd.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,
## voir https://meta.discourse.org/t/17247 pour plus de détails
expose:
#  - "80:80"   # http
#  - "443:443" # https

# Utilisez la clé 'links' pour lier les conteneurs entre eux, c'est-à-dire utiliser le drapeau Docker --link.
links:
  - link:
      name: data
      alias: data

# Des arguments supplémentaires pour Docker ?
# docker_args:

params:
  ## Quelle révision Git ce conteneur doit-il utiliser ? (par défaut : tests-passed)
  #version: latest
  db_shared_buffers: "4GB"

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
  UNICORN_WORKERS: 8

  ## TODO : Le nom de domaine auquel cette instance Discourse répondra
  DISCOURSE_HOSTNAME: 'discourse.your-great-web-site.com'

  ## 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 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: 'tim@discourse.your-great-web-site.com'

  ## 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: smtp.gmail.com
  DISCOURSE_SMTP_PORT: 587
  DISCOURSE_SMTP_USER_NAME: not_for_reply@discourse.your-great-web-site.com
  DISCOURSE_SMTP_PASSWORD: my_super_secret_cool_password
  #DISCOURSE_SMTP_ENABLE_START_TLS: true           # (optionnel, par défaut true)

  ## 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

  ## TODO : configurer la connectivité aux bases de données
  DISCOURSE_DB_SOCKET: ''
  #DISCOURSE_DB_USERNAME: discourse
  DISCOURSE_DB_PASSWORD: another_super_secret_cool_password
  DISCOURSE_DB_HOST: data
  DISCOURSE_REDIS_HOST: data

  DISCOURSE_MAXMIND_LICENSE_KEY: my_max_mind_key
  ## 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

volumes:
  - volume:
      host: /var/discourse/shared/socket-only
      guest: /shared
  - volume:
      host: /var/discourse/shared/socket-only/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
          - git clone https://github.com/discourse/discourse-bbcode.git
          - git clone https://github.com/discourse/discourse-sitemap.git
          - git clone https://github.com/discourse/discourse-solved.git
          - git clone https://github.com/discourse/discourse-whos-online.git
          - git clone https://github.com/unixneo/legacy-info.git

## Rappelez-vous, ceci est une syntaxe YAML - vous ne pouvez avoir qu'un seul bloc avec un nom
run:
  - exec: echo "Début des commandes personnalisées"

  ## Si vous souhaitez configurer la connexion par mot de passe pour root, décommentez et modifiez :
  ## N'utilisez qu'une seule des lignes suivantes :
  #- exec: /usr/sbin/usermod -p 'PASSWORD_HASH' root
  #- exec: /usr/sbin/usermod -p "$(mkpasswd -m sha-256 'RAW_PASSWORD')" root

  ## Si vous souhaitez autoriser des utilisateurs supplémentaires, décommentez et modifiez :
  #- exec: ssh-import-id username
  #- exec: ssh-import-id anotherusername

  - exec: echo "Fin des commandes personnalisées"
  #- exec: awk -F\# '{print $1;}' ~/.ssh/authorized_keys | awk 'BEGIN { print "Clés SSH autorisées pour ce conteneur :"; } NF>=2 {print $NF;}'

C’est vraiment facile une fois que vous comprenez les bases ; et comprendre les bases aide beaucoup :slight_smile:

Veuillez garder à l’esprit que dans nos configurations Discourse, nous n’exécutons pas un seul conteneur (en fait, nous exécutons rarement en mode conteneur unique), donc notre fichier yml ne fonctionnera pas dans une configuration à conteneur unique (autonome). Je vous le fournis à titre de référence pour vous aider, en vous montrant à quoi ressemble une configuration entièrement fonctionnelle derrière Apache2.

Nous exécutons Discourse derrière des proxies inverses Apache2 et nginx. En fait, nous n’utilisons que des proxies inverses pour de nombreuses raisons. L’une d’elles est que nous pouvons utiliser le proxy inverse pour filtrer les mauvais bots, etc. (un sujet totalement différent).

Il n’y a rien de difficile à exécuter Discourse conteneurisé (autant de sites que vous le souhaitez, un ou 100) derrière un proxy inverse sur un site avec Apache2 ; mais il est utile de comprendre les concepts de base.

J’espère que vous fournir à la fois les concepts de base et des fichiers de configuration fonctionnels vous aidera à avancer et à mettre Discourse en ligne.

Cordialement…

@neounix Je vous remercie pour cette réponse extrêmement détaillée, mais il semble que la plupart des problèmes auxquels je suis confronté résultent de l’incapacité à trouver un tutoriel mis à jour et adapté. Plusieurs tutoriels ici indiquent d’activer SSL pour Discourse dans le fichier yml, et l’un d’eux précise que je n’ai pas besoin d’ajouter des informations de proxy à mes fichiers VirtualHost, car Let’s Encrypt devrait le faire automatiquement. Vos exemples sont radicalement différents, même par rapport à mes paramètres par défaut, ce qui les rend tout aussi confus que de tenter de fusionner une configuration CentOS avec Ubuntu.

Vous avez tout à fait raison de dire que comprendre les bases va loin, mais le problème est que les bases ne sont pas correctement couvertes, et lorsqu’elles le sont, elles datent de trois ans et ne tiennent pas compte du fait que certains utilisent Apache au lieu de Nginx ou Ubuntu au lieu de CentOS. Il est également à noter que Discourse est la seule raison pour laquelle j’utilise Docker.

Après avoir passé quatre jours à essayer simplement d’installer l’application avec Apache, j’en ai assez. Gratuit ou non, cela ne vaut pas la migraine, et je ne continuerai pas à fouiller les forums pour retomber sur des liens copiés-collés pointant vers les mêmes deux tutoriels obsolètes et incomplets. Je n’ai jamais eu d’expérience frustrante avec l’installation d’un logiciel de forum jusqu’à Discourse. Cela en dit long. XenForo et Invision sont deux plateformes avec lesquelles j’ai une expérience immense, et leur installation et leur utilisation sont un jeu d’enfant.

J’apprécie vraiment l’effort que vous avez fourni dans votre réponse, mais je ne vais pas vous demander de faire le travail à ma place, ni ne devrais le faire si une documentation appropriée existait. Il est simplement étonnant pour moi que mes circonstances spécifiques, qui ne sont pas si particulières à mon cas, n’aient pas été mises en avant dans un nouveau tutoriel qui rendrait ce processus plus facile pour les nouveaux utilisateurs.

Quoi qu’il en soit, je vous souhaite bonne chance.

Malgré mon intention initiale de passer à autre chose avec Discourse, étant donné l’absence totale de documentation actuelle qui ne soit pas hyper-centrée sur CentOS/Nginx, une personne incroyablement généreuse et patiente chez DigitalOcean a répondu à un fil que j’avais créé là-bas. Après quelques essais et erreurs, elle m’a aidé à mettre au point un tutoriel simple à suivre pour les futurs utilisateurs de Discourse se trouvant dans la même situation que moi.

Pour rappel, ces circonstances sont les suivantes :

Installer Discourse sur le même serveur qu’Apache | Utilisation d’Ubuntu 18.04 | DigitalOcean

crédit à Bobbyiliev @ DigitalOcean
Install Discourse on a droplet with WordPress served by Apache ? | DigitalOcean (première réponse)

Prérequis

  • Par mesure de précaution, assurez-vous de sauvegarder votre Droplet, afin de pouvoir revenir à une version fonctionnelle en cas de problème.
  • Connectez-vous en SSH à votre Droplet.
  • Apache doit être installé. Vous pouvez suivre les étapes pour cela ici :

Étape 1 - Installer Docker

Pour installer Docker, veuillez suivre les étapes indiquées ici :

Étape 2 - Télécharger Discourse

Tout d’abord, créez un répertoire où vous stockerez vos fichiers Discourse :

mkdir /var/discourse

Ensuite, clonez l’image Docker officielle de Discourse dans /var/discourse.

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

Étape 3 - Configurer Discourse pour écouter sur le port 8080

Nous utiliserons le modèle standalone.yml qui inclut tous les services nécessaires tels que PostgreSQL, Redis, etc.

Copiez le fichier exemple avec la commande suivante :

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

Ensuite, éditez le fichier avec votre éditeur préféré. Ouvrez /var/discourse/containers/app.yml et mettez à jour les ports aux lignes 23 et 24 :

## Quels ports TCP/IP ce conteneur doit-il exposer ?
expose:
  - "8080:80"   # transférer le port hôte 8080 vers le port 80 du conteneur (http)
  - "8443:443"   # transférer le port hôte 8443 vers le port 443 du conteneur (https)

Si vous ne possédez pas encore de certificat SSL, assurez-vous de commenter la ligne 16 :

  #- "templates/web.ssl.template.yml"

Ajoutez simplement le symbole # devant la ligne - "templates/web.ssl.template.yml", sinon Discourse ne démarrera pas.

Étape 4 - Configurer Discourse

Changez de répertoire :

cd /var/discourse

Ensuite, démarrez Discourse (comme c’est la première fois que vous lancez le service, cela initialisera l’application avec les nouvelles modifications présentes dans votre fichier app.yml) :

./discourse-setup

Remarque : Assurez-vous de fournir des paramètres de serveur de messagerie valides, sinon la configuration pourrait échouer.

Étape 5 - Configurer Apache

Dans votre répertoire /etc/apache2/sites-available/, créez un nouveau fichier nommé forum.example.com.conf et ajoutez le contenu Vhost suivant :

<VirtualHost *:80>
  ServerName forum.example.com
  ServerAlias www.forum.example.com

  <IfModule proxy_module>
    ProxyPreserveHost on
    ProxyPass / http://localhost:8080/
    ProxyPassReverse / http://localhost:8080/
  </IfModule>
</VirtualHost>
  • Activez le Vhost avec la commande suivante :
a2ensite forum.example.com
  • Activez le module Proxy :
a2enmod proxy
a2enmod proxy_http
a2enmod proxy_balancer
a2enmod lbmethod_byrequests
  • Redémarrez Apache :
systemctl restart apache2

Après cela, vous pourrez accéder directement à Discourse via votre nom de domaine.


Remarque 1 : Lors de l’installation de Discourse, le fichier app.yml peut être écrasé et les lignes 16/17 (SSL) seront décommentées. Vous devrez les commenter à nouveau, puis reconstruire l’application (n’oubliez pas de changer de répertoire) : ./launcher rebuild app

Remarque 2 : SSL n’est pas activé pour Discourse avec ce guide. Il est peu surprenant qu’aucune documentation n’existe pour activer SSL Let’s Encrypt si vous l’avez déjà activé pour Apache. Si quelqu’un tombe sur une solution à ce problème, n’hésitez pas à me contacter.