Échec de restauration - sauvegarde S3 (compatible)

J’essaie de restaurer une sauvegarde, mais je rencontre des erreurs. Cela semble lié aux sauvegardes S3.

Il est important de noter que j’utilise un service compatible S3 (Scaleway). Cependant, je ne sais pas si cette erreur est spécifique au service compatible ou non. La configuration s’est faite de manière très fluide et tout fonctionnait bien jusqu’à présent. Si le problème est spécifique à Scaleway, je cesserai probablement d’utiliser leur service, car je comprends que seule AWS S3 est officiellement prise en charge.

J’ai utilisé ce guide pour la configuration : Configure an S3 compatible object storage provider for uploads. Voici ce qui se trouve dans le fichier app.yml :

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

J’ai utilisé la même configuration pour Scaleway dans le fichier app.yml (je ne l’ai pas configurée dans les paramètres d’administration, car cela semblait inutile) : configuration Scaleway.

J’ai essayé à la fois depuis la zone d’administration et la ligne de commande sur le serveur actuel, ainsi qu’en configurant un nouveau serveur (en copiant le fichier app.yml) et en effectuant la restauration via la ligne de commande. J’ai obtenu les mêmes erreurs.

[DÉMARRÉ]
'system' a démarré la restauration !
Marquage de la restauration comme en cours...
Vérification de l'existence de /var/www/discourse/tmp/restores/default/2020-07-16-131434...
Téléchargement de l'archive dans le répertoire 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> s'est terminé avec une exception (report_on_exception est true) :
Traceback (most recent call last):
	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': undefined method `split' for nil:NilClass (NoMethodError)
EXCEPTION: undefined method `split' for 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'
Tentative de rollback...
Aucun rollback nécessaire
Nettoyage...
Suppression du répertoire tmp '/var/www/discourse/tmp/restores/default/2020-07-16-131434'...
Reprendre sidekiq...
Marquage de la restauration comme terminée...
Notification à 'system' de la fin de la restauration...
#<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> s'est terminé avec une exception (report_on_exception est true) :
Traceback (most recent call last):
	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': undefined method `split' for 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> s'est terminé avec une exception (report_on_exception est true) :
Traceback (most recent call last):
	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': undefined method `split' for 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> s'est terminé avec une exception (report_on_exception est true) :
Traceback (most recent call last):
	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': undefined method `split' for nil:NilClass (NoMethodError)
Terminé !
[ÉCHOUÉ]
Restauration terminée.

Peut-être que l’erreur concerne uniquement le téléchargement de la sauvegarde ? :face_with_monocle:

Ça y ressemble.

Je déplacerais l’emplacement de la sauvegarde vers le local dans app.yml, je reconstruirais, je téléchargerais manuellement le fichier de sauvegarde et je restaurerais depuis la console.

Ah, cela a du sens. Merci @Falco ! :slight_smile:

Je vais essayer demain matin et je vous tiens au courant~

Merci @Falco, je vous en suis reconnaissant ! Tout s’est passé parfaitement :smiley:

J’ai migré vers un nouveau serveur, mais il semble que rester sur le même serveur aurait aussi fonctionné.

Au cas où quelqu’un d’autre souhaiterait se référer à cela plus tard, voici les étapes détaillées (notez que mes paramètres S3 étaient simplement dans le fichier app.yml comme spécifié ici, sans aucune personnalisation dans les paramètres d’administration) :

  1. Sur le site source, si ce n’est pas un retour en arrière, activez « désactiver les e-mails » (peut-être pas nécessaire) et passez en mode lecture seule (n’oubliez pas de réactiver ces options sur la nouvelle instance une fois la migration terminée). Créez une sauvegarde ; une fois celle-ci terminée, envisagez d’arrêter l’ancienne instance également (./launcher stop app). Que ce soit un retour en arrière ou non, mettez à jour les enregistrements DNS A pour qu’ils pointent vers l’adresse IP du nouveau serveur. Vous pouvez le faire de manière plus élégante ou dans un ordre différent pour minimiser les temps d’arrêt ; dans mon cas, les temps d’arrêt n’étaient pas un problème (retour en arrière, forum non encore lancé).

  2. Installez Discourse sur le nouveau serveur et migrez tout ce qui est personnalisé dans app.yml, y compris les paramètres S3. Assurez-vous que les versions de Discourse soient identiques ou très proches.

  3. Commentez ces deux lignes (les autres paramètres S3 dans app.yml peuvent rester tels quels) :
    DISCOURSE_S3_BACKUP_BUCKET: BucketName
    DISCOURSE_BACKUP_LOCATION: s3

  4. Téléchargez manuellement la sauvegarde souhaitée depuis S3 ou un service compatible S3.

  5. Accédez à /var/discourse/shared/standalone/backups et créez un nouveau dossier nommé « default » s’il n’existe pas (il n’existera pas dans le cas d’une nouvelle installation). Ensuite, toujours dans le dossier backups, exécutez la commande suivante (cela modifie les permissions du dossier pour qu’elles correspondent à celles qu’il aurait normalement si Discourse avait créé une sauvegarde locale — je ne suis pas sûr que cela soit nécessaire) :
    chown -R 1000:www-data default

  6. Téléversez la sauvegarde dans le dossier backups/default à l’aide d’un client SFTP, sans renommer le fichier de sauvegarde.

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

  8. Accédez à l’application, activez les sauvegardes et restaurez (renommez BackupFileName.tar.gz) :

./launcher enter app
discourse enable_restore
discourse restore BackupFileName.tar.gz
  1. Une fois terminé, décommentez les deux lignes relatives aux sauvegardes S3 dans app.yml (étape 2) et reconstruisez l’application.

  2. Vous pouvez supprimer le dossier local backups/default et la sauvegarde qu’il contient (/var/discourse/shared/standalone/backups).

Référence :