ToS3MigrationError: las cargas no se migraron a S3, lo que provoca archivos adjuntos rotos. ¿Cómo solucionar este error?

FileStore::ToS3MigrationError: 182 de 21512 cargas no se han migrado a S3. La migración a S3 falló para la base de datos ‘default’.

luego un seguimiento de pila desde ‘raise_or_log’, ‘migration_successful?’, ‘migrate_to_s3’, ‘migrate’, ‘block in migrate_to_s3_all_sites’

Encontré estos errores dos veces al ejecutar la tarea uploads:migrate_to_s3. Aproximadamente el 1% de los archivos no se migraron correctamente, lo que provocó que los archivos adjuntos del sitio quedaran rotos después de un rebake. Todos parecen ser archivos antiguos de los primeros meses cuando creé esta instancia de Discourse.

Al investigar el bucket de S3, los archivos parecen haberse cargado correctamente en S3, simplemente no están enlazados correctamente después del rebake.


Volver a ejecutar la migración (antes de otro rebake) parece haber solucionado el problema por alguna razón. El mismo error sigue ocurriendo durante la tarea migrate_to_s3.

Sin embargo, si ejecuto rebake nuevamente, los enlaces de los archivos adjuntos se rompen de nuevo.

No creo que estos sean errores, pero incluiré la salida durante el rebake:

/var/www/discourse/lib/file_store/base_store.rb:6: warning: ya se inicializó la constante FileStore::BaseStore::UPLOAD_PATH_REGEX
/var/www/discourse/lib/file_store/base_store.rb:6: warning: la definición previa de UPLOAD_PATH_REGEX estaba aquí
/var/www/discourse/lib/file_store/base_store.rb:7: warning: ya se inicializó la constante FileStore::BaseStore::OPTIMIZED_IMAGE_PATH_REGEX
/var/www/discourse/lib/file_store/base_store.rb:7: warning: la definición previa de OPTIMIZED_IMAGE_PATH_REGEX estaba aquí

Ejecutar rake posts:missing_uploads o PostCustomField.where(name: Post::MISSING_UPLOADS) no muestra ningún problema, por lo que esto parece no estar relacionado.

Mi problema podría estar relacionado con este tema: Migrate_to_S3 Fails on Rebake - #12 by evenif

Voy a ver qué aprendo y podría cerrar esto y mover la conversación allí.

Los archivos adjuntos o cargas antiguas y rotos aparecen como [{nombre del archivo}|attachment](/uploads/default/original/2X/6/{hash sha1 + extensión}) en el texto sin procesar de la publicación. Esto se procesa como href="/uploads/default/original/2X/6/{hash sha1 + extensión}", lo que rompe los archivos adjuntos, pero no las imágenes.

Los archivos adjuntos que funcionan posteriormente aparecen como [{nombre del archivo}|attachment](upload://{sha1 a base62 + extensión}) y se procesan como href="/uploads/short-url/{sha1 a base62 + extensión}".

Escribí un pequeño código en Ruby para recorrer todas las publicaciones del período problemático conocido y reemplazar todas las URLs de carga antiguas con la versión más reciente. Utilicé la función base62_sha1 del modelo Upload para convertir el hash sha1 al nombre de archivo esperado que las URLs cortas de Discourse requieren.

Esto hizo que los archivos adjuntos funcionaran. Luego ejecuté otro rebake solo para confirmar la corrección y parece que sigue funcionando. Parece que el problema residía únicamente en Post.raw y no tenía nada que ver con Upload.