Impossible de migrer les téléchargements vers S3

Bonjour, nous avons configuré l’hébergement des téléchargements (en utilisant les paramètres S3) sur Backblaze.
Les nouveaux téléchargements fonctionnent (après la correction de l’en-tête x-amz-checksum-crc32), cependant, la migration des téléchargements existants avec uploads:migrate_to_s3 échoue immédiatement.

Ceci concerne la dernière version de Discourse (3.5.0.beta5-dev).
Voici la sortie complète :

root@goactuary-app:/var/www/discourse# rake uploads:migrate_to_s3 --trace
** Invoke uploads:migrate_to_s3 (first_time)
** Invoke environment (first_time)
** Execute environment
** Execute uploads:migrate_to_s3
Veuillez noter que la migration vers S3 n'est actuellement pas réversible !
[CTRL+c] pour annuler, [ENTER] pour continuer

Migration des téléchargements vers S3 pour 'default'...
Certains téléchargements n'ont pas été migrés vers le nouveau schéma. L'exécution de la migration peut prendre un certain temps...
rake aborted!
FileStore::ToS3MigrationError: Certains téléchargements n'ont pas pu être migrés vers le nouveau schéma. Vous devez corriger cela manuellement. (FileStore::ToS3MigrationError)
/var/www/discourse/lib/file_store/to_s3_migration.rb:156:in `migrate_to_s3'
/var/www/discourse/lib/file_store/to_s3_migration.rb:59:in `migrate'
/var/www/discourse/lib/tasks/uploads.rake:126:in `migrate_to_s3'
/var/www/discourse/lib/tasks/uploads.rake:106:in `block in migrate_to_s3_all_sites'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rails_multisite-6.1.0/lib/rails_multisite/connection_management/null_instance.rb:49:in `with_connection'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rails_multisite-6.1.0/lib/rails_multisite/connection_management/null_instance.rb:36:in `each_connection'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rails_multisite-6.1.0/lib/rails_multisite/connection_management.rb:21:in `each_connection'
/var/www/discourse/lib/tasks/uploads.rake:104:in `migrate_to_s3_all_sites'
/var/www/discourse/lib/tasks/uploads.rake:100:in `block in <main>'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/task.rb:281:in `block in execute'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/task.rb:281:in `each'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/task.rb:281:in `execute'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/task.rb:219:in `block in invoke_with_call_chain'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/task.rb:199:in `synchronize'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/task.rb:199:in `invoke_with_call_chain'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/task.rb:188:in `invoke'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/application.rb:188:in `invoke_task'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/application.rb:138:in `block (2 levels) in top_level'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/application.rb:138:in `each'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/application.rb:138:in `block in top_level'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/application.rb:147:in `run_with_threads'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/application.rb:132:in `top_level'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/application.rb:83:in `block in run'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/application.rb:214:in `standard_exception_handling'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/application.rb:80:in `run'
bin/rake:13:in `<top (required)>'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/cli/exec.rb:59:in `load'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/cli/exec.rb:59:in `kernel_load'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/cli/exec.rb:23:in `run'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/cli.rb:452:in `exec'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/vendor/thor/lib/thor/command.rb:28:in `run'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/vendor/thor/lib/thor/invocation.rb:127:in `invoke_command'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/vendor/thor/lib/thor.rb:538:in `dispatch'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/cli.rb:35:in `dispatch'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/vendor/thor/lib/thor/base.rb:584:in `start'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/cli.rb:29:in `start'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/exe/bundle:28:in `block in <top (required)>'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/friendly_errors.rb:117:in `with_friendly_errors'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/exe/bundle:20:in `<top (required)>'
/usr/local/bin/bundle:25:in `load'
/usr/local/bin/bundle:25:in `<main>'
Tasks: TOP => uploads:migrate_to_s3

Vous devez les mettre dans votre app.yml comme décrit dans Configurer un fournisseur de stockage d’objets compatible S3 pour les téléchargements

Voulez-vous dire que vous avez ajouté du code à votre app.yml pour rétablir la bibliothèque aws à une version qui fonctionne avec backblaze ?

2 « J'aime »

Oui, ils sont dans app.yml et j’ai reconstruit l’application.
J’ai confirmé que les nouveaux fichiers téléchargés y sont bien envoyés.

Pas tout à fait. J’utilise les variables d’environnement suivantes :

  AWS_REQUEST_CHECKSUM_CALCULATION: WHEN_REQUIRED
  AWS_RESPONSE_CHECKSUM_VALIDATION: WHEN_REQUIRED

Celles-ci ont résolu le problème de l’impossibilité de télécharger de nouveaux fichiers après le changement de paramètres.

Vous devrez probablement les retrouver vous-même.

Dans Rails, vous pouvez

 Upload.pluck(:url)

Et ensuite chercher quels téléversements posent problème.

Je pense que d’après mon expérience, cela n’a pas suffi, mais vous dites que cela fonctionne pour vous.

2 « J'aime »

La rétrogradation manuelle des gems aws dans le conteneur a permis à la tâche uploads:migrate_to_s3 de téléverser effectivement les images, donc apparemment les variables d’environnement n’étaient pas suffisantes, comme vous l’aviez souligné.

Cependant, le processus a échoué plus tard à un autre point :

FileStore::ToS3MigrationError: 2 posts ne sont pas remappés à la nouvelle URL de téléversement S3. La migration S3 a échoué pour la base de données 'default'. (FileStore::ToS3MigrationError)

Ce sera une aventure de dépannage distincte.

1 « J'aime »

C’est peut-être parce que vous avez une boîte faisant référence à des publications locales. J’ai créé un sujet à ce sujet mais je ne me souviens pas des détails.

S’il n’y en a que 2, vous pourriez simplement l’ignorer, mais dans Rails, vous pouvez trouver tous les téléchargements qui n’incluent pas votre nouveau bucket. Je pense que ce sera vide ?

Je pense que le problème est que vous avez deux publications avec un chemin inattendu dans la publication cuite.

Je l’ai trouvé !
Impossible de restaurer une sauvegarde si elle inclut un lien vers Discourse onebox

Edit : donc je pense que vous avez deux publications avec des boîtes locales. Je pense que vous avez juste besoin de trouver et de refondre ces publications.

1 « J'aime »

@stanski, cela a-t-il résolu votre problème ?

1 « J'aime »

Désolé, j’ai été pris par autre chose et j’ai oublié de mettre ceci à jour.
Après avoir ré-écrit tous les messages, j’ai obtenu un message d’erreur différent lors de la nouvelle tentative de migration.
Je ne retrouve malheureusement plus la trace d’exécution.

Je me suis rendu compte que malgré l’erreur, il semblait que les téléchargements étaient migrés vers Backblaze et les messages mis à jour.
J’ai archivé les téléchargements locaux et les ai déplacés ailleurs et je n’ai reçu aucune plainte depuis.

Donc, en conclusion, oui, mon problème a été résolu.
Merci à @pfaffman pour ses suggestions continues.

Maintenant, j’ai une plainte que divers pare-feu bloquent les téléchargements hébergés par backblaze, mais c’est une autre affaire.

Vous voulez vraiment utiliser un CDN, je pense.

1 « J'aime »