¡OK, solo me tomó 2 horas de retoques para hacerlo como quería!
Página de Mantenimiento de Discourse con Apache2
Como root
cd /var/discourse
nano containers/app.yml
Comenta estas líneas:
#- "templates/web.ssl.template.yml"
#- "templates/web.letsencrypt.ssl.template.yml"
expose:
#- "80:80" # http
#- "443:443" # https
Añade al FINAL de la sección de plantillas (debe ser la última):
- "templates/web.socketed.template.yml"
Nota: Esto hará que Discourse escuche solo en la IP interna y apache2 se encargará de los puertos 80/443 y la terminación SSL.
Nota: Discourse debe ser reconstruido para que esto tenga efecto:
cd /var/discourse
./launcher rebuild app
Instalar apache2 y certbot
apt install -y apache2 certbot python3-certbot-apache
Crear un directorio para la página html:
mkdir /var/www/discourse_maintenance
Página 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 class="title">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>
Habilitar Módulo Proxy:
a2enmod proxy
a2enmod proxy_http
a2enmod headers
Archivo vhost de 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>
Para habilitar el mantenimiento ejecuta touch /var/www/under_maintenance
Para deshabilitar el mantenimiento ejecuta touch /var/www/under_maintenance
Créditos: Add an offline page to display when Discourse is rebuilding or starting up por la idea inicial, la página html (recortada/editada a mi gusto) y la configuración de nginx en la que basé la configuración de Apache.
Edición: Se aceptan sugerencias para hacerlo automático cuando la respuesta es 502/503. Lo intenté pero no pude conseguir que funcionara como quería, así que opté por un método conocido que uso en otros servidores web cuando la aplicación backend está caída por mantenimiento, etc.