콘텐츠 현지화에서 번역된 게시글에 S3 CDN URL 대신 원본 R2 버킷 URL 사용

안녕하세요,

Cloudflare R2를 S3 호환 스토리지로 사용하여 Discourse AI 번역과 콘텐츠 로컬라이제이션을 사용할 때, 번역된 게시글 콘텐츠에 설정된 s3_cdn_url(사용자 지정 도메인) 대신 원본 R2 버킷 엔드포인트 URL이 저장됩니다. 이로 인해 번역본을 보는 모든 사용자에게 이미지가 깨진 상태로 표시됩니다.

환경

  • Discourse: 최신 버전
  • Cloudflare R2가 S3 호환 스토리지로 구성됨
  • s3_cdn_url: https://files.mydomain.com
  • s3_use_cdn_url_for_all_uploads: 활성화됨
  • 콘텐츠 로컬라이제이션 + Discourse AI 번역: 활성화됨

재현 단계

  1. 사용자 지정 도메인(s3_cdn_url)으로 Cloudflare R2 구성
  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

임시 해결책은 리맵을 수행하거나 다음 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 버킷을 사용 중이고, AI 번역으로 다국어 지원을 하고 있는데 이미지 로딩은 모든 언어에서 정상적으로 작동하고 있어요.

예를 들어:

English

German

Russian

Portuguese

네, 제 테스트에서는 3~5개의 이미지를 업로드하고 있습니다. 하지만 실제로는 1~2개만 의도대로 작동합니다.