Локализация контента использует сырой URL R2-бакета вместо S3 CDN URL в переведённых постах

Здравствуйте,

При использовании локализации контента с переводом Discourse AI и Cloudflare R2 в качестве S3-совместимого хранилища, переведенный контент постов сохраняет исходный URL конечной точки R2-бакета вместо настроенного s3_cdn_url (домен по выбору). Изображения отображаются битыми для всех пользователей, просматривающих переводы.

Окружение

  • Discourse: последняя версия
  • Cloudflare R2 настроено через S3-совместимое хранилище
  • s3_cdn_url: https://files.mydomain.com
  • s3_use_cdn_url_for_all_uploads: включено
  • Локализация контента + перевод Discourse AI: включены

Шаги для воспроизведения

  1. Настройте Cloudflare R2 с пользовательским доменом (s3_cdn_url)
  2. Включите локализацию контента и перевод AI
  3. Создайте пост с изображением
  4. Дождитесь генерации локализованной версии переводами AI
  5. Переключите язык — изображения в переведенной версии будут битыми

Наблюдаемое поведение

Переведенный контент содержит URL вида:

//files.myendpoint.r2.cloudflarestorage.com/original/1X/, а не https://files.mydomain.com/original/1X/

Связанный баг: Chat thumbnails bypass s3_cdn_url & use raw S3 bucket URLs

Временное решение — выполнить перемapping или использовать этот tc:

import { apiInitializer } from "discourse/lib/api";

export default apiInitializer("1.8.0", (api) => {
  const badDomain = "files.myendpoint.r2.cloudflarestorage.com";
  const goodDomain = "files.mydomain.com";

  function fixImages() {
    document.querySelectorAll(`img[src*="${badDomain}"]`).forEach(img => {
      img.src = img.src.replace(badDomain, goodDomain);
    });
    document.querySelectorAll(`img[data-src*="${badDomain}"]`).forEach(img => {
      img.dataset.src = img.dataset.src.replace(badDomain, goodDomain);
    });
    document.querySelectorAll(`img[data-large-src*="${badDomain}"]`).forEach(img => {
      img.dataset.largeSrc = img.dataset.largeSrc.replace(badDomain, goodDomain);
    });
  }

  api.decorateCooked(() => fixImages(), { id: "fix-r2-translated-images" });
  api.onPageChange(() => fixImages());
});

я не так уверен в этом. у нас на сайте есть бакеты Cloudflare R2 для объектного хранилища и бэкапов, а также несколько языков с переводом через ИИ — изображения загружаются без проблем во всех из них.

например:

English

German

Russian

Portuguese