OK, hat nur 2 Stunden gedauert, bis es so war, wie ich es wollte!
Discourse Wartungsseite mit Apache2
Als root
cd /var/discourse
nano containers/app.yml
Kommentieren Sie diese Zeilen aus:
#- "templates/web.ssl.template.yml"
#- "templates/web.letsencrypt.ssl.template.yml"
expose:
#- "80:80" # http
#- "443:443" # https
Fügen Sie am ENDE des Templates-Abschnitts hinzu (muss das Letzte sein):
- "templates/web.socketed.template.yml"
Hinweis: Dadurch wird Discourse nur noch auf der internen IP lauschen und Apache2 übernimmt die Ports 80/443 und die SSL-Terminierung.
Hinweis: Discourse muss neu erstellt werden, damit dies wirksam wird:
cd /var/discourse
./launcher rebuild app
Apache2 und Certbot installieren
apt install -y apache2 certbot python3-certbot-apache
Verzeichnis für die HTML-Seite erstellen:
mkdir /var/www/discourse_maintenance
HTML-Seite:
/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>
Proxy-Modul aktivieren:
a2enmod proxy
a2enmod proxy_http
a2enmod headers
Apache vhost-Datei:
<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>
Um die Wartung zu aktivieren, führen Sie touch /var/www/under_maintenance aus.
Um die Wartung zu deaktivieren, führen Sie touch /var/www/under_maintenance aus.
Credits: Add an offline page to display when Discourse is rebuilding or starting up für die ursprüngliche Idee, die HTML-Seite (gekürzt/bearbeitet nach meinem Geschmack) und die Nginx-Konfiguration, auf der ich die Apache-Konfiguration basierte.
Bearbeitung: Vorschläge zur Automatisierung bei 502/503-Antworten sind willkommen. Ich habe es versucht, konnte es aber nicht so hinbekommen, wie ich wollte, also habe ich mich für eine bekannte Methode entschieden, die ich auf anderen Webservern verwende, wenn die Backend-Anwendung wegen Wartungsarbeiten usw. nicht verfügbar ist.