¿Cómo controlar este lío de cargas cambiantes de S3 a local?

Después de 4-5 años de uso, finalmente decidí recuperar mis cargas del bucket de Aws S3 a mi servidor local para mi sitio web local muy pequeño.
Yo, al ser una persona con conocimientos limitados, le encargué este trabajo a un amigo mío por una cantidad muy razonable. Él configuró el sitio para cargas locales, pero de alguna manera casi la mitad de las 3000 imágenes, alrededor del 50%, se rompieron desde su origen. Mi amigo no me cobró nada y me pidió que revirtiera el sitio a la copia de seguridad (que se creó antes de entregarle el control el 11 de abril de 2025).

De todos modos, me volví perezoso durante aproximadamente un mes y no revertí. Hasta que decidí arreglar las cosas con la ayuda del bot de ayuda de discourse/ChatGpt Ai Bot. Y creé otra versión de mi antiguo sitio web en mi portátil Ubuntu localmente.

Logré crear una instancia de mi sitio web original en mi portátil simplemente usando una “t.” delante de mi nombre de dominio original. Ahora este (llamado sitio de staging) me funciona perfectamente, pero solo tiene actividad hasta el 11/04/2025.

Y mi sitio web de producción, que tiene todos los datos actualizados, pero le faltan cientos de imágenes en muchas de sus publicaciones.

Ten en cuenta que probé muchas tareas de rake para la migración o para reconectar la conexión faltante a las imágenes, sin ningún éxito.

Después de darle vueltas durante casi un mes. Mi conclusión es esta. Que las publicaciones “raw” en ruby son las mismas en staging y en producción.
Pero las publicaciones “cooked” se vuelven diferentes. Es decir, la tabla de la base de datos de mi sitio web de producción quizás carece de alguna conexión con las imágenes físicas reales que se encuentran en el servidor.

También he notado que sin esa conexión, esas imágenes “huérfanas” se eliminan automáticamente del servidor. Pero afortunadamente, las vuelvo a sincronizar desde staging o desde mi bucket de S3 a mi servidor de producción.

Finalmente el problema, en palabras de, más o menos, ChatGpt, es que el servidor de staging tiene las versiones “cooked” finales, que no tienen ninguna relación con las URLs “raw” (cortas). Y la producción, a la que le faltan las URLs de las versiones “cooked” finales a las imágenes, no puede obtener las URLs correctas de esas imágenes y recurre a marcadores de posición “transparentes”.

Y ChatGpt me sugiere copiar la versión “cooked” de las publicaciones de staging a la versión “cooked” de producción. Lo cual no me parece una muy buena idea.

Redacción exacta de ChatGPT sobre nuestra situación:

  • Tanto en staging como en producción, post.raw es idéntico y contiene referencias upload://....
  • En staging, las imágenes se muestran, pero al consultar Post.find(12849).uploads no se obtienen resultados, lo que significa que no hay entradas en las tablas uploads o post_uploads para estos archivos, ni siquiera en staging.
  • Por lo tanto, las imágenes se muestran en staging puramente porque el HTML cocido de antes de la migración contiene los enlaces completos /uploads/default/original/....
  • Pero dado que la producción se volvió a hornear después de la migración, el mismo contenido crudo ahora no se resuelve, recurriendo al marcador de posición transparent.png.

:white_check_mark: Los archivos de carga todavía existen en el disco

Todos los archivos de imagen (incluidos los de las cargas faltantes) todavía están presentes en /var/www/discourse/public/uploads/default/original/ tanto en staging como en producción. Pero Discourse ya no puede resolverlos ya que faltan sus entradas de uploads.

La forma fácil de hacerlo era, y puede que siga siéndolo, activar la configuración Enable hidden setting to include S3 uploads in the backups, hacer una copia de seguridad y luego restaurarla en un servidor que no tenga s3 configurado (lo haría en un servidor nuevo para evitar romper el antiguo si algo sale mal). Pero parece que el sitio de producción también está roto, así que eso probablemente no ayudará en absoluto.

Si has estropeado la tabla Uploads de modo que contenga varias rutas S3, el trabajo es mucho más difícil.

En lugar de ChatGPT, te recomiendo https://ask.discourse.com/, que al menos sabe de Discourse, pero probablemente tampoco será de mucha ayuda.

Miraría Uploads.pluck(:url) y vería qué hay.

3 Me gusta