Estaba migrando nuestra instancia de Discourse de un servidor a otro, y me encontré con un problema interesante…
Usamos S3 para almacenar cargas del foro. Las habilitamos hace varios años, por lo que no es algo que introdujimos en esta migración.
Después de solucionar un par de problemas más, pude importar la copia de seguridad. Pero falló en un paso relacionado con S3 con lo siguiente:
Actualizando las URLs en la base de datos...
Eliminando imágenes optimizadas antiguas...
Marcando todas las publicaciones que contienen lightboxes para volver a procesar...
72038 publicaciones fueron marcadas para volver a procesar
EXCEPCIÓN: 257 publicaciones no se remapean a la nueva URL de carga de S3. La migración de S3 falló para la base de datos 'default'.
Después de investigar un poco, pude rastrear el problema hasta esta línea:
Luego, fui a la consola de rails y pude replicar las consultas con lo siguiente:
discourse(prod)> SiteSetting.cdn_path("/uploads/#{@current_db}/original").sub(/https?:/, "")
=> "/uploads//original"
discourse(prod)> RailsMultisite::ConnectionManagement.current_db
=> "default"
discourse(prod)> cdn_path = SiteSetting.cdn_path("/uploads/default/original").sub(/https?:/, "")
=> "/uploads/default/original"
discourse(prod)> Post.where("cooked LIKE '%#{cdn_path}%'")
=> ...
Luego, fui a esas publicaciones en particular, y eran parte de los Informes de Rendimiento (la captura de pantalla es de después de ejecutar un script de buscar y reemplazar):
Aparentemente, esa verificación recupera cualquier publicación que contenga /uploads/default/original en el campo cooked, a pesar de que podría no ser un activo legítimo. En este caso, /uploads/default/original se usó como “texto plano”, por lo que no se perdió durante el trabajo de migración.
¿No estoy seguro si esto es esperado?
¡Gracias!
