Ripristino fallito - Backup S3 (compatibile)

Quindi ho provato a ripristinare un backup, ma sto ricevendo degli errori. Sembra che il problema sia legato ai backup su S3.

È importante notare che sto utilizzando un servizio compatibile con S3 (Scaleway). Tuttavia, non sono sicuro che questo errore sia specifico del servizio compatibile o meno; la configurazione è avvenuta in modo molto fluido e finora ha funzionato bene. Se il problema è specifico di Scaleway, probabilmente smetterò di utilizzare il loro servizio, dato che so che solo AWS S3 è ufficialmente supportato.

Ho seguito questa guida per la configurazione: Configure an S3 compatible object storage provider for uploads, quindi le impostazioni sono presenti nel file app.yml.

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

Ho utilizzato la stessa configurazione anche per Scaleway nel file app.yml (non l’ho impostata nelle impostazioni di amministrazione, poiché sembrava non necessaria): configurazione Scaleway

Ho provato sia dall’area di amministrazione che da riga di comando sul server corrente, oltre a configurare un nuovo server (copiando il file app.yml) e a eseguire il ripristino da riga di comando. Ho ottenuto gli stessi errori.

[AVVIATO]
'system' ha avviato il ripristino!
Impostazione dello stato del ripristino su "in corso"...
Verifica dell'esistenza di /var/www/discourse/tmp/restores/default/2020-07-16-131434...
Download dell'archivio nella directory 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> terminato con un'eccezione (report_on_exception è true):
Traceback (ultimo richiamo):
	1: da /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': metodo `split' non definito per nil:NilClass (NoMethodError)
ECCEZIONE: metodo `split' non definito per 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'
Tentativo di rollback...
Non era necessario eseguire il rollback
Pulizia dei file...
Rimozione della directory tmp '/var/www/discourse/tmp/restores/default/2020-07-16-131434'...
Ripresa di sidekiq...
Impostazione dello stato del ripristino su "completato"...
Notifica a 'system' della fine del ripristino...
#<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> terminato con un'eccezione (report_on_exception è true):
Traceback (ultimo richiamo):
	1: da /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': metodo `split' non definito per 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> terminato con un'eccezione (report_on_exception è true):
Traceback (ultimo richiamo):
	1: da /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': metodo `split' non definito per 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> terminato con un'eccezione (report_on_exception è true):
Traceback (ultimo richiamo):
	1: da /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': metodo `split' non definito per nil:NilClass (NoMethodError)
Finito!
[FALLITO]
Ripristino completato.

Forse l’errore riguarda solo il download del backup? :face_with_monocle:

Sembra di sì.

Sposterei la posizione del backup in locale nel file app.yml, ricostruirei l’app, scaricherei manualmente il file di backup e lo ripristinerei dalla console.

Ah, ha senso. Grazie @Falco! :slight_smile:

Proverò domani mattina e farò rapporto~

Grazie @Falco, molto apprezzato! Ha funzionato perfettamente :smiley:

Ho migrato su un nuovo server; sembra che sarebbe andato bene anche rimanere sullo stesso.

Nel caso in cui qualcun altro voglia farvi riferimento in futuro, ecco i passaggi in maggior dettaglio (nota: le mie impostazioni S3 erano solo nel file app.yml come specificato qui, senza personalizzazioni nelle impostazioni di amministrazione):

  1. Sul sito di origine, se non si tratta di un rollback, abilita ‘disattiva email’ (potrebbe non essere necessario) e attiva la modalità sola lettura (ricorda di disattivarle sulla nuova istanza una volta completata la migrazione). Esegui un backup; una volta completato, valuta di fermare anche l’istanza vecchia (./launcher stop app). Indipendentemente dal fatto che si tratti di un rollback o meno, aggiorna i record DNS A per puntare all’IP del nuovo server. Puoi farlo in modo più elegante o in un ordine diverso per minimizzare i tempi di inattività; nel mio caso i tempi di inattività non erano un problema (rollback, forum non ancora lanciato).

  2. Installa Discourse sul nuovo server e migra tutto ciò che è personalizzato in app.yml, incluse le impostazioni S3; assicurati che le versioni di Discourse siano uguali o molto simili.

  3. Commenta queste due righe (le altre impostazioni S3 in app.yml possono rimanere invariate):
    DISCOURSE_S3_BACKUP_BUCKET: BucketName
    DISCOURSE_BACKUP_LOCATION: s3

  4. Scarica manualmente il backup desiderato da S3 o da un servizio compatibile con S3.

  5. Vai in /var/discourse/shared/standalone/backups e crea una nuova cartella chiamata ‘default’ se non esiste (non esiste se si tratta di una nuova installazione). Quindi, restando nella directory dei backup, esegui (questo cambia i permessi della cartella per corrispondere a quelli che avrebbe normalmente se Discourse avesse creato un backup locale - non sono sicuro che sia necessario):
    chown -R 1000:www-data default

  6. Carica il backup nella cartella backups/default usando un client SFTP; non rinominare il file di backup.

  7. Ricompila l’app:
    cd /var/discourse
    ./launcher rebuild app

  8. Entra nell’app, abilita i backup e ripristina (rinomina BackupFileName.tar.gz):

./launcher enter app
discourse enable_restore
discourse restore BackupFileName.tar.gz
  1. Una volta completato, decommenta le due righe relative al backup S3 in app.yml dal passaggio 2 e ricompila l’app.

  2. Puoi eliminare la cartella locale backups/default e il backup contenuto (/var/discourse/shared/standalone/backups).

Riferimento: