Impossibile migrare gli upload su S3

Ciao, abbiamo configurato l’hosting per il caricamento (utilizzando le impostazioni S3) su Backblaze.
I nuovi caricamenti funzionano (dopo la correzione dell’intestazione x-amz-checksum-crc32), tuttavia il tentativo di migrare i caricamenti esistenti con uploads:migrate_to_s3 fallisce immediatamente.

Questo è sulla versione più recente di Discourse (3.5.0.beta5-dev).
Ecco l’output completo:

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
Si prega di notare che la migrazione a S3 non è attualmente reversibile!
[CTRL+c] per annullare, [ENTER] per continuare

Migrating uploads to S3 for 'default'...
Some uploads were not migrated to the new scheme. Running the migration, this may take a while...
rake aborted!
FileStore::ToS3MigrationError: Some uploads could not be migrated to the new scheme. You need to fix this manually. (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

Devi inserirle nel tuo file app.yml come descritto in Configura un provider di archiviazione oggetti compatibile con S3 per i caricamenti

Intendi dire che hai aggiunto del codice al tuo file app.yml per ripristinare la libreria AWS a una versione che funziona con Backblaze?

2 Mi Piace

Sì, sono in app.yml e ho ricostruito l’app.
Ho confermato che i file caricati di recente ci finiscono.

Non proprio. Sto usando le seguenti variabili d’ambiente:

  AWS_REQUEST_CHECKSUM_CALCULATION: WHEN_REQUIRED
  AWS_RESPONSE_CHECKSUM_VALIDATION: WHEN_REQUIRED

Queste hanno risolto il problema di non poter caricare nuovi file dopo la modifica delle impostazioni.

Probabilmente dovrai trovarli tu stesso.

In rails puoi

 Upload.pluck(:url)

E quindi cercare quali upload sono il problema.

Penso che, per mia esperienza, non sia stato sufficiente, ma dici che funziona per te.

2 Mi Piace

Il downgrade manuale delle gemme aws nel container ha permesso al job uploads:migrate_to_s3 di caricare effettivamente le immagini, quindi apparentemente le variabili d’ambiente non erano sufficienti, come hai sottolineato.

Tuttavia, il processo è fallito in seguito in un punto diverso:

FileStore::ToS3MigrationError: 2 post non sono stati rimappati al nuovo URL di upload S3. La migrazione S3 è fallita per il db 'default'. (FileStore::ToS3MigrationError)

Questa sarà un’avventura di troubleshooting separata.

1 Mi Piace

Potrebbe essere perché hai una casella che fa riferimento a post locali. Ho creato un argomento al riguardo ma non ricordo bene i dettagli.

Se sono solo 2, potresti semplicemente ignorarlo, ma in Rails puoi trovare tutti gli upload che non contengono il tuo nuovo bucket. Penso che sarà vuoto?

Penso che il problema sia che hai due post che hanno un percorso imprevisto nel post cotto.

L’ho trovato!
Impossibile ripristinare un backup se include un link a Discourse onebox

Modifica: quindi penso che tu abbia due post con caselle locali. Penso che tu debba solo trovare e rielaborare quei post.

1 Mi Piace

@stanski questo ha risolto il tuo problema?

1 Mi Piace

Scusate, sono stato impegnato e mi sono dimenticato di aggiornare la situazione.
Dopo aver rigenerato tutti i post, ho ricevuto un messaggio di errore diverso quando ho riprovato la migrazione.
Purtroppo non riesco più a trovare il backtrace.

Mi sono reso conto che, nonostante l’errore, sembrava che gli upload fossero stati migrati a Backblaze e i post aggiornati.
Ho archiviato gli upload locali e li ho spostati altrove e da allora non ho più ricevuto lamentele.

Quindi, in conclusione, sì, il mio problema è stato risolto.
Grazie a @pfaffman per i continui suggerimenti.

Ora ho una lamentela sul fatto che vari firewall stanno bloccando gli upload ospitati su Backblaze, ma questa è un’altra questione.

Penso che tu voglia davvero usare una cdn.

1 Mi Piace