Servir um export estático do discourse enquanto o discourse está sendo atualizado

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.

1 curtida

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”).

1 curtida

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.


Fico me perguntando se How do I export the complete forum as static html pages? - #3 by wangerin seria suficiente, embora pareça que ainda seria necessário desativar elementos interativos e injetar um banner.

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.

3 curtidas

Sim, acho que sim. Você pode me indicar a(s) opção(ões) recomendada(s) de dois contêineres?

(Move from standalone container to separate web and data containers), mas talvez você precise arrastar para pesquisar por outros

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.

2 curtidas