Migrate_to_s3 fallisce

Sto cercando di spostare i caricamenti su s3 su un sito relativamente trafficato.
Tutto procede come previsto tranne quando eseguo rake uploads:migrate_to_s3, mi viene presentato il seguente errore:

Aggiornamento degli URL nel database...
Rimozione delle vecchie immagini ottimizzate...
Segnalazione di tutti i post contenenti lightboxes per il rebake...
2023 post sono stati segnalati per un rebake
rake interrotto!
FileStore::ToS3MigrationError: 1 dei 9629 caricamenti non sono stati migrati su S3. La migrazione S3 è fallita per il db 'default'.
/var/www/discourse/lib/file_store/to_s3_migration.rb:132:in `raise_or_log'
/var/www/discourse/lib/file_store/to_s3_migration.rb:79:in `migration_successful?'
/var/www/discourse/lib/file_store/to_s3_migration.rb:373:in `migrate_to_s3'
/var/www/discourse/lib/file_store/to_s3_migration.rb:66:in `migrate'
/var/www/discourse/lib/tasks/uploads.rake:123:in `migrate_to_s3'
/var/www/discourse/lib/tasks/uploads.rake:102:in `block in migrate_to_s3_all_sites'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rails_multisite-4.0.0/lib/rails_multisite/connection_management.rb:80:in `with_connection'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rails_multisite-4.0.0/lib/rails_multisite/connection_management.rb:90:in `each_connection'
/var/www/discourse/lib/tasks/uploads.rake:100:in `migrate_to_s3_all_sites'
/var/www/discourse/lib/tasks/uploads.rake:96:in `block in <main>'
/usr/local/bin/bundle:23:in `load'
/usr/local/bin/bundle:23:in `<main>'
Tasks: TOP => uploads:migrate_to_s3
(Vedi la traccia completa eseguendo il task con --trace)

Questa riga in particolare ha attirato la mia attenzione FileStore::ToS3MigrationError: 1 of 9629 uploads are not migrated to S3. S3 migration failed for db 'default'.

Presumo significhi che c’è un file problematico che sta causando il fallimento dell’intero task rake? C’è un modo per scoprire quale file sta causando il problema e magari rimuoverlo in modo che il resto del task possa completarsi pacificamente?

1 Mi Piace

Aggiornamento:\nIl sito sembra caricarsi normalmente e, per quanto posso vedere, le immagini caricate vengono servite dalla CDN. La copia locale di tutti i caricamenti esiste ancora sul server. Presumo che ciò sia dovuto al fatto che la migrazione è contrassegnata come fallita. L’output di rake uploads:s3_migration_status è utile in qualche modo?\n\n\n# rake uploads:s3_migration_status\n1 di 9630 caricamenti non sono stati migrati su S3. La migrazione S3 è fallita per il db 'default'.\n19 post non sono stati rimappati al nuovo URL di caricamento S3. La migrazione S3 è fallita per il db 'default'.\nNessun post richiede il rebaking\nIl sito non è pronto per la migrazione\n

Potresti trovare un riferimento a quale file è fallito tramite Admin > Log > Log di errori

Se ciò non aiuta, penso che la ricerca nel database di post con cooked che contengono yourdomain/uploads/ ti darà un elenco di quei 19 post menzionati nello stato della migrazione. Nel peggiore dei casi, potresti quindi esaminarli manualmente e confrontare eventuali upload con ciò che è in S3.

Qualcosa come:

rails c
Post.where("cooked like '%discourse.example.com/uploads/%'")
1 Mi Piace

Ciao @Simon_Manning

Ho provato i tuoi suggerimenti, purtroppo senza successo nel trovare qualcosa di pertinente nei log degli errori. Vedo una voce come
Failed to optimize image: unknown reason ma non fornisce maggiori informazioni di quanto dica.

Ho provato anche la tua query suggerita, ottengo un sacco di post come risultato ma visitando effettivamente quei post, contengono un sacco di miniature dalle anteprime di onebox. quando provo ad aprire l’immagine in una nuova scheda su quelle miniature, queste sembrano caricarsi dalla CDN.

Mi aspetterei di vedere qualcosa del genere per 18 di quei 19 post, forse anche tutti e 19 se l’unico caricamento fallito dovesse trovarsi in un post con caricamenti multipli.

Forse sarebbe più facile estrarre tutti i nomi dei file dal risultato della query (ad esempio, f8a2d9381889b8693db2777acac566bd7b134fa5.png) e cercarli in S3. In teoria, ne dovrebbe mancare esattamente uno. Ignora i derivati, cerca solo quelli con /originals/ nel percorso.

Un po’ noioso ma non dovrebbe richiedere molto tempo se quella query ha selezionato solo quei 19 post.

2 Mi Piace

Quindi ho trovato il colpevole, come procedo?

Ciò che mi sembra logico potrebbe non essere la migliore soluzione
Ecco le opzioni che vedo:

  1. Rimuovere il riferimento al file dal post incriminato
  2. Eliminare il file dal server
  3. Riprogrammare il collegamento del file a qualcosa di generico

o forse sto pensando completamente in modo errato?

Se non c’è una soluzione ovvia per caricarlo correttamente, una delle opzioni 1 o 3 sembra una buona scelta. La 2 la lascerei probabilmente a Discourse, in particolare al lavoro di pulizia dei caricamenti orfani, il cui intervallo è controllato dall’impostazione clean orphan uploads grace period hours.

Potrebbe essere una buona idea recuperare il file prima che venga eliminato. Se non contiene dati sensibili, potrebbe essere utile per testare il motivo per cui non può essere caricato durante la migrazione.

Qualcos’altro che potresti provare dopo aver rimosso il file e completato la migrazione (e aver scaricato il file che non è riuscito) è modificare nuovamente il post per reinserire il file. Sarebbe interessante sapere se non riesce a caricare su S3 del tutto o solo durante l’attività di migrazione.

Ho ricevuto lo stesso errore, su 64 post. Impossibile trovarli su 80.000 file…

Cosa succederebbe se eliminassi i file locali (la maggior parte sono già stati migrati)?

Confermo che i file sono migrati, ma ho riscontrato lo stesso errore.

Qualche suggerimento? I caricamenti sono su s3 e funzionano bene, ma l’attività: migra su s3 fallisce.

Se ti va bene perdere quei 64 file, quello che ho fatto quando questo stesso rake task continuava a fallire è stato modificarlo, facendolo fallire solo se ci sono 100 errori invece di 1.

Andrebbe bene anche per me.
Cosa dovrei fare per modificare la task?

Puoi prima provare a eseguirlo con: SKIP_FAILED=1 rake uploads:migrate_to_s3.

Se non funziona, modifica questa riga qui e riprova

Provato con SKIP_FAILED=100 rake uploads:migrate_to_s3

=> 0 file

  • Elenco file S3
    … .. => 81070 file
  • Sincronizzazione file su S3

Aggiornamento degli URL nel database…
Rimozione delle vecchie immagini ottimizzate…
Segnalazione di tutti i post contenenti lightbox per il rebake…
54453 post sono stati segnalati per un rebake
53 post non sono stati rimappati al nuovo URL di caricamento S3. La migrazione S3 è fallita per il db ‘default’.

Non ho capito come inserire il file modificato nel mio script discourse

Potrei aver capito male, ma penso che tu debba eseguire SKIP_FAILED=1 per attivare SKIP_FAILED, piuttosto che assegnargli un valore.

1 Mi Piace

Provato con questo comando. … stesso
Risultato

Ah, è un peccato. C’è l’altro suggerimento di @Falco di modificare il rake task, ma sfortunatamente non so come farlo e non riesco a trovare istruzioni quando cerco. :slightly_smiling_face:

Speriamo che qualcun altro possa aiutare? :crossed_fingers:

1 Mi Piace

Sono riuscito a creare il mio script.rb nella mia cartella /shared ma non riesco ad eseguirlo.

Altri suggerimenti? @vulkanino Ho notato che avevi un problema simile