Migrando o Discourse de uma droplet DigitalOcean para outra sem tempo de inatividade

Estamos migrando para um novo droplet da DigitalOcean e tentamos usar a imagem do marketplace. Ao executar o script de configuração, ele falha logo no início porque nosso nome de domínio ainda está apontando para nossa instância atual em produção.

Preciso colocar essa nova instalação no ar para poder restaurar seu backup e, só então, atualizar os registros DNS.

O erro é:

Verificando seu nome de domínio . . .
AVISO: A porta 443 do computador não parece estar acessível usando o hostname: x
AVISO: A conexão com x (porta 80) também falha.

Isso sugere que x resolve para algum endereço IP que não alcança esta
máquina onde você está instalando o Discourse.

A primeira coisa a fazer é confirmar se x resolve para o endereço IP deste servidor.
Geralmente, você faz isso no mesmo local onde comprou o domínio.

Se você tem certeza de que o endereço IP está resolvendo corretamente, pode ser um problema de firewall.
Uma busca na web por "abrir portas SEU SERVIÇO DE NUVEM" pode ajudar.

O nome de domínio realmente responde nas portas 80 e 443, então essa mensagem de erro também parece estar incorreta.

Oi Matt,

Nós (a equipe do Discourse) não gerenciamos a imagem do marketplace da DO, então, receio que nossa ajuda para resolver esse problema específico será limitada.

Mas você gerencia isso, certo?

Até as instruções de instalação manual incluem essa etapa.

Com certeza não posso ser a primeira pessoa a fazer isso. Como as pessoas estão fazendo?

Sim, nós gerenciamos isso. Não analisei o código; assumi que a verificação vinha da imagem do marketplace.

./discourse-setup destina-se a ser uma maneira simples de configurar o Discourse, evitando a necessidade de editar manualmente um arquivo de texto ao iniciar um novo site do Discourse. Seu caso de uso não é “típico” para o que o script de configuração lida.

No seu caso, sua melhor opção provavelmente seria copiar o arquivo containers/app.yml do seu servidor atual para o novo. Alternativamente, você pode editar o arquivo manualmente, conforme sugerido nas linhas 75/76:

Onde posso encontrar o app.yml padrão? Quero começar com uma instalação padrão limpa.

Além disso, como faço para colocar o servidor em funcionamento sem o script de configuração? O acesso ao endereço IP continua sem resposta, já que não consigo executar o script de configuração.

O padrão pode ser encontrado em samples/standalone.yml. Também no GitHub.

Considerando que você está seguindo o guia oficial de instalação, após os comandos em “Instalar Discourse”, você deve fazer o seguinte:

Copie o arquivo YAML padrão de samples para containers:

cp samples/standalone.yml containers/app.yml

Edite o arquivo manualmente:

nano containers/app.yml

Inicialize e inicie o Discourse:

./launcher rebuild app

Obrigado, isso me aproxima.

Mas agora não consigo importar o backup porque não consigo ativar minha conta de administrador temporária:

(6) A carga do script ‘’ foi recusada porque viola a seguinte diretiva de Política de Segurança de Conteúdo: “script-src ”. Observe que ‘script-src-elem’ não foi definido explicitamente, então ‘script-src’ é usado como fallback.

Existe uma maneira direta de restaurar a partir de um backup ou desativar a CSP até lá?

Acesse seu servidor via SSH e, em seguida:

cd /var/discourse
sudo ./launcher enter app
rails c
SiteSetting.content_security_policy = false
exit
exit

Observe que eu tentaria primeiro a restauração do backup pela CLI — isso resolve o problema real que você tem (restaurar um backup) em vez do obstáculo atual (CSP).

Obrigado pelas dicas.

Ao executar a restauração, obtenho:

ERRO: não foi possível criar o índice exclusivo "index_incoming_referers_on_path_and_incoming_domain_id"
DETALHE:  A chave (path, incoming_domain_id)=(/s/free+proxy+hideip.me, 1009) está duplicada.
EXCEÇÃO: psql falhou: DETALHE:  A chave (path, incoming_domain_id)=(/s/free+proxy+hideip.me, 1009) está duplicada.
/var/www/discourse/lib/backup_restore/database_restorer.rb:87:in `restore_dump'
/var/www/discourse/lib/backup_restore/database_restorer.rb:26:in `restore'
/var/www/discourse/lib/backup_restore/restorer.rb:51:in `run'
script/discourse:143:in `restore'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/thor-1.0.1/lib/thor/command.rb:27:in `run'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/thor-1.0.1/lib/thor/invocation.rb:127:in `invoke_command'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/thor-1.0.1/lib/thor.rb:392:in `dispatch'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/thor-1.0.1/lib/thor/base.rb:485:in `start'
script/discourse:284:in `<top (required)>'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.3/lib/bundler/cli/exec.rb:63:in `load'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.3/lib/bundler/cli/exec.rb:63:in `kernel_load'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.3/lib/bundler/cli/exec.rb:28:in `run'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.3/lib/bundler/cli.rb:497:in `exec'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.3/lib/bundler/vendor/thor/lib/thor/command.rb:27:in `run'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.3/lib/bundler/vendor/thor/lib/thor/invocation.rb:127:in `invoke_command'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.3/lib/bundler/vendor/thor/lib/thor.rb:392:in `dispatch'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.3/lib/bundler/cli.rb:30:in `dispatch'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.3/lib/bundler/vendor/thor/lib/thor/base.rb:485:in `start'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.3/lib/bundler/cli.rb:24:in `start'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.3/exe/bundle:49:in `block in <top (required)>'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.3/lib/bundler/friendly_errors.rb:130:in `with_friendly_errors'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.3/exe/bundle:37:in `<top (required)>'
/usr/local/bin/bundle:23:in `load'
/usr/local/bin/bundle:23:in `<main>'
Tentando reverter...
Revertendo...
Limpando arquivos...
Removendo funções do esquema discourse_functions...
Removendo o diretório temporário '/var/www/discourse/tmp/restores/default/2020-12-29-214249'...
Retomando o sidekiq...
Marcando a restauração como concluída...
Notificando o 'sistema' sobre o fim da restauração...
Concluído!
[ERROU]
Restauração finalizada.

Parece que você tem um índice corrompido. Você executou uma atualização na instância existente? Há uma chance de que isso ajude.

Existe algum tópico com instruções para copiar os arquivos do banco de dados bruto (e do Let’s Encrypt) da instância antiga. Isso provavelmente é o que eu faria.

O que é “rub run”?

As atualizações na instância existente continuam apresentando erros (erros diferentes deste), por isso estou migrando para uma nova instância.

Você tem um link para isso?

Transferência de backups via rsync e cron talvez