El comando rails rebake o la tarea rake no funcionan, pero reconstruir el HTML sí. ¿Por qué?

Hola

Estoy intentando reparar publicaciones con imágenes rotas, importadas y que contienen BBcode.

Las imágenes aparecen en las vistas previas del editor, pero el contenido final de la publicación contiene imágenes rotas:

Después de usar la función “rebuild HTML” en algunas publicaciones y ver que reparó la publicación en mi foro de producción, volví a hornear todas mis publicaciones usando la tarea rake.

Me sorprendió ver que las publicaciones con la imagen rota NO se repararon.

Así que experimenté con un rebake en una publicación específica en mi foro de prueba (mismo backup; mismos datos) tanto con el comando rails como con la tarea rake, y este es el comportamiento:

  • Las imágenes aparecen por un segundo, pero la publicación vuelve rápidamente a su estado inicial con imágenes rotas.

Sin embargo, si uso la función “rebuild HTML”, funciona perfectamente, y las imágenes no vuelven a estar rotas. Incluso se cargan correctamente en el servidor después de unos minutos.

Entonces, ¿alguien puede explicar este fenómeno? ¿Por qué el rebake desde rails o una tarea rake tiene este comportamiento, y cuáles son las diferencias entre reconstruir HTML y un rebake desde la línea de comandos?

Capturas de video:

  1. desde la consola de rails:

  2. desde la tarea rake:

Estoy muy intrigado (y todavía intentando reparar mis imágenes en todas mis publicaciones en lote).


Un ejemplo donde usé Rebuild HTML que muestra que las imágenes incrustadas de esta publicación se mostraron correctamente y se cargaron automáticamente en el servidor (obviamente, su enlace original, que lleva a casimages, todavía está aquí, pero este es el comportamiento esperado), hace días: Frensh Vw Bus CHERIZET 2019 SK - #13 par buggyderby - Vos sorties - VW Camper

4 Me gusta

Creo que la tarea de rake los marca para volver a hornear y también activa la reconstrucción de miniaturas. ¿Has comprobado sidekiq para ver si hay cosas en cola?

3 Me gusta

editar:

Una tarea de rake rebake en la publicación activa PullHotLinkedImages en 4 minutos y también aumenta instantáneamente la cantidad de tareas procesadas en uno, pero no pude ver nada agregado a la pestaña de cola.

Las pocas publicaciones en las que realicé una reconstrucción manual de HTML han mostrado sus imágenes perfectamente durante días (también se descargan en mi servidor).

4 Me gusta

<s<Me temo que no sé por qué funciona de manera diferente desde la herramienta de administración en comparación con la consola, pero encontré este tema con un problema similar y lo solucionaron rebakeando usando la API:
https://meta.discourse.org/t/some-linked-images-not-displaying-show-as-broken/142177/7

<s<No estoy seguro de si eso es de alguna utilidad, pero pensé en compartirlo.:slightly_smiling_face:
<s
Editar: Debería haber leído una publicación más. Al parecer, eso tampoco es confiable. Lo siento, fue mi error. Falsa alarma.

3 Me gusta

10 publicaciones se dividieron en un nuevo tema: No se pueden extraer imágenes enlazadas en caliente para algunos dominios

Además de Jay, que tuvo una idea de una posible diferencia entre la reconstrucción/reconstrucción de HTML de rake/rails y la reconstrucción, ¿alguien tiene otra idea?

Una respuesta oficial sobre la(s) diferencia(s) entre estas tareas sería bienvenida :slight_smile:

Si no podemos resolverlo, comenzaré con la forma de la API para “reconstruir HTML” de mis 40000 publicaciones que contienen posibles problemas con las imágenes… Y espero que funcione para mí :confused: :person_shrugging:

¿O hay alguna otra forma de “reconstruir HTML” usando rails, tal vez? :thinking:

Reconstruir HTML: post.rebake!(invalidate_oneboxes: true, invalidate_broken_images: true)

Rake posts:rebake: post.rebake!(**opts) donde opts es generalmente vacío
Para los Oneboxes puedes probar la tarea posts:refresh_oneboxes y para las imágenes rotas puedes probar la tarea posts:invalidate_broken_images. Esta última podría ser la solución a tu problema.

8 Me gusta

¡Después de probar en algunas publicaciones, parece que funciona de maravilla!
¡Lo probaré en miles de publicaciones y veré cómo va! ¡Muchas gracias!

5 Me gusta

Así que, aquí estoy:

Después de intentar hacer un post.rebake!(invalidate_broken_images: true) en mis 40000 publicaciones que contienen la cadena [img], funcionó para muchas imágenes… Pero lejos de todas, a pesar de estar alojadas en el mismo servicio de alojamiento de imágenes externo.
Por ejemplo, tengo miles de enlaces de “casimages” que funcionan (que enlazan a imágenes válidas y muestran imágenes en la vista previa del editor al editar), rotos en la versión procesada de las publicaciones, que se mostraron y cargaron correctamente en el servidor gracias a mi script, pero también tengo muchas otras en las que simplemente no funcionó, y no sé por qué.

Post.where('raw LIKE ?', '%[img]%').find_each do |p|
    p.rebake!(invalidate_broken_images: true)
end

También tengo enlaces de imágenes de otros alojamientos de imágenes que se cargaron, y algunos en los que no funcionó.
No pude ver ninguna diferencia entre estas publicaciones y los enlaces de imágenes. Todas tenían imágenes que funcionaban, y el hecho de que usaran el mismo alojamiento de imágenes me desconcertó.
Intenté la operación varias veces y los resultados fueron inconsistentes, independientemente de los servicios de alojamiento externos… Algunas imágenes se cargaron, otras no. Parecía aleatorio.
Me recuerda un poco al problema que encontró @Amethi: Some linked images not displaying/show as broken - #8 by Amethi donde solo funcionó en algunas imágenes sin ninguna explicación.


:information_source: Aquí solo hablaré de casimages, aunque mi foro importado utilizaba varios otros alojadores de imágenes.

Así que, pensé que quizás casimages bloqueó temporalmente mi IP si intentaba recuperar demasiadas imágenes de sus servidores. Eso podría explicar tanto el hecho de que no funcionara para todas las imágenes como la aleatoriedad del éxito de la carga de las imágenes desde mi servidor.
Incluso hubo casos en los que la opción Rebuild HTML funcionó -al principio solamente-, las imágenes se mostraban en lugar de mostrar un icono de imagen rota, aunque todavía estaban alojadas en su servicio de alojamiento externo, pero cuando se activó la tarea de Sidekiq “pull external image” se rompieron las imágenes.
Lo mismo al usar scripts de Rails con rebake!(invalidate_broken_images: true)
:weary:

Así que, actualmente estoy probando un enfoque más lento, donde espero 5 segundos entre cada uno de mis comandos de Rails rebake!:

total = Post.where('lower(raw) LIKE ?', '%[img]https:%').count
i = 0
Post.where('raw LIKE ?', '%[img]https:%').find_each do |p|
    p.rebake!(invalidate_broken_images: true)
    print "#{i}/#{total}"
    print "\r"
    i +=1
    sleep(5)
end

Veré en ~60 horas si ha mejorado…

Me gustaría entender los fundamentos de mi problema aquí y por qué un rebake “normal” no puede cargar una imagen en el servidor (si no estoy temporalmente bloqueado por casimages).

Tenga en cuenta que esta vez, el certificado del servidor de casimages parece estar bien :smile:

Tampoco entiendo qué hace realmente invalidate_broken_images. No estoy muy familiarizado con el código de Discourse.

Miré el código para ver la ocurrencia de invalidate_broken_images y vi estos archivos:

¿Por qué busca específicamente la cadena <img>? Mis publicaciones provienen de una importación de phpBB y la versión sin procesar solo contiene el bbCode [img], no etiquetas <img>; entonces, ¿cómo podría tener un efecto (y lo tuvo, ver mi mensaje anterior) en mis publicaciones? :thinking:

Tampoco entiendo realmente la diferencia entre estos dos métodos (?):

Parece indicar que rebake establece los argumentos predeterminados en false, y que rebake! establece el argumento predeterminado en true.

¿Cómo se relacionan estos dos (por cierto, conozco el propósito del carácter ! en Ruby), y por qué están en archivos diferentes?

Mi objetivo es solo entender por qué mis imágenes externas a veces se cargan y a veces no, y si puedo encontrar una forma fiable de cargarlas correctamente y automáticamente, incluso si implica cargar una imagen cada hora. :sweat_smile:
He estado casi dos semanas en esto y me está volviendo loco (y a las personas para las que migré su servidor). :woozy_face:

Además, no hay nada en el registro de Discourse, aparte de múltiples Sidekiq está consumiendo demasiada memoria (usando: 592.25M). Tenga en cuenta que estoy trabajando en Ubuntu a través de WSL en Windows 10, pero tengo la intención de usar una solución que funcione (si encuentro una…) en nuestro VPS.

1 me gusta

Está más abajo, donde se ve lo que hace en la línea 716. Elimina esas imágenes para que intente descargarlas de nuevo. (A primera vista, al menos)

1 me gusta

Gracias por esta explicación. :slight_smile:


Entonces, estoy casi en mis 55 horas de rebaking de mis publicaciones que contienen [img] con un retraso de 5 segundos entre cada iteración de mis 40000 publicaciones de mi script de rails.

Por lo que veo, funciona mucho mejor que antes. La mayoría de las imágenes válidas (excluyo Imageshack y su comportamiento errático) parecen cargarse en mi foro sin problemas a primera vista, pero echaré un vistazo más de cerca para estar 100% seguro. Lo que es 100% seguro es que los resultados son mucho, mucho mejores y más consistentes.

Así que sospecho que el problema que encontré (y tal vez el problema de @Amethi) que fue la aleatoriedad en la descarga de imágenes remotas con invalidate_broken_images estaba relacionado con una especie de límite de tasa de varios proveedores de alojamiento de imágenes…?:thinking: Lo extraño es que no noté ningún problema con mis otros foros importados… :face_with_raised_eyebrow:


Dicho esto, si los resultados son lo suficientemente satisfactorios y el retraso realmente mejora la descarga de imágenes remotas, haré el mismo método en mi foro de producción, pero aumentaré el tiempo entre cada publicación rebakeada de 5 segundos a 10 o 15 segundos (o incluso más, no tenemos prisa, todas estas son publicaciones bastante antiguas y el VPS tiene especificaciones mucho más bajas que mi propia computadora).

No quiero ser concluyente demasiado rápido, pero la solución a mi problema inicial podría ser aplicar tanto la solución propuesta por Richard COMO agregar un retraso entre cada rebake de publicación.

3 Me gusta

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