Preserve sessões de usuário ao migrar para um novo host

Continuando a discussão de Mova sua instância do Discourse para um servidor diferente:

Um problema ao migrar uma instância do Discourse para um novo servidor, ou até mesmo ao restaurar um backup em uma instância recém-criada, é que todas as sessões de usuários logados podem ser perdidas — exigindo que os usuários façam login novamente. Dependendo da comunidade, isso pode ser indesejável porque:

  • Alguns usuários podem ficar desencorajados a participar se tiverem dificuldade em fazer login novamente.
  • Alguns usuários podem precisar de ajuda para recuperar suas senhas.
  • Alguns usuários podem criar novas contas, separando-se de seu histórico de postagens e Notas de Usuário, enquanto deixam para trás uma conta zumbi.

A perda de sessões pode ocorrer porque os cookies de sessão do Discourse são criptografados com uma chave secreta gerada aleatoriamente, que é armazenada no Redis por padrão. Os dados do Redis não são incluídos em um backup, então uma nova chave secreta é gerada quando você restaura o site em um novo host.

A vantagem dessa abordagem é que um arquivo de backup comprometido não contém a chave necessária para comprometer as sessões dos usuários — o que poderia ter consequências muito graves.

Ao migrar uma instância do Discourse, isso pode, no entanto, ser contornado seguindo estes passos para copiar a chave secreta, permitindo a migração de hosts enquanto mantém as sessões dos usuários.

Passo 1: Recuperar o segredo

Acesse sua instância existente do Discourse, execute um console Rails e obtenha a chave secreta:

admin@host:/var/discourse$ ./launcher enter app
root@host:/var/www/discourse# rails console
[1] pry(main)> GlobalSetting.safe_secret_key_base
=> "90.......fed"

Anote o valor impresso na última linha e mantenha-o seguro.

Passo 2: Definir o segredo na nova instância

Supondo que você já tenha uma instância do Discourse preparada para receber um backup para migrar sua instalação, edite o app.yml para definir o segredo que você acabou de obter. Adicione-o à seção env:

env:
  DISCOURSE_SECRET_KEY_BASE: "90.......fed"

Após adicionar isso, reconstrua a instância:

admin@newhost $ launcher rebuild app

Passo 3: Verificar o segredo na nova instância

Este passo é o mesmo que o Passo 1, exceto que os comandos são executados no novo host:

admin@newhost:/var/discourse$ ./launcher enter app
root@newhost:/var/www/discourse# rails console
[1] pry(main)> GlobalSetting.safe_secret_key_base
=> "90.......fed"

A chave secreta impressa deve ser exatamente a mesma que a chave do passo 1.

Passo 4: Prosseguir com a migração

Defina o Discourse de origem como somente leitura, faça um backup, copie-o para o Discourse de destino e restaure. Atualize os registros DNS (ou use uma alteração no arquivo hosts para testes) para que os usuários sejam direcionados ao novo site.

As sessões de login anteriores agora devem persistir no novo host.

Aviso

Você não deve compartilhar a chave secreta entre múltiplas instâncias do Discourse. A posse da chave secreta permitiria que alguém descriptografasse e modificasse seu cookie de sessão em um site, o que poderia ter consequências de segurança muito graves.

Como sempre, pratique e verifique os passos acima em uma instância de sandbox ou instalações de teste antes de trabalhar em uma instância real do Discourse. Prepare-se para o sucesso!

Por fim, mas não menos importante, muitos agradecimentos a @david por descrever este método — eu apenas testei e escrevi aqui (e sinta-se à vontade para editar ou aprimorar!).

1 curtida