Uso la construcción de contenedor dual detrás de Cloudflare CDN. El contenedor dual minimiza el tiempo de inactividad y mis dos foros principales de producción tienen un máximo de 30 segundos fuera de línea durante las reconstrucciones. Me gusta tener una página de mantenimiento porque la página predeterminada del servidor web “fuera de servicio” es fea y no da ninguna pista sobre cuánto tiempo estará fuera de línea.
Por ejemplo, para un sitio en your-domain.com simplemente uso una ruta de Cloudflare Workers configurada en `yourdomain.com/.
Paso 1: Crear la página del worker
Puedes configurar la página de mantenimiento en la página de configuración de workers & pages en Cloudflare: haz clic en el botón create application:
luego usa la plantilla hello world:
luego dale un nombre y haz clic en deploy:
luego ve a la página de resumen para esa página de mantenimiento y haz clic en edit code:
y pega este código en la ventana de código worker.js (sustituye tu dominio y el mensaje que quieras, edita el texto, el color del texto, el fondo, 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"
}
});
}
debería verse algo así. Haz clic en deploy para guardarlo:
Paso 2: Agregar la ruta
Ahora ve a la página de rutas de Cloudflare Workers y haz clic en el botón add route para abrir el modal de nueva ruta, completa la ruta del dominio y selecciona la página del worker que acabas de crear, luego haz clic en guardar:
Paso 3: Ejecutar actualizaciones o reconstrucciones
Ahora, cuando te conectes por SSH a tu servidor y ejecutes las actualizaciones del sistema o hagas una reconstrucción, en lugar de una página web fuera de servicio o de error, se mostrará esta página cuando realmente ocurra el tiempo de inactividad (yo uso 30 segundos en la mía porque ese es el máximo para mis sitios).
Suelo agregar y eliminar mi ruta de workers cada vez que hago mantenimiento, pero a algunos les gusta dejarla ahí todo el tiempo (dejo el código real de la página, solo agrego y elimino la ruta).
Creo que eso es todo.
Opcional: Ejecutar actualizaciones con un script y programarlas
También uso un script de shell Unix en mi servidor para ejecutar la actualización específica del contenedor dual, que creé de esta manera:
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
Luego lo ejecuto en el prompt de root de mi servidor con el comando ./update-web.sh.
Puedes automatizarlo para una hora específica, como las 1:00 a. m. del domingo en tu hora local. Para mí, 1:00 a. m. hora local es 8:00 a. m. UTC (puedes averiguar la fecha UTC de tu servidor) escribiendo date en el prompt de comandos cuando estés conectado por SSH.
Así que:
Ejecuta este comando para abrir el programador de tareas de tu servidor:
crontab -e
(si te pide que elijas un editor, presiona tu editor preferido, 1 para nano es probablemente el más fácil)
Me desplazo hasta el final de los comentarios y pego esto:
0 8 * * 0 /root/update-web.sh >> /var/log/discourse-update.log 2>&1
(lo que significa ejecutar el archivo /root/update-web.sh a los 0 minutos, hora 8 (UTC), cada domingo por la mañana)
Luego guarda y sal (si estás usando nano):
Ctrl + Opara guardar.Enterpara confirmar.Ctrl + Xpara salir.
Luego puedo ejecutar cat /var/log/discourse-update.log cuando me despierto los domingos por la mañana para verificar si se ejecutó correctamente. Si usas un programador de tareas cron, querrás dejar la ruta de la página de workers.
Creo que eso es todo. Avísame si tienes preguntas, jaja. Es mucho más simple de lo que parece, jaja. ![]()








