Falha na restauração - backup S3 (compatível)

Então, tenho tentado restaurar um backup, mas estou recebendo erros. Parece que o problema está relacionado aos backups no S3.

É importante notar que estou usando um serviço compatível com S3 (Scaleway). No entanto, não tenho certeza se esse erro é específico do serviço compatível ou não. A configuração funcionou de forma muito fluida e tem funcionado bem. Se for específico do Scaleway, provavelmente deixarei de usar o serviço, pois entendo que apenas o AWS S3 é oficialmente suportado.

Usei este guia para configurar: Configure an S3 compatible object storage provider for uploads, então isso está no arquivo app.yml.

  after_assets_precompile:
    - exec:
        cd: $home
        cmd:
          - sudo -E -u discourse bundle exec rake s3:upload_assets

Usei a mesma configuração para o Scaleway também no arquivo app.yml (não configurei nas configurações de administração, pois parecia desnecessário): configuração do Scaleway

Tentei tanto pela área de administração quanto pela linha de comando no servidor atual, além de configurar um novo servidor (copiei o app.yml) e restaurar via linha de comando. Recebi os mesmos erros.

[INICIADO]
O 'sistema' iniciou a restauração!
Marcando a restauração como em execução...
Garantindo que /var/www/discourse/tmp/restores/default/2020-07-16-131434 existe...
Baixando o arquivo para o diretório tmp...
#<Thread:0x000055c73a831df8@/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/aws-sdk-s3-1.66.0/lib/aws-sdk-s3/file_downloader.rb:116 run> finalizado com exceção (report_on_exception é true):
Traceback (última chamada):
	1: from /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/aws-sdk-s3-1.66.0/lib/aws-sdk-s3/file_downloader.rb:120:in `block (3 levels) in thread_batches'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/aws-sdk-s3-1.66.0/lib/aws-sdk-s3/file_downloader.rb:128:in `write': método `split' não definido para nil:NilClass (NoMethodError)
EXCEÇÃO: método `split' não definido para nil:NilClass
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/aws-sdk-s3-1.66.0/lib/aws-sdk-s3/file_downloader.rb:128:in `write'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/aws-sdk-s3-1.66.0/lib/aws-sdk-s3/file_downloader.rb:120:in `block (3 levels) in thread_batches'
Tentando reverter...
Não foi necessário reverter
Limpando arquivos...
Removendo o diretório tmp '/var/www/discourse/tmp/restores/default/2020-07-16-131434'...
Retomando o sidekiq...
Marcando a restauração como concluída...
Notificando o 'sistema' sobre o fim da restauração...
#<Thread:0x000055c73a831510@/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/aws-sdk-s3-1.66.0/lib/aws-sdk-s3/file_downloader.rb:116 run> finalizado com exceção (report_on_exception é true):
Traceback (última chamada):
	1: from /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/aws-sdk-s3-1.66.0/lib/aws-sdk-s3/file_downloader.rb:120:in `block (3 levels) in thread_batches'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/aws-sdk-s3-1.66.0/lib/aws-sdk-s3/file_downloader.rb:128:in `write': método `split' não definido para nil:NilClass (NoMethodError)
#<Thread:0x000055c73a8316c8@/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/aws-sdk-s3-1.66.0/lib/aws-sdk-s3/file_downloader.rb:116 run> finalizado com exceção (report_on_exception é true):
Traceback (última chamada):
	1: from /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/aws-sdk-s3-1.66.0/lib/aws-sdk-s3/file_downloader.rb:120:in `block (3 levels) in thread_batches'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/aws-sdk-s3-1.66.0/lib/aws-sdk-s3/file_downloader.rb:128:in `write': método `split' não definido para nil:NilClass (NoMethodError)
#<Thread:0x000055c73a8319e8@/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/aws-sdk-s3-1.66.0/lib/aws-sdk-s3/file_downloader.rb:116 run> finalizado com exceção (report_on_exception é true):
Traceback (última chamada):
	1: from /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/aws-sdk-s3-1.66.0/lib/aws-sdk-s3/file_downloader.rb:120:in `block (3 levels) in thread_batches'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/aws-sdk-s3-1.66.0/lib/aws-sdk-s3/file_downloader.rb:128:in `write': método `split' não definido para nil:NilClass (NoMethodError)
Concluído!
[FALHOU]
Restauração concluída.

Talvez o erro seja apenas ao baixar o backup? :face_with_monocle:

Parece que sim.

Eu moveria o local do backup para local no app.yml, reconstruiria, baixaria o arquivo de backup manualmente e restauraria pelo console.

Ah, faz sentido. Obrigado @Falco! :slight_smile:

Vou tentar amanhã de manhã e dou um retorno~

Obrigado @Falco, agradeço muito! Funcionou perfeitamente :smiley:

Migrei para um novo servidor, parece que teria ficado tudo bem permanecer no mesmo servidor também.

Caso alguém queira consultar isso mais tarde, os passos com mais detalhes foram (observe que minhas configurações do S3 estavam apenas no arquivo app.yml, conforme especificado aqui, sem nenhuma personalização nas configurações de administrador):

  1. No site de origem, se não for um rollback, habilite ‘desativar e-mails’ (pode não ser necessário) e ative o modo somente leitura (lembre-se de reativar essas opções na nova instância assim que a migração for concluída). Crie um backup; quando terminar, considere parar a instância antiga também (./launcher stop app). Independentemente de ser um rollback ou não, atualize os registros A do DNS para apontar para o IP do novo servidor. Você pode fazer isso de forma mais elegante ou em uma ordem diferente para minimizar o tempo de inatividade; no meu caso, o tempo de inatividade não foi uma preocupação (rollback, fórum ainda não lançado).

  2. Instale o Discourse no novo servidor e migre todas as configurações personalizadas do app.yml, incluindo as configurações do S3. Mantenha as versões do Discourse iguais ou muito próximas.

  3. Comente estas duas linhas (outras configurações do S3 no app.yml podem permanecer como estão):
    DISCOURSE_S3_BACKUP_BUCKET: BucketName
    DISCOURSE_BACKUP_LOCATION: s3

  4. Baixe manualmente o backup desejado do S3 ou de um serviço compatível com S3.

  5. Navegue até /var/discourse/shared/standalone/backups e crie uma nova pasta chamada ‘default’ se ela não existir (ela não existirá se for uma instalação nova). Em seguida, estando no diretório de backups, execute (isso altera as permissões da pasta para corresponder ao que essa pasta teria normalmente se o Discourse tivesse criado um backup local — não tenho certeza se é necessário):
    chown -R 1000:www-data default

  6. Faça o upload do backup para a pasta backups/default usando um cliente SFTP; não renomeie o arquivo de backup.

  7. Reconstrua o app:
    cd /var/discourse
    ./launcher rebuild app

  8. Acesse o app, habilite backups e restaure (renomeie BackupFileName.tar.gz):

./launcher enter app
discourse enable_restore
discourse restore BackupFileName.tar.gz
  1. Após a conclusão, descomente as duas linhas de backup do S3 no app.yml do passo 2 e reconstrua o app.

  2. Você pode excluir a pasta local backups/default e o backup contido nela (/var/discourse/shared/standalone/backups).

Referência: