Nota: não tenho certeza de onde colocar isso, sinta-se à vontade para mover para um local mais apropriado se eu tiver perdido algo.
Queria compartilhar uma maneira rápida e improvisada que desenvolvi na semana passada para colocar uma página temporária ao fazer uma atualização do Discourse. Li todos os guias existentes, mas não entendo nada de nginx e uma configuração de contêiner duplo parecia muito intimidante.
Resumindo; Eu fiz algo, o código está abaixo. ![]()
Node.js para o resgate
Então pensei: qual é a maneira mais rápida de iniciar um servidor web super pequeno com uma única página? Então me lembrei que o node.js já estava instalado de qualquer maneira, será que eu poderia simplesmente usá-lo?
Uma rápida pesquisa e cópia/cola do Stackoverflow depois, eu tinha uma pequena coisa escutando na porta 80!
O processo é super manual, mas acho que está tudo bem, preciso monitorar os logs quando a atualização estiver em andamento de qualquer maneira, então espero para ver o sinal:
Stopping old container
+ /usr/bin/docker stop -t 600 app
Nesse ponto, eu teria outra sessão SSH aberta onde eu rapidamente executaria:
touch index.html
node server.js 80
Eu touch o arquivo index.html para que eu possa ler a data de atualização dele e substituir um placeholder. No meu index.html eu tenho esta linha:
<p>Esta página foi atualizada pela última vez em: LASTUPDATE</p>
No arquivo server.js eu substituo esse LASTUPDATE pela data/hora em que o arquivo index.html foi atualizado pela última vez. Isso apenas dá às pessoas uma ideia de quando a atualização começou e eu anoto na página que levará de 10 a 15 minutos para ser concluída.
Isso me permitiu executar facilmente algo em meu servidor de desenvolvimento como um teste e me senti pronto para fazer isso em produção.
Oops, precisamos de https 
Hora de atualizar o servidor de produção e mostrar às pessoas minha nova página temporária rápida!
Isso não saiu como esperado. O site de produção está atrás do Cloudflare e requer certificados de ponta a ponta completos para estarem disponíveis, então tirei o fórum do ar por 15 minutos e só tive uma página de erro do Cloudflare para mostrar ![]()
Felizmente, mais cópias e colas do Stack Overflow ajudaram. Mudei o servidor de http para https e obtive os arquivos cert.key e cert.pem para garantir que a cadeia de certificados estivesse intacta.
A próxima atualização foi um sucesso maior e as páginas temporárias apareceram como projetado:
Mostre-me apenas o código!
Aqui estão os dois arquivos que estou usando para esta página temporária:
index.html
<!DOCTYPE html>
<html lang="en-US">
<head>
<meta charset="utf-8">
<title>Voltamos logo</title>
</head>
<body>
<h1>Voltamos logo</h1>
<p>Desculpe pela interrupção temporária, estamos aplicando uma atualização, isso geralmente leva de 10 a 15 minutos.</p>
<p>Esta página foi atualizada pela última vez em: 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"
);
Como observado acima, você pode executá-lo da seguinte forma:
touch index.html
node server.js 443
O argumento 443 é a porta em que você deseja executá-lo, por padrão ele é executado na porta 81 para que eu possa fazer um curl para testar qual será a saída, antes de realmente fazer isso durante a atualização:
curl -k https://localhost:81
Em algum momento durante a atualização do Discourse, quando ela for concluída, você verá:
Error starting userland proxy: listen tcp4 0.0.0.0:443: bind: address already in use.
É quando eu encerro o servidor Node e inicio o Discourse novamente:
./launcher restart app
E é isso. Espero que isso ajude alguém!
