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?
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/%'")
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.
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.
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.
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
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.