Descripción general
Al utilizar S3 o Cloudflare R2 para las cargas junto con una URL de CDN personalizada, las cargas de emojis personalizados no respetan la configuración del CDN e intentan cargarse directamente desde la URL del bucket sin procesar.
El problema
Cuando un administrador carga un emoji personalizado, el cargador crea un registro de upload y guarda la URL del bucket sin procesar en la base de datos (por ejemplo, //my-bucket.s3.amazonaws.com/... o //my-bucket.r2.cloudflarestorage.com/...); este es el comportamiento estándar de Discourse.
Sin embargo, cuando app/models/emoji.rb genera la caché de emojis para /site.json, pasa la upload.url directamente al objeto emoji:
e.url = emoji.upload&.url
Dado que omite el helper del CDN, el frontend recibe la URL del bucket sin procesar. Por lo tanto, dependiendo de lo estrictas que sean las políticas de acceso del bucket, esto provoca que las imágenes no se muestren correctamente o obliga a Discourse a enrutar los emojis a través del avatar_proxy interno.
Solución
He abierto una PR que envuelve las asignaciones de URL en Discourse.store.cdn_url(), lo que hace que el cargador de emojis personalizados se alinee con la forma en que se enrutan las imágenes estándar de las publicaciones y los avatares.
Solución temporal
Mientras se espera a que la PR sea revisada y fusionada, he creado un componente de tema ligero que reemplaza la URL del bucket sin procesar por la URL correcta del CDN justo antes de que el emoji personalizado se represente en el DOM (funciona tanto para publicaciones como para chat).
Si estás experimentando este error en tu sitio, puedes instalar este componente y configurar tus cadenas de S3 en la configuración del administrador del tema para corregir cualquier emoji personalizado roto:
Nota: si ya has cargado emojis personalizados que actualmente están rotos, ejecutar discourse remap "//my-raw-bucket-url.com" "https://my-cdn.com" en el contenedor corregirá los antiguos en la base de datos, mientras que el componente del tema corregirá cualquier emoji cargado de nuevo hasta que la corrección de la PR se fusione en el núcleo.
