Utilizzo la costruzione a doppio contenitore dietro un CDN Cloudflare. Il doppio contenitore minimizza i tempi di inattività e i miei due forum di produzione principali hanno al massimo 30 secondi di offline durante le ricostruzioni. Apprezzo avere una pagina di manutenzione perché la pagina predefinita di “server down” è brutta e non dà alcun indizio su quanto tempo rimarrà offline.
Ad esempio, per un sito su your-domain.com utilizzo semplicemente una route Cloudflare Workers impostata su *yourdomain.com/* (includi gli asterischi).
Passo 1: Creare la pagina Worker
Puoi configurare la pagina di manutenzione nella pagina delle impostazioni Workers & Pages su Cloudflare - clicca il pulsante Crea applicazione:
poi usa il template hello world:
poi dagli un nome e clicca Deploy:
poi vai alla pagina di panoramica per quella pagina di manutenzione e clicca Modifica codice:
e incolla questo codice nella finestra del codice worker.js (sostituisci il tuo dominio e qualsiasi messaggio desideri, modifica il testo, il colore del testo, lo sfondo, ecc.):
export default {
async fetch(request, env, ctx) {
try {
// Recupera la richiesta originale dal tuo server
const response = await fetch(request);
// Se IL TUO SITO sta cambiando contenitori, genera un errore 502, 521 o 530
if (response.status === 502 || response.status === 521 || response.status === 530) {
return returnCustomErrorPage();
}
// Se tutto va bene, restituisci il traffico normale del forum
return response;
} catch (e) {
// Se il server è completamente irraggiungibile
return returnCustomErrorPage();
}
}
};
function returnCustomErrorPage() {
const html = `
<!DOCTYPE html>
<html lang="it">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Aggiornamento Sistema - YOUR-SITE.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>Breve finestra di aggiornamento</h1>
<p><strong>YOUR-SITE</strong> sta subendo un breve aggiornamento di sistema di 30 secondi.</p>
<p>Fai un veloce sorso della tua bevanda—questa pagina si aggiornerà automaticamente non appena saremo di nuovo online.</p>
</div>
<script>
// Controlla automaticamente se il sito è tornato online ogni 10 secondi
setInterval(function() {
window.location.reload();
}, 10000);
</script>
</body>
</html>
`;
return new Response(html, {
status: 503, // 503 è il migliore per SEO così Google non ti penalizza per il downtime
headers: {
"Content-Type": "text/html;charset=UTF-8",
"Retry-After": "30"
}
});
}
dovrebbe apparire più o meno così. Clicca deploy per salvarlo:
Passo 2: Aggiungere la route
ora vai alla pagina delle route Cloudflare Workers e clicca il pulsante Aggiungi route per far apparire la nuova finestra modale della route, compila la route del dominio e seleziona la pagina Worker che hai appena creato, poi clicca salva:
Passo 3: Eseguire aggiornamenti o ricostruzioni
ora, quando ti connetti via SSH al tuo server ed esegui gli aggiornamenti di sistema o fai una ricostruzione, invece di una pagina di sito down o errore, questa pagina apparirà quando il downtime avviene effettivamente (io uso 30 secondi nel mio perché è il massimo per i miei siti)
Tendo ad aggiungere ed eliminare la mia route della pagina Worker ogni volta che faccio manutenzione, ma alcuni preferiscono lasciarla lì tutto il tempo (io lascio il codice effettivo per la pagina, aggiungo e rimuovo solo la route).
Credo che sia tutto.
Opzionale: Eseguire aggiornamenti con uno script e programmarli
Utilizzo anche uno script shell unix sul mio server per eseguire l’aggiornamento specifico per il doppio contenitore, che ho creato in questo modo:
cat << 'EOF' > /root/update-web.sh
#!/bin/bash
cd /var/discourse
echo "➡️ Recupero gli ultimi script docker di Discourse..."
git pull
echo "➡️ Bootstrap del nuovo contenitore web in background (richiede ~8 min)..."
./launcher bootstrap web_only
if [ $? -eq 0 ]; then
echo "✅ Bootstrap riuscito! Cambio dei contenitori..."
./launcher destroy web_only && ./launcher start web_only
echo "🚀 Fatto! Sito aggiornato con quasi zero downtime."
else
echo "❌ Bootstrap fallito! Annullamento del cambio per mantenere il sito attuale online."
fi
EOF
chmod +x /root/update-web.sh
poi lo eseguo al prompt root sul mio server con il comando ./update-web.sh.
modifica: non seguire i passaggi seguenti a meno che tu non abbia un account Cloudflare a pagamento.
Puoi automatizzarlo per un orario specifico, come le 1:00 di domenica mattina nel tuo fuso orario locale con un cron job. Per me 1:00am locale è 8:00 AM UTC, (puoi calcolare la data UTC del tuo server digitando date al prompt dei comandi quando sei connesso via SSH).
Quindi:
esegui questo comando per aprire il pianificatore di attività del tuo server:
crontab -e
(se ti chiede di scegliere un editor, seleziona il tuo editor preferito, 1 per nano è probabilmente il più semplice)
Scorro fino alla fine dei commenti e incollo questo:
0 8 * * 0 /root/update-web.sh >> /var/log/discourse-update.log 2>&1
(cioè esegui il file /root/update-web.sh al minuto 0, ora 8 (UTC), ogni domenica mattina)
poi salva ed esci (se stai usando nano):
Ctrl + Oper salvare.Enterper confermare.Ctrl + Xper uscire.
poi posso eseguire cat /var/log/discourse-update.log quando mi sveglio la domenica mattina per controllare se è stato eseguito correttamente. Se utilizzi un pianificatore di attività cron, vorrai lasciare la route della pagina Worker.
Credo che sia tutto. Fammi sapere se hai domande lol. È molto più semplice di quanto sembri lol. ![]()








