# Compartilhando: uma maneira rudimentar de configurar uma página de espera durante a atualização

**URL:** <https://meta.discourse.org/t/sharing-a-rudimentary-way-to-set-up-a-holding-page-while-upgrading/359276>\
**Category:** General\
**Created:** [28 Março , 2025 12:33 UTC](https://meta.discourse.org/t/sharing-a-rudimentary-way-to-set-up-a-holding-page-while-upgrading/359276 "2025-03-28T12:33:49Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![cultiv](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/cultiv/32/483312_2.png) [@cultiv](https://meta.discourse.org/u/cultiv)\
**Post date:** [28 Março , 2025 12:33 UTC](https://meta.discourse.org/t/sharing-a-rudimentary-way-to-set-up-a-holding-page-while-upgrading/359276/1 "2025-03-28T12:33:49Z")

</div>

_ **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:

```plaintext
Stopping old container
+ /usr/bin/docker stop -t 600 app

```

Nesse ponto, eu teria outra sessão SSH aberta onde eu rapidamente executaria:

```plaintext
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:

```html
<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:

 ![A imagem é uma mensagem "Voltamos logo" indicando uma interrupção temporária do serviço para uma atualização que geralmente leva de 10 a 15 minutos, com a hora da última atualização fornecida. (Legenda por IA)](https://global.discourse-cdn.com/meta/original/4X/f/a/5/fa5f0573f3f75cd22d1491563931d54a23f9b6dd.png)

### Mostre-me apenas o código!

Aqui estão os dois arquivos que estou usando para esta página temporária:

`index.html`

```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`

```javascript
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:

```plaintext
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:

```plaintext
curl -k https://localhost:81

```

Em algum momento durante a atualização do Discourse, quando ela for concluída, você verá:

```plaintext
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:

```plaintext
./launcher restart app

```

E é isso. Espero que isso ajude alguém!
