일단 이 문제를 보류해야 할 것 같습니다. 처음에는 작동할 것 같았는데, R2에서 에셋 업로드 시 콘텐츠 인코딩 관련해서 헤더 설정이 제대로 안 되거나 다른 이상한 문제가 발생하고 있습니다. browser-detect-7af298cd000a967d2bdc01b04807eda2924a388584ea38ad84919b726283c2ed.gz.js와 같은 gz 에셋을 만나면 ‘Invalid or unexpected token’ 오류로 막힙니다. rake s3:upload_assets는 정상적으로 작동하는 것 같지만, 브라우저 측에서 파일이 올바르게 읽히지 않고 있습니다.
AWS S3의 경우 로컬 서버 URL을 에셋에 사용해도 문제가 없는데(업로드용 기존 S3 버킷에는 존재하지 않는 파일들임), R2의 경우 에셋에만 DISCOURSE_S3_CDN_URL을 사용하려는 이유를 잘 모르겠습니다. 에셋을 서버 URL에서 가져오도록 강제할 수 있다면 아마 모든 것이 정상적으로 작동했을 것입니다.
수정: Cloudflare에서 이야기해 본 결과, 이것이 문제의 원인인 것 같고, 이로 인해 현재 R2는 일부 변경 사항 없이는 Discourse와 함께 사용할 수 없는 상태입니다. post hook 단계에서 gz 에셋을 제거하는 스크립트를 작성할 수는 있지만, 이미 하루치로선 너무 멀리 벗어난 것 같습니다:
gzip 처리된 파일은 현재 R2에서 올바르게 처리되지 않습니다. 압축되지 않은 파일로 업로드해야 합니다. Cloudflare은 투명한 압축을 제공하며, 클라이언트가 처리할 수 있는 형식(identity, gzip, 또는 Brotli)을 자동으로 선택합니다. 이는 S3와의 차이점입니다.
@Falco님 - 이것이 그들의 Spaces CDN에서 Content-Encoding: gzip 헤더가 작동하는 방식을 언급하는 건가요? 이는 Cloudflare R2와 유사해 보이는데, 에셋 위치가 업로드 CDN과 동일하게 설정되어 있어 gzip이 깨지는 것처럼 들립니다. 오늘날 R2에서 발생하는 상황이 이렇습니다.
해당 동작에 대한 토글을 고려해 볼 가치가 있을 것 같습니다. 예를 들어, 항상 DISCOURSE_S3_CDN_URL을 사용하는 대신 오리지널 서버에서 에셋을 서빙하도록 하는 것 말입니다. 이것이 잠재적인 설정 변경 사항으로 고려될 수 있다면, 제가 직접 조사해 보겠습니다.
네, 충분히 이해합니다. 여기쯤에 새로운 GlobalSetting bool인 S3_ORIGIN_ASSETS(또는 S3_BROKEN_PROXY_FUDGE ) 항목을 추가하면, 테스트 스크립트가 압축되지 않는 방식처럼 Digital Ocean Spaces와 Cloudflare R2 스토리지 및 CDN이 Discourse에서 기본적으로 작동할 수 있게 됩니다. 이는 적은 노력으로 얻을 수 있는 좋은 기능 추가가 될 것 같네요. 어쨌든 향후 검토해 주시면 좋겠습니다.
오, 3.0.beta 릴리스 노트에서 추가된 기능이 있다는 걸 봤어요. 제가 용도를 잘못 이해하고 있지 않는 한, 한번 시도해볼게요. Cloudflare R2와 Digital Ocean Spaces가 그 특이한 gzip 처리를 하는 CDN과 함께 사용될 수 있게 해주는 기능일지도 모르거든요.
이 설정을 통해 로컬 사이트를 오리진으로 지정할 수 있었고, 덕분에 JS 에셋을 S3 사이트(이 경우 CDN이 활성화된 Cloudflare 또는 Digital Ocean Spaces)에 두어야 하는 문제를 우회할 수 있었습니다. @david님, 그게 의도한 바가 아니었더라도 변경해 주셔서 감사합니다.
최근에 이 문제가 수정된 것 같습니다. 2023-3-16 변경 로그에 gzip 파일 처리에 대한 버그 수정 사항이 나와 있습니다.
저희는 현재 discourse.aosus.org에서 R2를 사용하여 Discourse 포럼을 운영하고 있으며(migrate_to_s3는 아직 실행하지 않았습니다), 문제가 없는 것 같습니다! 지금까지 눈에 띄는 문제는 없었습니다.
DISCOURSE_USE_S3: true
DISCOURSE_S3_REGION: "us-east-1" #alias to auto
#DISCOURSE_S3_INSTALL_CORS_RULE: true #it should be supported
DISCOURSE_S3_ENDPOINT: S3_API_URL
DISCOURSE_S3_ACCESS_KEY_ID: xxx
DISCOURSE_S3_SECRET_ACCESS_KEY: xxxx
DISCOURSE_S3_CDN_URL: your cdn url
DISCOURSE_S3_BUCKET: BUCKET_NAME
백업용 호스트를 별도로 지정할 방법이 있을까요? R2는 CDN 관련 용도로만 사용하는 것이 가능하면 좋겠습니다.