J’utilise la construction à conteneurs doubles derrière le CDN Cloudflare. Le conteneur double minimise les temps d’arrêt et mes deux forums de production principaux ont un maximum de 30 secondes hors ligne pendant les reconstructions. J’aime avoir une page de maintenance car la page par défaut du serveur web est moche et ne donne aucun indice sur la durée de l’arrêt.
Par exemple, pour un site à your-domain.com, j’utilise simplement une route de travailleur Cloudflare définie sur *yourdomain.com/* (incluez les astérisques).
Étape 1 : Créer la page de travailleur
Vous pouvez configurer la page de maintenance sur la page des paramètres workers & pages de Cloudflare - cliquez sur le bouton create application :
puis utilisez le modèle hello world :
puis donnez-lui un nom et cliquez sur deploy :
puis allez sur la page d’aperçu de cette page de maintenance et cliquez sur edit code :
et collez ce code dans la fenêtre de code worker.js (substituez votre domaine et quel que soit le message que vous voulez, modifiez le texte, la couleur du texte, l’arrière-plan, etc.) :
export default {
async fetch(request, env, ctx) {
try {
// Fetch the original request from your server
const response = await fetch(request);
// If YOUR SITE is swapping containers, it throws a 502, 521, or 530
if (response.status === 502 || response.status === 521 || response.status === 530) {
return returnCustomErrorPage();
}
// If everything is fine, return the normal forum traffic
return response;
} catch (e) {
// If the server is completely unreachable
return returnCustomErrorPage();
}
}
};
function returnCustomErrorPage() {
const html = `
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>System Refresh - 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>Just a quick update window</h1>
<p><strong>YOUR-SITE</strong> is undergoing a brief 30-second system refresh.</p>
<p>Grab a quick sip of your drink—this page will automatically refresh as soon as we are back online.</p>
</div>
<script>
// Automatically check if the site is back up every 10 seconds
setInterval(function() {
window.location.reload();
}, 10000);
</script>
</body>
</html>
`;
return new Response(html, {
status: 503, // 503 is best for SEO so Google doesn't penalize you for downtime
headers: {
"Content-Type": "text/html;charset=UTF-8",
"Retry-After": "30"
}
});
}
ça devrait ressembler à quelque chose comme ça. Cliquez sur deploy pour le sauvegarder :
Étape 2 : Ajouter la route
allez maintenant sur la page de route de travailleur Cloudflare et cliquez sur le bouton add route pour faire apparaître la nouvelle fenêtre modale de route, remplissez la route de domaine et sélectionnez la page de travailleur que vous venez de créer, puis cliquez sur save :
Étape 3 : Exécuter des mises à jour ou des reconstructions
maintenant, lorsque vous vous connectez en ssh à votre serveur et exécutez vos mises à jour système ou effectuez une reconstruction, au lieu d’un site web hors ligne ou d’une page d’erreur, cette page s’affichera lorsque le temps d’arrêt se produira réellement (j’utilise 30 secondes dans le mien car c’est le maximum pour mes sites)
j’ai tendance à ajouter et supprimer ma page de route de travailleur chaque fois que je fais de la maintenance, mais certains aiment simplement la laisser en place tout le temps (je laisse le code réel de la page, j’ajoute et supprime juste la route).
je pense que c’est tout.
Optionnel : Exécuter des mises à jour avec un script et planifier
j’utilise également un script shell unix sur mon serveur pour exécuter la mise à jour spécifique au conteneur double, que j’ai créée comme ceci :
cat << 'EOF' > /root/update-web.sh
#!/bin/bash
cd /var/discourse
echo "➡️ Pulling latest Discourse docker scripts..."
git pull
echo "➡️ Bootstrapping new web container in the background (takes ~8 mins)..."
./launcher bootstrap web_only
if [ $? -eq 0 ]; then
echo "✅ Bootstrap successful! Swapping containers..."
./launcher destroy web_only && ./launcher start web_only
echo "🚀 Done! Site updated with almost zero downtime."
else
echo "❌ Bootstrap failed! Aborting swap to keep current site online."
fi
EOF
chmod +x /root/update-web.sh
puis je l’exécute à l’invite root sur mon serveur avec la commande ./update-web.sh.
edit: ne faites pas les étapes ci-dessous à moins que vous n’ayez un compte cloudflare payant.
vous pouvez l’automatiser à une heure spécifique, comme 1h du matin dimanche matin votre heure locale avec une tâche cron. Pour moi 1:00am local est 8:00 AM UTC, (vous pouvez déterminer la date UTC de votre serveur en tapant date à l’invite de commande lorsque vous êtes connecté en ssh).
donc :
exécutez cette commande pour ouvrir le planificateur de tâches de votre serveur :
crontab -e
(s’il vous demande de choisir un éditeur, sélectionnez votre éditeur préféré, 1 pour nano est probablement le plus simple)
je fais défiler jusqu’au bas des commentaires et colle ceci :
0 8 * * 0 /root/update-web.sh >> /var/log/discourse-update.log 2>&1
(ce qui signifie exécuter le fichier /root/update-web.sh à la minute 0, heure 8 (UTC), chaque dimanche matin)
puis sauvegardez et quittez (si vous utilisez nano) :
Ctrl + Opour sauvegarder.Enterpour confirmer.Ctrl + Xpour quitter.
puis je peux exécuter cat /var/log/discourse-update.log lorsque je me réveille les dimanches matins pour vérifier s’il s’est exécuté correctement. Si vous utilisez un planificateur de tâches cron, vous voudrez laisser la route de la page de travailleur.
je pense que c’est tout. Faites-moi savoir si vous avez des questions lol. C’est beaucoup plus simple que ce à quoi je l’ai fait ressembler lol. ![]()








