J’ai réussi à installer Discourse sur mon serveur, à m’inscrire en tant que premier utilisateur et à publier mon premier sujet. Tout semble donc fonctionner correctement côté Discourse.
Cependant, pour installer et faire fonctionner Discourse, j’ai dû désactiver mon démon Apache httpd. C’est un problème majeur pour moi, car j’ai essentiellement arrêté l’ensemble de mon serveur web, qui héberge plusieurs domaines ainsi qu’un serveur de conférence Jitsi.
Mon installation de Jitsi fonctionne comme un hôte virtuel distinct, utilisant un sous-domaine de l’un des sites que j’héberge. Puisque Jitsi peut partager le port 443 avec le reste du trafic web, je souhaiterais faire de même avec Discourse.
Quelqu’un possède-t-il une définition de modèle d’hôte virtuel permettant de rediriger le trafic vers Discourse lorsqu’il arrive sur le sous-domaine de Discourse ?
Essentiellement résolu, cependant la page d’accueil semble prendre beaucoup de temps pour terminer la requête, même après que la page semble être complètement chargée. (Je ne suis pas sûr que ce soit un comportement normal ou non.)
Discourse
J’ai modifié le bloc expose dans /var/discourse/containers/app.yml pour :
Ce qui redirige depuis localhost vers le conteneur Docker. Après cela, une reconstruction est nécessaire en utilisant ./launcher rebuild app
Apache2 2.4.43 (Ubuntu)
J’ai ajouté un nouvel hôte virtuel pour le sous-domaine : discourse..com.conf dans sites-available, qui redirige le trafic du sous-domaine vers le port localhost sur lequel l’instance Docker de Discourse écoute. La définition de l’hôte virtuel est ci-dessous :
<VirtualHost *:80>
ServerName discourse.<myDomain>.com
Redirect permanent / https://discourse.<myDomain>.com/
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</VirtualHost>
<VirtualHost *:443>
ServerName discourse.<myDomain>.com
SSLProtocol TLSv1 TLSv1.1 TLSv1.2
SSLEngine on
SSLProxyEngine on
SSLCertificateFile /etc/letsencrypt/live/<myDomain>.com/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/<myDomain>.com/privkey.pem
SSLCACertificateFile /etc/letsencrypt/live/<myDomain>.com/chain.pem
SSLCipherSuite "EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA256:EECDH+ECDSA+SHA384:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA384:EDH+aRSA+AESGCM:EDH+aRSA+SHA256:EDH+aRSA:EECDH:!aNULL:!eNULL:!MEDIUM:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS:!RC4:!SEED"
SSLHonorCipherOrder on
Header set Strict-Transport-Security "max-age=31536000"
<Location />
Order allow,deny
Allow from all
Require all granted
</Location>
ProxyPreserveHost on
ProxyRequests Off
RequestHeader set X-Forwarded-Proto expr=%{REQUEST_SCHEME}
RequestHeader set X-Real-IP expr=%{REMOTE_ADDR}
ProxyPass / https://127.0.0.1:8443/
ProxyPassReverse / https://127.0.0.1:8443/
</VirtualHost>
Comme je ne passe pas beaucoup de temps à configurer Apache, il peut y avoir des lignes inutiles, ou des lignes qui pourraient être ajoutées ou améliorées. Tout retour est le bienvenu.
J’exécute Discourse sur plusieurs serveurs avec Apache2 comme proxy inverse frontal se connectant à une socket Unix, et la configuration fonctionne parfaitement (comme nous le savons tous, elle est un peu plus lente que nginx, que j’utilise également sur certains serveurs, mais elle fonctionne bien).
En gros, je configure le virtual host comme suit :
Configuration du port 80
<VirtualHost *:80>
ServerAdmin webmaster@localhost
ServerName discourse.mygreatwebsite.com
DocumentRoot /website/discourse # souvent inutile
RewriteEngine On
ProxyPreserveHost On
ProxyRequests Off
ErrorLog /var/log/apache2/discourse.error.log
LogLevel warn
CustomLog /var/log/apache2/discourse.access.log combined
RewriteCond %{SERVER_NAME} =discourse.mygreatwebsite.com
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>
Configuration du port 443 :
<VirtualHost *:443>
ServerAdmin webmaster@localhost
ServerName discourse.mygreatwebsite.com
DocumentRoot /website/nginx # généralement inutile dans cette configuration
SSLProxyEngine on
RewriteEngine On
ProxyPreserveHost On
ProxyRequests Off
RequestHeader set X-Forwarded-Proto expr=%{REQUEST_SCHEME}
RequestHeader set X-Real-IP expr=%{REMOTE_ADDR}
ProxyPass / unix:/var/discourse/shared/socket-only/discourse.http.sock|http://mon.ip.adresse.ici/
ProxyPassReverse / unix:/var/discourse/shared/socket-only/discourse.http.sock|http://mon.ip.adresse.ici/
ErrorLog /var/log/apache2/discourse-ssl.error.log
LogLevel warn
CustomLog /var/log/apache2/discourse-ssl.access.log combined
Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateFile /etc/letsencrypt/live/discourse.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/discourse.com/privkey.pem
</VirtualHost>
Remarques :
Habituellement, je laisse letsecrypt certbot faire tout le travail concernant la configuration des certificats SSL, des redirections, etc.
Nous utilisons l’adresse IP à laquelle Apache2 est lié dans les fichiers de configuration d’Apache2.
Nous configurons toujours cela (exposer) avec des sockets Unix dans le conteneur Discourse et n’exposons aucun port TCP/IP du conteneur dans cette configuration.
Salutations et j’espère que cela apporte une certaine valeur, même en fin de parcours.
Si vous souhaitez utiliser un socket Unix au lieu d’un proxy direct, vous pouvez le faire (après avoir activé web.socketed.template.yml dans votre app.yml) de la manière suivante :
ProxyPreserveHost On
ProxyRequests Off
RequestHeader set X-Forwarded-Proto https
RequestHeader set X-Real-IP expr=%{REMOTE_ADDR}
<Location />
ProxyPass unix:/var/discourse/shared/standalone/nginx.http.sock|http://localhost/
ProxyPassReverse unix:/var/discourse/shared/standalone/nginx.http.sock|http://localhost/
</Location>
Notez que vous devrez probablement gérer SELinux si vous essayez de faire lire Apache à partir de /var/discourse de cette manière. Une commande comme semanage fcontext -a -t httpd_sys_rw_content_t /var/discourse/shared/standalone/nginx.http.sock, suivie de restorecon /var/discourse/shared/standalone/nginx.http.sock, devrait suffire.
Apache dispose du plutôt génial mod_md qui peut obtenir automatiquement vos certificats LetsEncrypt. Je le recommande vivement.