¿Cómo puedo recuperar avatares faltantes?

hemos encontrado un problema similar a este #bug:

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

¿Existe alguna forma de recuperar los avatares faltantes?

P.D.: Intenté usar esta guía y ejecuté rake avatars:refresh, pero no pasó nada.

Este problema es como un virus y se está extendiendo a más avatares. Una observación extraña fue esta:

En Firefox se muestran algunos avatares, mientras que faltan en Chrome. Esto no significa que en Firefox no falten avatares; ¡también hay avatares faltantes en Firefox!

Captura de Firefox

Captura de Chrome

¿Realmente se ha solucionado este error?

He encontrado el mismo problema y actualmente lo estoy investigando. En el caso que estoy investigando, está relacionado con el almacenamiento externo.

@Pad_Pors ¿Sigues experimentando este problema? Además, ¿tienes o tenías archivos subidos almacenados en S3?

Me alegra saber que un experto lo está investigando :ok_hand:

Sí, todavía estamos enfrentando este problema, y sí, antes teníamos las cargas almacenadas en S3, pero ya no.

Lo mismo para nosotros, @angus, tenemos S3. Avísanos si necesitas algunos registros u otra cosa. Muchas gracias.

En el caso que estoy revisando, las imágenes de avatar faltantes se movieron a la carpeta tombstone en S3 después de una actualización por línea de comandos y una actualización manual de PostgreSQL de la versión 10 a la 12. Todavía no estoy seguro de la razón exacta.

Localización de las subidas

@Jeremie_Leroy @Pad_Pors Si quieren verificar si ocurre lo mismo en su caso, la forma en que busqué los avatares faltantes en mi carpeta tombstone de S3 es la siguiente:

  1. Obtuve el SHA1 (la cadena de 16 caracteres en la URL de la subida) de una subida de avatar que sabía que estaba rota después de la migración. Lo hice tomando el ID de la subida del avatar roto en la URL (es la primera parte del nombre del archivo; por ejemplo, para 6254_2.png el ID es 6254) y luego usando ese ID para buscar el SHA1 de la subida en un volcado reciente de la base de datos. Si no se sienten cómodos con la línea de comandos, pueden visualizar sus datos en un volcado usando una interfaz gráfica de PostgreSQL como Postico 2.

  2. Realicé una búsqueda del SHA1 en la carpeta tombstone del bucket de S3 correspondiente usando la CLI de AWS.

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

    (deben cambiar <bucket_name> y <sha1>)

Si funciona, obtendrán una lista de resultados que se ve así:

{
  "Key": "tombstone/original/2X/d/d7b553ff276fca054c7090e859ef5339fd1f936e.jpg",
  "LastModified": "2020-05-16T11:45:03+00:00",
  "ETag": ## cadena de letras y números,
  "Size": 64580,
  "StorageClass": "STANDARD",
  "Owner": {
     "ID": ## cadena de letras y números
   }
}

Nota: el 16 de mayo fue cuando realicé la actualización. Todos los avatares marcados incorrectamente como tombstone tienen marcas de tiempo de alrededor de esa fecha. Sospecho que el problema tardó un tiempo en manifestarse en producción y lo hizo de forma intermitente debido a la caché.

Recuperación

Por lo que entiendo, UploadRecovery (y su tarea rake asociada) es específica para subidas de publicaciones y no maneja avatares marcados como tombstone.

Actualmente estoy considerando agregar (patchear) un nuevo método a UploadRecovery que utilice recover_from_s3 para recuperar las subidas de avatares.

Si alguien conoce una forma más sencilla de recuperar avatares marcados incorrectamente como tombstone en S3, estoy abierto a sugerencias.

@tgxworld ¿tienen alguna idea?

Esto es complicado para mí, ¿hay otras personas en nuestra situación, así que valdría la pena trabajar en una actualización? @sam @codinghorror

Gracias @angus por compartir la ruta de verificación, pero ya no estamos usando AWS ni S3. De hecho, si no recuerdo mal, el problema comenzó después de que migráramos desde AWS.

Me encantaría que el problema se resolviera, pero por el momento me resulta mucho más sencillo pedirle a esos pocos usuarios que vuelvan a subir sus avatares, y esperar que el problema no se extienda a nuevos usuarios.

He solucionado esto con éxito en el sitio que gestiono utilizando una versión adaptada de la misma lógica que recupera imágenes marcadas incorrectamente como eliminadas en las publicaciones: discourse/lib/upload_recovery.rb at main · discourse/discourse · GitHub.

@Jeremie_Leroy Una de las razones por las que publiqué esos pasos anteriormente es que hay varias causas posibles para los avatares faltantes. Para saber si esto funcionará para ti, primero debes confirmar que hay avatares marcados incorrectamente como eliminados, es decir, cuál es la causa del problema en tu caso.

También entiendo que realizar ese análisis es muy difícil si no estás familiarizado con los aspectos técnicos de Discourse. He convertido la solución que utilicé en un plugin que puedes probar en tu propio sitio. Consulta las instrucciones a continuación.

@Pad_Pors Si te parece bien pedirle a las personas que vuelvan a subir sus avatares, simplemente hazlo y no intentes esta solución.


Instrucciones

Ten en cuenta que esta es una solución para avatares faltantes cuando:

  • Las subidas se almacenan en S3
  • Los avatares faltan porque están marcados incorrectamente como eliminados
  • El registro de la subida del avatar aún existe

Realiza esto en un momento de baja actividad en tu foro y realiza una copia de seguridad completa primero.

Instala este plugin

El plugin agrega recover_avatars a UploadRecovery y utiliza una versión adaptada del mismo método de restauración que usa el método principal recover para recuperar subidas faltantes en las publicaciones.

Esto mantendrá una copia de los avatares “recuperados” en la carpeta de marcados como eliminados para redundancia. Estas copias serán eliminadas por el trabajo en segundo plano purge_deleted_uploads, que se ejecuta según el período establecido por la configuración del sitio purge_deleted_uploads_grace_period_days.

Abre la consola de Rails

Para usar el método, primero debes conectarte mediante SSH a tu servidor, entrar a la instancia de Docker y abrir una consola de Rails:

./launcher enter app
rails c

Realiza una prueba

Para ver qué subidas intentará recuperar el método de la carpeta de marcados como eliminados, primero realiza una prueba:

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

Esto te dará una lista de nombres de usuario y enlaces de archivos en S3. Estos son los archivos de avatar que el método intentará mover fuera de la carpeta de marcados como eliminados en una ejecución real:

Ejemplo de salida

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

Compara esto con los usuarios que tienen avatares faltantes en tu sitio.

Realiza una ejecución real

Cambia dry_run a false para realizar una ejecución real:

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

Verifica

Una vez que el trabajo se complete, revisa tu sitio en vivo en una ventana de incógnito nueva (para evitar problemas de caché). Una vez que termines, asegúrate de cerrar la conexión SSH activa a tu servidor. No quieres ingresar accidentalmente algo incorrecto en la consola de Rails abierta.