Ich nutze den dual container build hinter dem Cloudflare CDN. Der Dual-Container-Ansatz minimiert die Ausfallzeit, und meine beiden Haupt-Produktionsforen haben während Neuaufbauten maximal 30 Sekunden Ausfall. Ich mag eine Wartungsseite, weil die Standard-Webserver-Ausfallseite hässlich ist und keine Ahnung darüber gibt, wie lange sie offline sein wird.
Zum Beispiel verwende ich für eine Seite unter your-domain.com einfach einen Cloudflare Workers-Routen-Eintrag auf `yourdomain.com/.
Schritt 1: Die Worker-Seite erstellen
Du kannst die Wartungsseite auf der Workers & Pages-Einstellungsseite bei Cloudflare einrichten – klicke auf die Schaltfläche Anwendung erstellen:
und verwende dann die Hello-World-Vorlage:
Gib ihr dann einen Namen und klicke auf Bereitstellen:
Gehe dann zur Übersichtsseite dieser Wartungsseite und klicke auf Code bearbeiten:
und füge diesen Code in das worker.js-Codefenster ein (ersetze deine Domain und die Nachricht, die du möchtest, bearbeite Text, Textfarbe, Hintergrund usw.):
export default {
async fetch(request, env, ctx) {
try {
// Hole die ursprüngliche Anfrage von deinem Server
const response = await fetch(request);
// Wenn DEINE SEITE Container wechselt, wirft sie einen 502, 521 oder 530
if (response.status === 502 || response.status === 521 || response.status === 530) {
return returnCustomErrorPage();
}
// Wenn alles in Ordnung ist, gib den normalen Forenverkehr zurück
return response;
} catch (e) {
// Wenn der Server völlig unerreichbar ist
return returnCustomErrorPage();
}
}
};
function returnCustomErrorPage() {
const html = `
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>System-Update - DEINE-SEITE.com</title>
<style>
body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; text-align: center; padding: 50px; color: #333; background-color: #f9f9f9; }
h1 { font-size: 2.5em; margin-bottom: 0.5em; color: #9400D3; }
p { font-size: 1.2em; line-height: 1.5; }
.container { max-width: 600px; margin: 0 auto; background: white; padding: 40px; border-radius: 8px; box-shadow: 0 4px 6px rgba(0,0,0,0.1); }
</style>
</head>
<body>
<div class="container">
<h1>Nur ein kurzes Update-Fenster</h1>
<p><strong>DEINE-SEITE</strong> durchläuft ein kurzes 30-sekündiges System-Update.</p>
<p>Nimm einen Schluck von deinem Getränk – diese Seite wird sich automatisch aktualisieren, sobald wir wieder online sind.</p>
</div>
<script>
// Prüft automatisch alle 10 Sekunden, ob die Seite wieder hochgefahren ist
setInterval(function() {
window.location.reload();
}, 10000);
</script>
</body>
</html>
`;
return new Response(html, {
status: 503, // 503 ist am besten für SEO, damit Google dich nicht für Ausfallzeiten bestraft
headers: {
"Content-Type": "text/html;charset=UTF-8",
"Retry-After": "30"
}
});
}
Es sollte in etwa so aussehen. Klicke auf Bereitstellen, um es zu speichern:
Schritt 2: Die Route hinzufügen
Gehe nun zur Cloudflare Worker-Routen-Seite und klicke auf die Schaltfläche Route hinzufügen, um das neue Routen-Modal aufzurufen. Fülle die Domain-Route aus und wähle die Worker-Seite aus, die du gerade erstellt hast, und klicke dann auf Speichern:
Schritt 3: Updates oder Neuaufbauten ausführen
Wenn du dich nun per SSH auf deinem Server einloggst und Systemupdates ausführst oder einen Neuaufbau durchführst, wird anstelle einer Website-down- oder Fehlerseite diese Seite angezeigt, wenn die Ausfallzeit tatsächlich eintritt (ich verwende 30 Sekunden, da dies das Maximum für meine Seiten ist).
Ich füge meine Worker-Routen-Seite hinzu und lösche sie, wann immer ich Wartungsarbeiten durchführe, aber einige lassen sie einfach die ganze Zeit dort (ich lasse den eigentlichen Code für die Seite, füge nur die Route hinzu und entferne sie).
Ich denke, das ist alles.
Optional: Updates mit einem Skript ausführen und planen
Ich verwende auch ein Unix-Shell-Skript auf meinem Server, um das Dual-Container-spezifische Update auszuführen, das ich wie folgt erstellt habe:
cat << 'EOF' > /root/update-web.sh
#!/bin/bash
cd /var/discourse
echo "➡️ Ziehe neueste Discourse-Docker-Skripte..."
git pull
echo "➡️ Bootstrap neuer Web-Container im Hintergrund (dauert ~8 Min)..."
./launcher bootstrap web_only
if [ $? -eq 0 ]; then
echo "✅ Bootstrap erfolgreich! Container werden gewechselt..."
./launcher destroy web_only && ./launcher start web_only
echo "🚀 Fertig! Seite aktualisiert mit fast null Ausfallzeit."
else
echo "❌ Bootstrap fehlgeschlagen! Wechsel wird abgebrochen, um die aktuelle Seite online zu halten."
fi
EOF
chmod +x /root/update-web.sh
Dann führe ich es am Root-Prompt auf meinem Server mit dem Befehl ./update-web.sh aus.
Du kannst es für eine bestimmte Zeit automatisieren, z. B. 1 Uhr morgens Sonntag in deiner lokalen Zeit mit einem Cron-Job. Für mich ist 1:00 Uhr lokal 8:00 Uhr UTC, (du kannst das UTC-Datum deines Servers herausfinden), indem du date am Befehlszeilenprompt eingibst, wenn du per SSH verbunden bist.
Also:
Führe diesen Befehl aus, um den Aufgabenplaner deines Servers zu öffnen:
crontab -e
(Wenn du aufgefordert wirst, einen Editor zu wählen, drücke deinen bevorzugten Editor, 1 für nano ist wahrscheinlich am einfachsten)
Ich scrolle zum Ende der Kommentare und füge dies ein:
0 8 * * 0 /root/update-web.sh >> /var/log/discourse-update.log 2>&1
(was bedeutet, führe die Datei /root/update-web.sh um Minute 0, Stunde 8 (UTC), jeden Sonntagmorgen aus)
Dann speichern und beenden (wenn du nano verwendest):
Strg + Ozum Speichern.Eingabezur Bestätigung.Strg + Xzum Beenden.
Dann kann ich cat /var/log/discourse-update.log ausführen, wenn ich sonntags morgens aufwache, um zu überprüfen, ob es ordnungsgemäß ausgeführt wurde. Wenn du einen Cron-Aufgabenplaner verwendest, solltest du die Worker-Seiten-Route lassen.
Ich denke, das ist alles. Lass mich wissen, wenn du Fragen hast lol. Es ist viel einfacher, als es sich anhört lol. ![]()








