여기 있는 가이드들을 따라 사이트에서 R2를 설정하고 있었는데, 파일을 업로드하려고 하면 죄송합니다. 업로드에 실패했습니다. 다시 시도해 주세요.라는 일반적인 오류 메시지만 표시됩니다. 로그에서 확인할 수 있는 것은 다음과 같습니다:
웹 UI가 how-to 게시물에 나와 있는 구조로 입력한 URL을 형식 오류라고 거부해서, URL을 app.yml 파일에 설정해 두었습니다:

CDN_URL은 Cloudflare에서 설정한 커스텀 도메인이고, S3_ENDPOINT은 웹 패널에 표시된 URL입니다. 인증 토큰도 올바르게 생성하여 모든 옵션이 적절히 설정되어 있습니다:
Cloudflare에서는 일부 요청을 확인하는 것 같지만, 실제로 저장되는 내용은 없습니다.
문제가 무엇일까요?
안녕하세요,
S3 CDN URL과 S3 엔드포인트의 마지막 슬래시(/) 때문이 아닐까요?
Lilly
(Lillian )
3
이 가이드들을 따랐나요? 업로드 버킷 이름이 "discourse"인지 확실합니까?
네, 끝의 슬래시를 제거하면 UI 설정에서 해당 URL을 사용할 수 있습니다.
네, 첫 번째 가이드를 따랐습니다.
맞습니다.
슬래시를 제거해 보고 후속 조치를 취하겠습니다.
트레일링 슬래시를 제거했지만 여전히 작동하지 않습니다. 같은 Unauthorized 오류가 발생합니다.
토큰도 올바르게 설정되어 있습니다.
Lilly
(Lillian )
6
Cloudflare R2 토큰에 읽기/쓰기 권한이 있는지, 그리고 CORS 정책을 올바르게 설정했는지 확인해 보셨나요? 서버 구성이 다소 특이한 경우 Cloudflare 버킷의 권한과 설정이 정확해야 하며, 그렇지 않으면 권한 오류가 발생할 수 있습니다.
Lilly
(Lillian )
7
잘못된 유형의 토큰을 생성했습니다. 일반 API 토큰을 사용 중인데, R2 버킷 토큰을 생성해야 합니다:
- Cloudflare 대시보드에서 R2 객체 저장소로 이동하세요 (왼쪽 사이드바의
storage & databases 항목 아래에 있습니다).
- R2 개요 페이지 오른쪽에서
manage(API 토큰)를 클릭하세요.
create account API token을 클릭하세요.
- 적절한 토큰 이름을 입력하고 권한을
object read & write로 설정한 후 save를 클릭하세요.
access key id와 secret access key가 출력됩니다. 이 값들을 Discourse의 S3 설정에 입력해야 합니다.
그리고 네, Discourse가 이를 거부할 가능성이 높으므로 끝에 있는 슬래시(/)는 제거해야 합니다.
감사합니다. 결국 그게 문제였네요. 불필요하게 혼란스럽긴 하지만, 그건 Cloudflare 탓입니다.
Lilly
(Lillian )
9
네, 클라우드플레어 대시보드는 설정 때문에 진짜 골칫덩어리일 수 있죠 ㅋㅋ. 해결하셨다니 다행이에요!