Cambiando el bucket s3 para subidas

¡Hola!

Estamos migrando todas nuestras subidas/imágenes entre dos servicios compatibles con S3 diferentes (ambos son DigitalOcean Spaces, si eso importa) y he decidido que nos hemos quedado en un estado bastante malo.

Para empezar, explicaré cómo se realizó la migración:

  1. Clonamos/sincronizamos el bucket inicial al nuevo bucket con rclone.
  2. Actualizamos todas las referencias en la página Files de la administración de Discourse a los nuevos endpoints.
  3. Ejecutamos un re-bake.

Lamentablemente, esto no hizo lo que queríamos, y ahora todas las imágenes han “desaparecido” del foro. Siguen estando en el bucket de S3 (y afortunadamente también en el antiguo), pero ninguna publicación puede encontrar su imagen correspondiente.

El tamaño del bucket es de aproximadamente 60 GB, por lo que es (aunque no extremo) una cantidad bastante grande de datos.

He reconstruido el contenedor, he intentado recuperar cosas desde el tombstone, he hecho prácticamente todo lo que se me ocurre o puedo encontrar en el foro de soporte o en las tareas rake.
También he intentado con un reemplazo de base de datos (vía discourse remap).

Cada imagen se ve básicamente así en el contenido horneado en este momento:

<img src="https://xxxx.xxxxx.xx/images/transparent.png" alt="image" data-orig-src="upload://h8UudilPhVsGnNmvlJ5lQYEr8PT.jpeg" width="375" height="500">

Lo que me hace pensar que el b64-sha del enlace está roto o que el sha de la imagen ha cambiado por alguna razón.

¿Alguien ha hecho esto antes? ¿Están todas las imágenes perdidas para siempre? (sí, sí, tengo una copia de seguridad y las imágenes antiguas, así que sé que hay una manera).

2 Me gusta

Podría valer la pena mencionar que también he intentado usar el URI de CDN proporcionado para el bucket de espacios (con una rebake).

1 me gusta

Salida de las subidas faltantes:

rake posts:missing_uploads
Buscando subidas faltantes en: default
Corrigiendo subidas faltantes:
🚫
Faltan 17075 subidas de publicaciones.

Faltan 16906 subidas.
1 de 16906 es una subida del esquema antiguo.
14646 de 139801 publicaciones se ven afectadas.

Las post_uploads tienen 3448 entradas
Las optimized_images tienen 25681 entradas
Las uploads tienen 5764 entradas

1 me gusta

Puedes ver Moving from one S3 bucket to another

Creo que tengo un borrador de cómo hacerlo que intentaré publicar mañana.

5 Me gusta

Eso sería muy útil, ¡muchas gracias!

1 me gusta

¡Hola @Jite!

Prueba si esto te funciona. Si es así, procederé a crear un howto adecuado.

Buckets antiguos

Esto asume que puedes instalar y configurar una herramienta para mover tus datos desde tu bucket antiguo a una máquina local y luego hacer lo mismo desde lo local hacia el nuevo bucket. Consulta aws cli sync (que puede configurarse para buckets que no sean de AWS) y gsutil rsync para obtener más información. Si tienes grandes cantidades de datos o estás moviendo entre buckets del mismo proveedor, podrías investigar métodos que muevan los datos directamente entre buckets.

Accede a un directorio adecuado como espacio temporal (por ejemplo, mkdir temp-bucket; cd temp-bucket) antes de realizar algo como lo siguiente. Estos ejemplos incluyen los interruptores -n y --dry-run para mostrarte qué ocurrirá. Si eso parece lo que deseas, ejecuta el comando nuevamente sin ese interruptor.

Mover datos antiguos desde el bucket antiguo a lo local

    gsutil  rsync -r -n  gs://=OLD= .

o

    aws s3 sync s3://=OLD= .

Mover datos desde lo local al nuevo bucket

    gsutil rsync -r -n . gs://=NEW=

o

    aws s3 sync . s3://=NEW=

Actualizar la base de datos para usar el nuevo bucket

Ejecutarás estos comandos en la consola de Rails. Para acceder a ella, realiza lo siguiente:

cd /var/discourse
./launcher enter app
rails c

Para el nuevo bucket, sube una imagen con la nueva configuración y haz esto:

Upload.last.url

Deberías ver algo como:

=> "//discourse-bucket.s3.dualstack.us-east-2.amazonaws.com/original/2X/7/12345fbea574afc4e02db80107e6682430aede2c.png"

Luego obtendrás discourse-bucket.s3.dualstack.us-east-2.amazonaws.com para el nuevo bucket. Obtén el nombre de host del bucket antiguo de manera similar a partir de lo anterior.

Usa esto para verificar que tus subidas estén donde crees que están:

Upload.order(Arel.sql('RANDOM()')).limit(10).pluck(:id, :url)

Ahora, actualizarás la base de datos para usar el nuevo bucket en lugar del antiguo. DbHelper.remap reemplazará las ocurrencias en todas las tablas.

DbHelper.remap("//=OLDHOST=/","//=NEWHOST=/")

Moverse a AWS podría requerir limpiar tu s3_endpoint.

NOTA: Si tienes un s3_endpoint definido en tus SiteSettings en la base de datos y cambias a AWS (donde no se necesita ningún endpoint), entonces deberás limpiar esa configuración del sitio después de construir el nuevo contenedor con la configuración actualizada (o después de restaurar una base de datos que lo tenga configurado).

Recocinar publicaciones que hacen referencia al bucket en lugar del CDN de S3

Si tienes publicaciones que enlazan directamente al nuevo bucket de s3 (quizás no tenías definido un s3_cdn_url antes), aquí te mostramos cómo recocinar solo las publicaciones que lo necesiten.

Obtén las publicaciones:

  posts=Post.where("cooked like '%=NEWHOST=%'")

Consulta cuántas hay:

  posts.count

Recocina esas publicaciones:

  posts.each do |p| p.rebake! end

O simplemente reemplaza el bucket con el CDN:

posts.each do |p|
  p.cooked.gsub!(/=NEWHOST=/,"=CDN=")
  p.save!
end

8 Me gusta

Gracias por la respuesta.

Básicamente hice lo mismo que la última vez, pero lo intenté de nuevo. El problema es que posts.count devuelve 0. Todas las publicaciones tienen el archivo transparent.png en el contenido cocinado y contienen un hash en el contenido sin cocinar. ¿Hay alguna forma de que se resuelva la imagen correctamente durante el horneado?

1 me gusta

Hmm. Claro. Ese cambio improvisado solo sirve para evitar la recreación. Si la recreación no funciona, entonces hay algo más mal. ¿Quizás los activos no están donde Discourse cree?

1 me gusta

Bueno, es posible, pero el “movimiento” fue básicamente una transferencia 1:1 de todos los archivos en el bucket, jeje…

2 Me gusta

¿Así que puedes reemplazar la URL antigua del bucket por la nueva y funciona?

¿Los valores en “Uploads” se ven correctos?

1 me gusta

Tengo un poco de miedo de que volver al bucket antiguo pueda iniciar un trabajo para mover todo a “tombstone” por considerarse “antiguos” ahora, pero sí, la base de datos parece apuntar a las imágenes correctas (nueva ubicación); básicamente son solo las publicaciones antiguas las que no se resuelven a la imagen correcta (supongo…).

1 me gusta

Después de ejecutar la tarea rake de recuperación de tumbas y luego la tarea rake de reparación de archivos adjuntos faltantes, finalmente logré que comenzara a “reparar” las imágenes.
Parece que las está descargando y volviéndolas a subir, lo cual lleva muchísimo tiempo y consume muchos recursos, pero al menos los usuarios recuperarán sus imágenes.

¡Gracias por la ayuda, @pfaffman! :slight_smile:

3 Me gusta

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.