업로드를 위해 S3 호환 객체 저장소 제공자 구성하기

일단 이 문제를 보류해야 할 것 같습니다. 처음에는 작동할 것 같았는데, 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와의 차이점입니다.

2개의 좋아요

잘하셨네요! 그리고 Cloudflare에서 작동하지 않는 이유에 대한 명확한 메시지를 주셨네요. 정말 감사합니다. 곧 원본 게시물에 복사해서 올리겠습니다.

2개의 좋아요

다시 한번 감사합니다! 원문을 업데이트했습니다:

3개의 좋아요

이 가이드를 정리해 주셔서 감사합니다! Minio를 사용하면서 몇 가지 성공적인 경험을 했습니다.

Docker Compose를 사용하여 로컬에서 설정을 시도하는 다른 분들을 위해, Docker에 호스트 이름 별명을 추가하도록 지시하면 서브도메인으로 작동하도록 할 수 있습니다. 방법은 다음과 같습니다:

  minio:
    image: minio/minio
    command: server --console-address :9001 /data
    ports:
      - "9000:9000"
      - "9001:9001"
    volumes:
      - ./data/minio:/data
    environment:
      MINIO_DOMAIN: minio.mydomain.com
    networks:
      default:
        aliases:
          - assets.minio.mydomain.com

이 경우 DISCOURSE_S3_ENDPOINT=http://minio.mydomain.com:9000, DISCOURSE_S3_CDN_URL=//assets.minio.mydomain.com:9000을 설정하고, 로컬 /etc/hosts/ 파일에서 서브도메인이 localhost를 가리키도록 설정해야 합니다.

이 방법은 대부분 잘 작동하지만, Discourse가 포트 80 또는 443이 아닌 주소에서 파일을 다운로드할 수 없다는 점(관련 코드)을 발견했습니다. 따라서 이미지를 업로드하는 것은 성공하지만, 리사이즈를 위해 파일을 다운로드하려고 할 때 실패합니다.

Minio 섹션이나 요약 부분에 DISCOURSE_S3_CDN_URL이 반드시 포트 80 또는 443이어야 한다는 점을 언급하는 것이 좋을 것 같다고 생각했습니다.

4개의 좋아요

@Falco님 - 이것이 그들의 Spaces CDN에서 Content-Encoding: gzip 헤더가 작동하는 방식을 언급하는 건가요? 이는 Cloudflare R2와 유사해 보이는데, 에셋 위치가 업로드 CDN과 동일하게 설정되어 있어 gzip이 깨지는 것처럼 들립니다. 오늘날 R2에서 발생하는 상황이 이렇습니다.

해당 동작에 대한 토글을 고려해 볼 가치가 있을 것 같습니다. 예를 들어, 항상 DISCOURSE_S3_CDN_URL을 사용하는 대신 오리지널 서버에서 에셋을 서빙하도록 하는 것 말입니다. 이것이 잠재적인 설정 변경 사항으로 고려될 수 있다면, 제가 직접 조사해 보겠습니다.

3개의 좋아요

DISCOURSE_S3_CDN_URL 설정을 생략하면 그렇게 되어야 합니다. 하지만 이는 드문 특수한 경우이고, 잠재적으로 비용이 많이 드는 실수가 될 수 있어 일반적인 설정은 아닙니다.

3개의 좋아요

네, 충분히 이해합니다. 여기쯤에 새로운 GlobalSetting bool인 S3_ORIGIN_ASSETS(또는 S3_BROKEN_PROXY_FUDGE :slight_smile:) 항목을 추가하면, 테스트 스크립트가 압축되지 않는 방식처럼 Digital Ocean Spaces와 Cloudflare R2 스토리지 및 CDN이 Discourse에서 기본적으로 작동할 수 있게 됩니다. 이는 적은 노력으로 얻을 수 있는 좋은 기능 추가가 될 것 같네요. 어쨌든 향후 검토해 주시면 좋겠습니다. :heart_eyes_cat:

4개의 좋아요

오, 3.0.beta 릴리스 노트에서 추가된 기능이 있다는 걸 봤어요. 제가 용도를 잘못 이해하고 있지 않는 한, 한번 시도해볼게요. Cloudflare R2와 Digital Ocean Spaces가 그 특이한 gzip 처리를 하는 CDN과 함께 사용될 수 있게 해주는 기능일지도 모르거든요.

1개의 좋아요

아니요, 그건 무관합니다.

3개의 좋아요

이 설정을 통해 로컬 사이트를 오리진으로 지정할 수 있었고, 덕분에 JS 에셋을 S3 사이트(이 경우 CDN이 활성화된 Cloudflare 또는 Digital Ocean Spaces)에 두어야 하는 문제를 우회할 수 있었습니다. @david님, 그게 의도한 바가 아니었더라도 변경해 주셔서 감사합니다.

4개의 좋아요

에셋 CDN에 사이트 URL을 입력하나요? 영리하네요!

1개의 좋아요

안녕하세요, 이 문제가 Discourse와 관련이 있을 수 있는지 아시는 분 계신가요?

이전에 Discourse와 정상적으로 작동했던 S3 스토리지에 업로드하려고 시도한 파일들의 XML입니다:

<Error>
<Code>InvalidArgument</Code>
<Message>
Requests specifying Server Side Encryption with AWS KMS managed keys require AWS Signature Version 4.
</Message>
<ArgumentName>Authorization</ArgumentName>
<ArgumentValue>null</ArgumentValue>
<RequestId>ID</RequestId>
<HostId>
ID
</HostId>
</Error>
1개의 좋아요

AWS를 사용 중이신가요? 아니면 다른 서비스를 사용 중이신가요?

해당 버킷에 서버 측 암호화가 구성되어 있나요?

라이브러리가 업데이트되어 동작이 달라졌을 수도 있습니다.

2개의 좋아요

감사합니다. 이중 확인해 보니 자동 구성에서는 작동하는 것 같지만, S3 관리에서 자체 키를 관리하는 경우에는 작동하지 않는 것 같습니다.

Discourse에서 이것이 가능한지 알고 계신가요?

1개의 좋아요

3개의 게시글이 새로운 주제로 분리되었습니다: Why run UpdatePostUploadsSecureStatus even when secure uploads is disabled?

최근에 이 문제가 수정된 것 같습니다.
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 관련 용도로만 사용하는 것이 가능하면 좋겠습니다.

2개의 좋아요

그렇지 않습니다. 이 부분이 변경될 가능성은 낮아 보입니다.

1개의 좋아요

23개의 게시글이 새 주제로 분리되었습니다: Object Storage 설정 문제

ENV의 설정이 관리자 UI에 반영되지 않는다는 점은 다소 이상합니다. 오버라이딩이 일어나는 건가요? 관리자 UI에서 S3의 새 설정을 변경하면 환경 변수의 설정을 오버라이드하나요?

1개의 좋아요

네. 환경 변수는 데이터베이스의 값을 오버라이드하며, UX에서는 숨겨집니다.

4개의 좋아요