Atualmente, opero dois fóruns Discourse separados, ambos hospedados em suas próprias instâncias Scaleway e atualizados da seguinte forma:
# Atualizar a configuração Docker do Discourse
cd /var/discourse
git pull origin master
# Reconstruir o Discourse
/var/discourse/launcher rebuild app
Isso deixa o fórum fora do ar por cerca de 5 a 15 minutos a cada atualização.
Um dos sites está atrás do proxy do Cloudflare, então ele serve o cache offline sem problemas. Mas o outro não usa o Cloudflare.
Estou me perguntando se o Discourse poderia exportar um site estático contendo apenas, digamos, os tópicos públicos para um usuário anônimo, com os botões de interação desativados e um banner no topo dizendo “Este site está atualmente no modo somente leitura enquanto passa por atualizações.”, servindo esse conteúdo enquanto o fórum estiver sendo atualizado e, assim que o fórum voltar ao ar, excluir o cache estático.
Se o DNS for gerenciado pela Cloudflare (mesmo que não use o proxy), ele geralmente é atualizado em segundos. Durante a atualização, você pode apontar o domínio para outro servidor (como uma página de manutenção no Netlify/Vercel/Firebase/Surge/etc., onde todos os caminhos apontam para um arquivo index.html).
Ainda não testei, mas pode ser possível servir temporariamente outro backend usando resolveOverride em um Cloudflare Worker (função “serverless”).
Sim, seja uma alteração de DNS ou a inicialização de um container Docker temporário do nginx ouvindo na mesma porta para servir algo, essa é a parte fácil.
No momento, a parte mais difícil disso é uma exportação estática com interatividade desativada e um banner adicionado, respeitando páginas de tópicos, posts, categorias e índice (a busca pode ficar inativa). Depois, integrar essa substituição ao processo de atualização, o que, no entanto, é simples o suficiente.
Buscar nos fóruns por exportação estática não parece que isso seja algo comum. Já criei um cliente da API do Discourse para um projeto anterior, então poderia desenvolver algo que não emule o design, supostamente.
Outro fator ao servir uma exportação estática para esse fim seria garantir que as páginas estáticas não sejam armazenadas em cache pelos navegadores nem pelos mecanismos de busca.
Se você estiver executando uma instalação de dois contêineres, o tempo de inatividade é inferior a um minuto. Ou, se estiver disposto a executar um balanceador de carga, pode torná-lo zero. Isso é mais fácil do que o que você está descrevendo.
Descubra também sobre SKIP_POST_DEPLOYMENT_MIGRATIONS=1. Em resumo, defina essa variável ao reconstruir o contêiner do bed para evitar que ele quebre o banco de dados do existente; depois, migre novamente sem ela, assim que o novo contêiner estiver em execução.