Come posso recuperare gli avatar mancanti?

Abbiamo riscontrato un problema simile a questo #bug:

https://meta.discourse.org/t/missing-user-profile-pictures/93844

C’è qualche modo per recuperare le immagini profilo mancanti?

P.S.: Ho provato a seguire questa guida ed eseguito rake avatars:refresh, ma non è successo nulla.

Questo problema è come un virus e si sta diffondendo a più avatar! Una strana osservazione è stata questa:

in Firefox alcuni avatar vengono mostrati, mentre mancano in Chrome. Questo non significa che in Firefox non manchino avatar. Ci sono anche avatar mancanti in Firefox!

Snapshot di Firefox

Snapshot di Chrome

Questo bug è stato davvero risolto?

Ho riscontrato lo stesso problema e lo sto attualmente investigando. Nel caso che sto esaminando, è collegato all’archiviazione esterna.

@Pad_Pors, stai ancora riscontrando questo problema? Inoltre, hai o hai avuto file caricati archiviati su S3?

Bene sapere che un esperto lo sta indagando :ok_hand:

Sì, stiamo ancora affrontando questo problema e sì, in passato avevamo i caricamenti archiviati su S3, ma non più.

Lo stesso per noi, @angus, abbiamo S3. Facci sapere se ti servono alcuni log o altro. Grazie mille.

Nel caso che sto esaminando, le immagini degli avatar mancanti sono state spostate nella cartella tombstone in S3 dopo un aggiornamento da riga di comando e un aggiornamento manuale di PostgreSQL da 10 a 12. Non sono ancora sicuro del motivo esatto.

Individuare i file caricati

@Jeremie_Leroy @Pad_Pors Se volete verificare se vale lo stesso nel vostro caso, il metodo che ho utilizzato per cercare gli avatar mancanti nella mia cartella tombstone di S3 è il seguente:

  1. Ho ottenuto lo SHA1 (la stringa di 16 caratteri nell’URL di caricamento) di un avatar che sapevo essere danneggiato dopo la migrazione. L’ho fatto prendendo l’ID di caricamento dall’URL dell’avatar danneggiato (è la prima parte del nome del file, ad esempio per 6254_2.png l’ID è 6254), e poi utilizzando tale ID per cercare lo SHA1 del caricamento nel dump recente del database. Se non vi sentite a vostro agio con la riga di comando, potete visualizzare i dati del dump utilizzando un’interfaccia grafica PostgreSQL come Postico 2.

  2. Ho eseguito una ricerca per lo SHA1 nella cartella tombstone del bucket S3 pertinente utilizzando l’AWS CLI.

    aws s3api list-objects --bucket <bucket_name> --query "Contents[?contains(Key, <sha1>)]" --prefix "tombstone"
    

    (dovete sostituire <bucket_name> e <sha1>)

Se funziona, otterrete un elenco di risultati simile a questo:

{
  "Key": "tombstone/original/2X/d/d7b553ff276fca054c7090e859ef5339fd1f936e.jpg",
  "LastModified": "2020-05-16T11:45:03+00:00",
  "ETag": ## stringa di lettere e numeri,
  "Size": 64580,
  "StorageClass": "STANDARD",
  "Owner": {
     "ID": ## stringa di lettere e numeri
   }
}

Nota: il 16/05 è la data in cui ho eseguito l’aggiornamento. Tutti gli avatar erroneamente spostati in tombstone hanno timestamp di quel periodo. Sospetto che il problema si sia manifestato con ritardo in produzione e in modo intermittente a causa della cache.

Recupero

Per quanto ne so, UploadRecovery (e il relativo task rake) è specifico per i caricamenti dei post e non gestisce gli avatar spostati in tombstone.

Sto attualmente valutando di aggiungere (patchare) un nuovo metodo a UploadRecovery che utilizzi recover_from_s3 per recuperare i caricamenti degli avatar.

Se qualcuno conosce un modo più semplice per recuperare avatar spostati erroneamente in tombstone su S3, sono tutto orecchi.

@tgxworld hai idee?

Questa situazione è complicata per me. Ci sono altre persone nella nostra stessa situazione? Ne varrà la pena lavorare su un aggiornamento? @sam @codinghorror

Grazie @angus per aver condiviso il percorso di verifica, ma non stiamo più utilizzando AWS né S3; anzi, se non erro, il problema è iniziato dopo la migrazione da AWS.

Sarei felice se il problema venisse risolto, ma al momento per me è molto più semplice chiedere a quei pochi utenti di ricaricare i propri avatar, sperando che il problema non si estenda ai nuovi utenti!

Ho risolto con successo questo problema sul sito che gestisco utilizzando una versione adattata della stessa logica che recupera le immagini erroneamente segnate come cancellate nei post: discourse/lib/upload_recovery.rb at main · discourse/discourse · GitHub.

@Jeremie_Leroy Una parte del motivo per cui ho pubblicato i passaggi sopra è che ci sono varie possibili cause per gli avatar mancanti. Per sapere se questo funzionerà per te, devi prima confermare che ci siano avatar erroneamente segnati come cancellati, ovvero capire qual è la causa del problema nel tuo caso.

Capisco anche che eseguire tale analisi sia molto difficile se non hai familiarità con gli aspetti tecnici di Discourse. Ho inserito la soluzione che ho utilizzato in un plugin che puoi provare sul tuo sito. Vedi le istruzioni di seguito.

@Pad_Pors Se ti va bene chiedere semplicemente alle persone di ricaricare gli avatar, ti consiglio di farlo e non tentare questa correzione.


Istruzioni

Si prega di notare che questa è una correzione per gli avatar mancanti quando:

  • I caricamenti sono archiviati su S3
  • Gli avatar mancano perché sono stati erroneamente segnati come cancellati
  • Il record di caricamento dell’avatar esiste ancora

Esegui questa operazione in un momento di bassa attività sul tuo forum e fai prima un backup completo.

Installa questo plugin

Il plugin aggiunge recover_avatars a UploadRecovery e utilizza una versione adattata dello stesso metodo di ripristino usato dal metodo principale recover per recuperare i caricamenti mancanti nei post.

Questo manterrà una copia degli avatar “recuperati” nella cartella dei file cancellati per ridondanza. Queste copie verranno rimosse dal processo in background purge_deleted_uploads, che viene eseguito secondo il periodo impostato dalla configurazione del sito purge_deleted_uploads_grace_period_days.

Accedi alla console Rails

Per utilizzare il metodo, devi prima accedere al tuo server via SSH, entrare nell’istanza Docker e avviare una console Rails:

./launcher enter app
rails c

Esegui una prova

Per vedere quali caricamenti il metodo cercherà di recuperare dalla cartella dei file cancellati, esegui prima una prova:

UploadRecovery.new(dry_run: true, stop_on_error: false).recover_avatars

Questo ti fornirà un elenco di nomi utente e collegamenti ai file su S3. Questi sono i file avatar che il metodo tenterà di spostare fuori dalla cartella dei file cancellati durante un’esecuzione reale:

Esempio di output

user1 tombstone/original/2X/b/bc84397936074854226f1c6e9016099b7fc0aca7.jpeg
user2 tombstone/original/2X/b/b8588e7e45804406f2cbe86f2362c2ccf7f13155.jpg
user3 tombstone/original/2X/8/81a4e3b70cdc35e8f61bca87d276d0253152804a.jpeg

Confronta questo elenco con gli utenti privi di avatar sul tuo sito.

Esegui l’operazione reale

Cambia dry_run in false per eseguire l’operazione reale:

UploadRecovery.new(dry_run: false, stop_on_error: false).recover_avatars

Verifica

Una volta completato il processo, controlla il tuo sito live in una nuova finestra di navigazione in incognito (per evitare problemi di cache). Una volta finito, assicurati di chiudere la connessione SSH attiva al tuo server. Non vuoi entrare per errore nel comando sbagliato nella console Rails aperta.