OK, cela m’a pris seulement 2 heures de bidouillage pour obtenir ce que je voulais !
Page de maintenance Discourse avec Apache2
En tant que root
cd /var/discourse
nano containers/app.yml
Commentez ces lignes :
#- "templates/web.ssl.template.yml"
#- "templates/web.letsencrypt.ssl.template.yml"
expose:
#- "80:80" # http
#- "443:443" # https
Ajoutez à la FIN de la section templates (doit être la dernière) :
- "templates/web.socketed.template.yml"
Note : Cela fera que Discourse n’écoutera que sur l’IP interne et Apache2 prendra en charge les ports 80/443 et la terminaison SSL.
Note : Discourse doit être reconstruit pour que cela prenne effet :
cd /var/discourse
./launcher rebuild app
Installer apache2 et certbot
apt install -y apache2 certbot python3-certbot-apache
Créer un répertoire pour la page html :
mkdir /var/www/discourse_maintenance
Page HTML :
/var/www/discourse_maintenance/discourse_maintenance.html
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="refresh" content="5">
<title>Discourse Maintenance</title>
<style>
.center {
display: flex;
justify-content: center;
}
.container {
max-width: 500px;
padding: 50px 50px 30px 50px;
}
.title {
padding-top: 20px;
}
h1, p {
font-family: "Helvetica Neue",Helvetica,Arial,sans-serif;
}
</style>
</head>
<body>
<div class="center">
<div class="container">
<h1>Discourse Maintenance…</h1>
<p>We are currently upgrading the site, or performing scheduled maintenance.</p>
<p>You'll automatically be redirected to the site once it's available.</p>
</div>
</div>
</body>
</html>
Activer le module Proxy :
a2enmod proxy
a2enmod proxy_http
a2enmod headers
Fichier vhost Apache :
<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerName your.discourse.domain
ServerAdmin your@email.com
DocumentRoot /var/www/discourse_maintenance
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
# Maintenance Mode
RewriteEngine On
RewriteCond /var/www/under_maintenance -f
# safety check to prevent redirect loops
RewriteCond %{REQUEST_URI} !/discourse_maintenance.html$
# redirect internally all requests to maintenance.html
RewriteRule ^.*$ /var/www/discourse_maintenance/discourse_maintenance.html
ProxyPass / unix:///var/discourse/shared/standalone/nginx.http.sock|http://127.0.0.1/
ProxyPassReverse / unix:///var/discourse/shared/standalone/nginx.http.sock|http://127.0.0.1/
SSLCertificateFile /etc/letsencrypt/live/your.discourse.domain/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/your.discourse.domain/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>
</IfModule>
Pour activer la maintenance, exécutez touch /var/www/under_maintenance
Pour désactiver la maintenance, exécutez touch /var/www/under_maintenance
Crédits : Add an offline page to display when Discourse is rebuilding or starting up pour l’idée initiale, la page html (tronquée/éditée à ma convenance) et la configuration nginx sur laquelle j’ai basé la configuration Apache.
Edit : Suggestions bienvenues pour rendre cela automatique lorsqu’une réponse 502/503 est reçue. J’ai essayé mais je n’ai pas réussi à obtenir le résultat souhaité, j’ai donc opté pour une méthode connue que j’utilise sur d’autres serveurs web lorsque l’application backend est en maintenance, etc.