Note : pas sûr de l’endroit où mettre ceci, n’hésitez pas à le déplacer à un endroit plus approprié si j’ai manqué quelque chose.
Je voulais juste partager une méthode rapide et astucieuse que j’ai conçue la semaine dernière pour mettre en place une page temporaire lors d’une mise à niveau de Discourse. J’ai lu tous les guides existants, mais je n’y connais rien en nginx et une configuration à double conteneur semblait très intimidante.
En bref ; J’ai fait quelque chose, le code est ci-dessous. ![]()
Node.js à la rescousse
Alors je me suis dit : quelle est la manière la plus rapide de simplement lancer un tout petit serveur web avec une seule page ? Puis je me suis rappelé que node.js était installé de toute façon, pourrais-je peut-être m’en sortir juste en l’utilisant ?
Après une recherche rapide et un copier-coller de Stackoverflow, j’avais un petit quelque chose qui écoutait sur le port 80 !
Le processus est très manuel, mais je pense que c’est acceptable, je dois surveiller les journaux pendant la mise à niveau de toute façon, alors j’attends de voir le signal :
Stopping old container
+ /usr/bin/docker stop -t 600 app
À ce moment-là, j’aurais une autre session SSH ouverte où je lance rapidement :
touch index.html
node server.js 80
Je fais un touch sur le fichier index.html pour pouvoir lire la date de mise à jour, et remplacer un espace réservé. Dans mon index.html, j’ai cette ligne :
<p>Cette page a été mise à jour pour la dernière fois à : LASTUPDATE</p>
Dans le fichier server.js, je remplace ce LASTUPDATE par la date/heure de la dernière mise à jour du fichier index.html. Cela donne simplement aux gens une idée du moment où la mise à niveau a commencé et je note sur la page qu’elle prendra 10 à 15 minutes.
Cela m’a permis de faire fonctionner facilement quelque chose sur mon serveur de développement en guise de test et je me suis senti prêt à le faire en production.
Oups, nous avons besoin de https 
Il est temps de mettre à niveau le serveur de production et de montrer aux gens ma nouvelle page temporaire rapide !
Cela ne s’est pas passé comme prévu. Le site de production est derrière Cloudflare et nécessite que des certificats de bout en bout soient disponibles, j’ai donc arrêté le forum pendant 15 minutes et seul une page d’erreur Cloudflare était visible ![]()
Heureusement, un peu plus de copier-coller de Stack Overflow a aidé. J’ai fait passer le serveur de http à https et j’ai obtenu des fichiers cert.key et cert.pem pour m’assurer que la chaîne de certificats était intacte.
La mise à niveau suivante a été un plus grand succès et les pages temporaires sont apparues comme prévu :
Montre-moi juste le code !
Voici les deux fichiers que j’utilise pour cette page temporaire :
index.html
<!DOCTYPE html>
<html lang="en-US">
<head>
<meta charset="utf-8">
<title>We'll be right back</title>
</head>
<body>
<h1>We'll be right back</h1>
<p>Sorry for the temporary outage, we're currently applying an update, this usually take 10-15 minutes.</p>
<p>This page was last updated at: LASTUPDATE</p>
</body>
</html>
server.js
var http = require("http"),
https = require("https"),
url = require("url"),
path = require("path"),
fs = require("fs"),
port = process.argv[2] || 81;
const options = {
key: fs.readFileSync("cert.key").toString(),
cert: fs.readFileSync("cert.pem").toString(),
};
https
.createServer(options, function (request, response) {
var uri = url.parse(request.url).pathname,
filename = path.join(process.cwd(), uri);
fs.exists(filename, function (exists) {
if (!exists) {
response.writeHead(404, { "Content-Type": "text/plain" });
response.write("404 Not Found\n");
response.end();
return;
}
let indexFile = (filename += "index.html");
if (fs.statSync(filename).isDirectory()) indexFile;
fs.readFile(filename, "utf8", function (err, file) {
if (err) {
response.writeHead(500, { "Content-Type": "text/plain" });
response.write(err + "\n");
response.end();
return;
}
var stats = fs.statSync(indexFile);
var mtime = stats.mtime;
response.writeHead(200);
file = file.replace(/LASTUPDATE/g, mtime);
response.write(file, "utf8");
response.end();
});
});
})
.listen(parseInt(port, 10));
console.log(
"Static file server running at\n => https://localhost:" +
port +
"/\nCTRL + C to shutdown"
);
Comme indiqué ci-dessus, vous pouvez l’exécuter comme suit :
touch index.html
node server.js 443
L’argument 443 est le port sur lequel vous souhaitez l’exécuter, par défaut il s’exécute sur le port 81 afin que je puisse faire un curl pour tester le résultat avant de le faire réellement pendant la mise à niveau :
curl -k https://localhost:81
À un moment donné pendant la mise à niveau de Discourse, lorsqu’elle sera terminée, vous verrez :
Error starting userland proxy: listen tcp4 0.0.0.0:443: bind: address already in use.
C’est à ce moment-là que je termine le serveur Node et que je redémarre Discourse :
./launcher restart app
Et c’est tout. J’espère que cela aidera quelqu’un !
