안녕하세요,
Cloudflare R2를 S3 호환 스토리지로 사용하여 Discourse AI 번역과 콘텐츠 로컬라이제이션을 사용할 때, 번역된 게시글 콘텐츠에 설정된 s3_cdn_url(사용자 지정 도메인) 대신 원본 R2 버킷 엔드포인트 URL이 저장됩니다. 이로 인해 번역본을 보는 모든 사용자에게 이미지가 깨진 상태로 표시됩니다.
환경
- Discourse: 최신 버전
- Cloudflare R2가 S3 호환 스토리지로 구성됨
s3_cdn_url:https://files.mydomain.coms3_use_cdn_url_for_all_uploads: 활성화됨- 콘텐츠 로컬라이제이션 + Discourse AI 번역: 활성화됨
재현 단계
- 사용자 지정 도메인(
s3_cdn_url)으로 Cloudflare R2 구성 - 콘텐츠 로컬라이제이션 및 AI 번역 활성화
- 이미지를 포함한 게시글 생성
- AI 번역이 로컬라이즈된 버전을 생성할 때까지 대기
- 언어 전환 — 번역된 버전의 이미지가 깨져 있음
관찰된 동작
번역된 콘텐츠에는 다음과 같은 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());
});



