Instância escrava do Discourse com acesso offline

Contexto
Temos uma instância do Discourse hospedada na nuvem para a comunidade Ruby da Austrália (vou me referir a ela como Master). Duas vezes por ano, realizamos eventos do RailsCamp. É quando passamos um fim de semana inteiro juntos em um local remoto (50 a 150 pessoas por evento). Muitas vezes há pouca ou nenhuma recepção de celular, o que torna a coordenação desafiadora.

Estava pensando que uma instância do Discourse hospedada na rede local durante o evento seria ideal (vou me referir a ela como Slave). Poderíamos usá-la para publicar anúncios, cronogramas, compartilhar fotos etc.

Como já temos uma comunidade crescente no Master, seria ótimo aproveitar isso. Por exemplo, seu perfil já estaria configurado quando você chegasse ao evento, e você teria uma cópia de todo o conteúdo.

Desafio
Como manter a instância Slave do Discourse funcionando junto com a Master enquanto a Slave estiver offline por três dias?

Solução proposta
Entendo que o Discourse não foi projetado para isso. Mas acho que há uma maneira de atender às nossas necessidades. Estou interessado em suas ideias sobre isso.

O plano:

  • Configuramos uma instância Slave do Discourse na rede local durante o evento.
  • Imediatamente antes do evento, fazemos um backup do Master e o restauramos na Slave.
  • Na Slave:
    • Todas as categorias serão marcadas como somente leitura.
    • Criamos uma nova categoria de leitura/gravação para o evento.
  • Após o evento, usamos um script em Ruby para transferir informações da Slave para o Master:
    • Novos usuários criados.
    • Todos os tópicos e posts da categoria criada para o evento.
  • Lucro.

Perguntas

  • Você vê algum problema com a solução proposta?
  • Você consegue visualizar uma abordagem melhor?

Seria ótimo permitir acesso de escrita a todas as categorias na Slave, mas sinto que o processo de sincronização poderia ser muito complicado. Além disso, isso poderia causar confusão, já que algumas pessoas ainda poderiam acessar o Master se tivessem recepção.

Hello from a fellow Australian Rubyist… :wave:

This all sounds fine to me. To sync stuff up after the event I would recommend writing a small script that zooms through your read write categories and then makes API requests using our JSON API to create the topics / posts on the master.

I definitely recommend strongly against having any kind of merge topic scenario, it will be full of dragons and not worth the effort.

@antulik

Você tentou algo semelhante?
Estou em uma situação parecida, onde preciso levar o Discourse para o modo offline com sincronização.
Tenho um servidor mestre e terei mais de 100 a 200 instâncias escravas. As instâncias escravas podem estar online ou offline, mas serão usadas por usuários. Sempre que uma instância offline voltar ao online, ela deverá ser capaz de sincronizar com o servidor mestre sem criar conflitos e atualizar todos os dados mais recentes. Não quero fazer nenhuma alteração no código, pois o Discourse atualiza-se com bastante frequência e não quero quebrar a instância devido a mudanças no código.

Estou pensando em ajustar o PostgreSQL até certo ponto. Outros arquivos relacionados aos dados podem ser sincronizados usando o Syncthing. Mas atualizar os dados do PostgreSQL é algo que me preocupa, porque, se eu sincronizar diretamente os dados do mestre, o trabalho feito pelo usuário offline será apagado após a sincronização. Como foi a sua experiência ao escrever scripts para isso?

Ainda não o fizemos, pois tínhamos acesso à internet em todos os locais do evento.