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

**URL:** https://meta.discourse.org/t/configure-an-s3-compatible-object-storage-provider-for-uploads/148916
**Category:** Self-Hosting
**Tags:** cdn, configuring, how-to, reference
**Created:** [4월 22, 2020, 10:37오후 UTC](https://meta.discourse.org/t/configure-an-s3-compatible-object-storage-provider-for-uploads/148916 "2020-04-22T22:37:37Z")
**Posts on this page:** 20
**Page:** 13

<div class="post-metadata">

### Author: ![pequiste](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pequiste/32/490888_2.png) [@pequiste](https://meta.discourse.org/u/pequiste)
#### Post date: [3월 21, 2025, 12:22오전 UTC](https://meta.discourse.org/t/configure-an-s3-compatible-object-storage-provider-for-uploads/148916/476 "2025-03-21T00:22:52Z")

</div>

위키 편집 권한이 없는 것 같습니다. 하지만 다른 제공업체를 사용하여 성공적으로 설정했습니다.

# OVHcloud

서비스 이름: Object Storage

리전은 3글자 코드로 식별되는 데이터 센터와 일치합니다. 버킷을 생성한 위치를 모르면 고객 포털의 오브젝트 스토리지 탭에서 확인하세요.

```plaintext
DISCOURSE_USE_S3: true
DISCOURSE_S3_REGION: [data center code]
DISCOURSE_S3_ENDPOINT: https://s3.[data center code].io.cloud.ovh.net/
DISCOURSE_S3_ACCESS_KEY_ID: [key]
DISCOURSE_S3_SECRET_ACCESS_KEY: [key]
DISCOURSE_S3_BUCKET: [bucket name]
DISCOURSE_S3_BACKUP_BUCKET: [bucket name]
DISCOURSE_BACKUP_LOCATION: s3

```

---

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [3월 21, 2025, 3:01오후 UTC](https://meta.discourse.org/t/configure-an-s3-compatible-object-storage-provider-for-uploads/148916/477 "2025-03-21T15:01:55Z")

</div>

OVHcloud S3를 업로드용으로 설정하셨나요, 아니면 백업용으로만 사용하셨나요?

---

<div class="post-metadata">

### Author: ![pequiste](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pequiste/32/490888_2.png) [@pequiste](https://meta.discourse.org/u/pequiste)
#### Post date: [3월 21, 2025, 3:16오후 UTC](https://meta.discourse.org/t/configure-an-s3-compatible-object-storage-provider-for-uploads/148916/478 "2025-03-21T15:16:20Z")

</div>

처음에는 테스트 버전에도 두 가지를 모두 사용했지만, 프로덕션 머신에 여유 공간이 충분하므로 프로덕션에서는 백업에만 사용했습니다.

S3와의 호환성이 매우 좋지만, 오래된 파일을 삭제하거나 콜드 스토리지로 이동하는 라이프사이클 규칙 같은 기능이 아직 부족합니다. OVH에서 이 부분을 적극적으로 작업 중입니다. 파일 서빙 자체는 문제없이 잘 작동합니다.

따라서 백업의 경우, Discourse에서 제공하는 오래된 백업 자동 삭제 옵션을 사용했습니다.

---

<div class="post-metadata">

### Author: ![kneel](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/kneel/32/429767_2.png) [@kneel](https://meta.discourse.org/u/kneel)
#### Post date: [3월 31, 2025, 2:18오전 UTC](https://meta.discourse.org/t/configure-an-s3-compatible-object-storage-provider-for-uploads/148916/479 "2025-03-31T02:18:53Z")

</div>

> [@pfaffman](#):
>
> 링크를 따라가 보셨나요?
> 
> CDN이 메타데이터를 인식하지 못하는 것 같습니다. 하지만 시도해 보시면 작동할지도 모릅니다! 시도하신다면 결과를 알려주세요. 며칠 전에 수정되었을지 궁금했습니다. 문서를 보면, 저는 당분간 직접 시도해 볼 생각은 없습니다.

정말 실망스럽고 전혀 도움이 되지 않는 답변입니다. **과연** 문제가 무엇인가요? 변경되는 지원 문서를 링크하는 것은 이 스레드에서 언급된 "끔찍한 고장"이 대체 무엇인지 아무도 알 수 없게 만듭니다.

"메타데이터"와 CDN이 "그것을 모른다"고 언급하셨습니다. 어떤 메타데이터인가요? 무엇이 작동하지 않는지 아는 것이 도움이 될 것입니다.

---

<div class="post-metadata">

### Author: ![JamesNorth](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/jamesnorth/32/283740_2.png) [@JamesNorth](https://meta.discourse.org/u/JamesNorth)
#### Post date: [4월 16, 2025, 1:45오전 UTC](https://meta.discourse.org/t/configure-an-s3-compatible-object-storage-provider-for-uploads/148916/480 "2025-04-16T01:45:08Z")

</div>

> [@JamesNorth](#):
>
> iDrive 설정

iDrive의 E2를 사용하는 방법에 대한 지침을 담은 제 이전 게시글에 추가하고 싶었습니다.

[iDrive가 최근에 활성화한 기능](https://www.idrive.com/s3-storage-e2/rclone)이 있어, 버킷 하나에만 할당된 액세스 키는 버킷 인증 검사를 우회하지 않으면 실패하는 문제가 발생합니다.

`rclone.conf` 파일에 `no_check_bucket = true`를 설정하면 `rclone` 사용 시 이를 우회할 수 있지만, Discourse 빌딩에 그런 환경 변수(ENV) 설정이 존재하는지 확신할 수 없습니다.

따라서 현재 iDrive E2를 사용하려면, 특정 버킷 하나에 쓰기 권한이 있는 키가 아니라 _반드시_ 모든 버킷에 쓰기 접근 권한이 있는 키를 사용해야 합니다.

---

<div class="post-metadata">

### Author: ![tknospdr](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/tknospdr/32/529762_2.png) [@tknospdr](https://meta.discourse.org/u/tknospdr)
#### Post date: [7월 21, 2025, 6:16오후 UTC](https://meta.discourse.org/t/configure-an-s3-compatible-object-storage-provider-for-uploads/148916/481 "2025-07-21T18:16:03Z")

</div>

> [@kneel](#):
>
> 이건 정말 실망스럽고 전혀 도움이 안 되는 답변입니다. **정확히** 어떤 문제인가요?

그 사람이 사용하지 않는 프로바이더의 정확한 문제를 어떻게 알 수 있겠어요?

어쨌든, Cloudflare R2로 거의 마무리 단계인 것 같습니다.

> [@Cloudflare R2: 설정 안내 및 구성 오류 처리](https://meta.discourse.org/t/cloudflare-r2-navigating-setup-and-handling-configuration-errors/305617):
>
> Is there still no development on cloudflare R2? It looked good to me..

웹 UI에 모든 정보를 입력했을 때, 새로운 업로드가 S3 스토리지로 정상적으로 전송되었고, 백업도 S3로 정상적으로 저장되었습니다. 기존 업로드는 당연히 이동되지 않았습니다.

그 다음 app.yml 파일에 다음 정보를 입력했습니다:

```plaintext
## 이 라인 세트는 R2 S3 호스팅 파일의 업로드와 다운로드를 허용합니다..
  DISCOURSE_CDN_URL: https://eufiles.technospider.com
  DISCOURSE_USE_S3: true
  DISCOURSE_S3_ENDPOINT: https://randomnumber.r2.cloudflarestorage.com
  DISCOURSE_S3_CDN_URL: https://eufiles.technospider.com
  DISCOURSE_S3_BACKUP_BUCKET: exotics-unlimited-backups
  DISCOURSE_INCLUDE_S3_UPLOADS_IN_BACKUPS: true
  DISCOURSE_BACKUP_LOCATION: s3
  DISCOURSE_S3_BUCKET: exotics-unlimited
  DISCOURSE_S3_REGION: auto
  DISCOURSE_S3_ACCESS_KEY_ID: randomnumbers
  DISCOURSE_S3_SECRET_ACCESS_KEY: randomnumbers
  DISCOURSE_S3_INSTALL_CORS_RULE: false

## Docker 컨테이너는 상태가 없으며(stateless), 모든 데이터는 /shared에 저장됩니다
volumes:
  - volume:
      host: /var/discourse/shared/standalone
      guest: /shared
  - volume:
      host: /var/discourse/shared/standalone/log/var-log
      guest: /var/log

## 플러그인은 여기에 배치합니다
## 자세한 내용은 https://meta.discourse.org/t/19157 참조
hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - git clone https://github.com/discourse/docker_manager.git
# - git clone https://github.com/discourse/discourse-subscriptions.git
          - git clone https://github.com/discourse/discourse-follow.git
          - git clone https://github.com/discourse/discourse-solved.git
          - git clone https://github.com/communiteq/discourse-private-topics.git
# - git clone https://github.com/discourse/discourse-assign.git
          - git clone https://github.com/tknospdr/discourse-auto-remove-group.git
          - git clone https://github.com/discourse/discourse-topic-voting.git
          - git clone https://github.com/discourse/discourse-livestream.git
# - git clone https://github.com/discourse/discourse-calendar.git
          - git clone https://github.com/jannolii/discourse-topic-trade-buttons.git
## - git clone https://github.com/tknospdr/force-tag-group-order.git

## S3용 훅
  after_assets_precompile:
    - exec:
        cd: $home
        cmd:
          - sudo -E -u discourse bundle exec rake s3:upload_assets
          - sudo -E -u discourse bundle exec rake s3:expire_missing_assets

```

재빌드(rebuild) 후 일부 파일이 누락되어 사이트가 깨졌고, 파일을 서버로 rake 명령으로 전송하려고 시도했는데 각 파일마다 다음과 같은 오류가 발생했습니다:

```plaintext
root@talk-app:/var/www/discourse# rake uploads:migrate_to_s3
S3로 마이그레이션하는 것은 현재 되돌릴 수 없음을 유의하세요! 
[CTRL+c]를 눌러 취소하거나, [ENTER]를 눌러 계속하세요

'default'의 업로드를 S3로 마이그레이션하는 중...
S3로 파일 업로드 중...
 - 로컬 파일 나열
 => 31개 파일
 - S3 파일 나열
. => 4개 파일
 - S3로 파일 동기화 중
#<Thread:0x00007ff89dcbcb20 /var/www/discourse/lib/file_store/to_s3_migration.rb:212 run> terminated with exception (report_on_exception is true):
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.226.0/lib/seahorse/client/plugins/raise_response_errors.rb:17:in `call': You can only specify one non-default checksum at a time. (Aws::S3::Errors::InvalidRequest)
    from /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-s3-1.182.0/lib/aws-sdk-s3/plugins/sse_cpk.rb:24:in `call'
    from /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-s3-1.182.0/lib/aws-sdk-s3/plugins/dualstack.rb:21:in `call'
    from /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-s3-1.182.0/lib/aws-sdk-s3/plugins/accelerate.rb:43:in `call'
    from /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.226.0/lib/aws-sdk-core/plugins/checksum_algorithm.rb:169:in `call'
    from /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.226.0/lib/aws-sdk-core/plugins/jsonvalue_converter.rb:16:in `call'
    from /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.226.0/lib/aws-sdk-core/plugins/invocation_id.rb:16:in `call'
    from /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.226.0/lib/aws-sdk-core/plugins/idempotency_token.rb:19:in `call'
    from /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.226.0/lib/aws-sdk-core/plugins/param_converter.rb:26:in `call'
    from /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.226.0/lib/seahorse/client/plugins/request_callback.rb:89:in `call'
    from /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.226.0/lib/aws-sdk-core/plugins/response_paging.rb:12:in `call'
    from /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.226.0/lib/seahorse/client/plugins/response_target.rb:24:in `call'
    from /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.226.0/lib/aws-sdk-core/plugins/telemetry.rb:39:in `block in call'
    from /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.226.0/lib/aws-sdk-core/telemetry/no_op.rb:29:in `in_span'
    from /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.226.0/lib/aws-sdk-core/plugins/telemetry.rb:53:in `span_wrapper'
    from /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.226.0/lib/aws-sdk-core/plugins/telemetry.rb:39:in `call'
    from /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.226.0/lib/seahorse/client/request.rb:72:in `send_request'
    from /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-s3-1.182.0/lib/aws-sdk-s3/client.rb:17315:in `put_object'
    from /var/www/discourse/lib/file_store/to_s3_migration.rb:215:in `block (2 levels) in migrate_to_s3'

```

어떤 방식으로든 이 작업을 마무리할 수 있도록 조언을 구합니다.

---

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [7월 22, 2025, 6:30오전 UTC](https://meta.discourse.org/t/configure-an-s3-compatible-object-storage-provider-for-uploads/148916/482 "2025-07-22T06:30:24Z")

</div>

> [@tknospdr](#):
>
> 리빌드 후 파일이 여러 개 누락되어 사이트가 깨졌고, 파일을 서버로 전송(rake)하려고 했더니 각 파일마다 이 오류가 발생했습니다.

누락된 파일은 아마도 에셋(asset)일 가능성이 높으므로, 이를 s3로 전송하는 rake 태스크(s3:upload\_assets – 목록 상단에 위치)가 필요합니다.

하지만 현재 오류는 새로운 aws s3 라이브러리가 여러 서비스를 깨뜨렸기 때문일 가능성이 큽니다. 따라서 aws 지엄(gem)을 하위 버전으로 강등하거나 다른 서비스를 사용해야 합니다.

그 방법에 대한 주제(topic)가 있을 것 같습니다. 저는 두세 개의 사이트에서 이를 수행해 보았지만, 정확히 어떻게, 어디에 문서화되어 있는지 확실하지 않습니다.

---

<div class="post-metadata">

### Author: ![Lilly](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/lilly/32/575047_2.png) [@Lilly](https://meta.discourse.org/u/Lilly)
#### Post date: [7월 22, 2025, 6:38오전 UTC](https://meta.discourse.org/t/configure-an-s3-compatible-object-storage-provider-for-uploads/148916/483 "2025-07-22T06:38:13Z")

</div>

> [@pfaffman](#):
>
> 하지만 오류는 새로운 aws s3 라이브러리가 여러 서비스를 깨뜨렸기 때문일 가능성이 높습니다. 따라서 aws gem을 다운그레이드하거나 다른 서비스를 사용해야 합니다.

이 토픽인 것 같습니다.

> [@AWS SDK gem 버전 상승 및 새로운 AWS 데이터 무결성 보호 기능으로 인해 재빌드 불가](https://meta.discourse.org/t/cant-rebuild-due-to-aws-sdk-gem-bump-and-new-aws-data-integrity-protections/354217/49?u=lilly):
>
> But I did for a site that’s using Backblaze. I created a template I put in /root/aws-revert-template.yml with this: # This template reverts aws-sdk-s3 to a version that works with backblaze params: home: /var/www/discourse hooks: after\_bundle\_exec: - exec: cd: $home cmd: - bundle config set frozen false - "sed -i 's/gem \"aws-sdk-s3\", require: false/gem \"aws-sdk-s3\", \"1.177.0\", require: false/' Gemfile" - bundle update aws-sdk-s3 …

---

<div class="post-metadata">

### Author: ![tknospdr](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/tknospdr/32/529762_2.png) [@tknospdr](https://meta.discourse.org/u/tknospdr)
#### Post date: [7월 22, 2025, 12:14오후 UTC](https://meta.discourse.org/t/configure-an-s3-compatible-object-storage-provider-for-uploads/148916/484 "2025-07-22T12:14:16Z")

</div>

> [@pfaffman](#):
>
> 누락된 파일들은 아마도 에셋(assets)일 가능성이 높으므로, 이를 s3로 업로드하는 rake 태스크가 필요합니다 (s3:upload\_assets – 목록의 상단에 위치해 있습니다)

app.yml 파일에 추가한 변경 사항의 일부이긴 하지만, 이 태스크를 실행해야 하는 건가요? 재빌드(rebuild) 시점에 파일이 자동으로 푸시되도록 하기 위해 app.yml에 설정해 두었다고 생각했습니다.

방금 테스트해 보았습니다. 출력 결과는 다음과 같습니다:

```plaintext

root@talk-app:/var/www/discourse# rake s3:upload_assets
Installing CORS rules...
skipping
Skipping: assets/logo-single-3f9a3693.png
Skipping: assets/favicon-7e45025e.ico
Skipping: assets/logo-single-dev-0d38377d.png
Skipping: assets/push-notifications/posted-e02e1c60.png
Skipping: assets/push-notifications/watching_first_post-e02e1c60.png
Skipping: assets/push-notifications/README-d49cc975.md
(big long list...)
Skipping: assets/plugins/footnote_extra-95ffab71.gz.js

```

---

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [7월 22, 2025, 1:50오후 UTC](https://meta.discourse.org/t/configure-an-s3-compatible-object-storage-provider-for-uploads/148916/485 "2025-07-22T13:50:03Z")

</div>

> [@tknospdr](#):
>
> app.yml 파일에 추가한 변경 사항의 일부인데도 불구하고 이 작업을 실행해야 하나요? I

그렇게 하지 않는 것이 좋습니다. 하지만 그 작업들을 하지 않으면 사이트가 “고장 난” 상태가 될 것입니다(혹시 “고장 난” 상태가 “이미지가 누락된” 상태를 의미합니까?). `migrate_to_s3`로 이미지를 업로드하는 것은 이미지에만 영향을 미칩니다.

자산(assets)이 이미 모두 업로드된 이유를 정확히 설명하기가 어렵습니다(사이트에서 무엇이 고장 났습니까? S3 설정이 고장 났는데 어떻게 업로드가 되었습니까?)

사이트에서 이미지를 업로드할 수 있습니까?

---

<div class="post-metadata">

### Author: ![tknospdr](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/tknospdr/32/529762_2.png) [@tknospdr](https://meta.discourse.org/u/tknospdr)
#### Post date: [7월 22, 2025, 2:08오후 UTC](https://meta.discourse.org/t/configure-an-s3-compatible-object-storage-provider-for-uploads/148916/486 "2025-07-22T14:08:32Z")

</div>

> [@pfaffman](#):
>
> 사이트에 이미지를 업로드할 수 있나요?

현재 사이트에서 아무것도 할 수 없습니다.  
방문해서 확인해 보세요. [https://eu.technospider.com](https://eu.technospider.com)

모든 것이 제 버킷에 있는 것처럼 보이므로, 모든 것이 정상적으로 작동하도록 환경 변수를 업데이트해야 할 가능성이 큽니다.  
이 문제를 해결할 수 있다면 R2가 본격적인 실전에 투입될 준비가 되었다고 말할 수 있을 것입니다.

---

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [7월 22, 2025, 2:28오후 UTC](https://meta.discourse.org/t/configure-an-s3-compatible-object-storage-provider-for-uploads/148916/487 "2025-07-22T14:28:31Z")

</div>

이 파일(그리고 다른 여러 파일)이 누락되었습니다: [https://eufiles.technospider.com/extra-locales/ca382c69f8e6b85162b2ba58f2ce100bfe741966/en/mf.js?\_\_ws=eu.technospider.com](https://eufiles.technospider.com/extra-locales/ca382c69f8e6b85162b2ba58f2ce100bfe741966/en/mf.js?__ws=eu.technospider.com)

이것은 여러분의 CDN인가요, 아니면 버킷인가요? 해당 파일이 버킷에 존재합니까? 아마도 버킷에는 있지만 CDN이 고장 난 것일 수도 있겠네요?

> [@tknospdr](#):
>
> 이것을 해결할 수 있다면 R2가 본격적인 사용(ready for prime time)에 적합하다고 말할 수 있을 것입니다.

한때 R2를 이렇게 구성했는데, 작동했던 것 같습니다.

```plaintext
            - "DISCOURSE_S3_REGION: 'auto'"
            - "DISCOURSE_S3_ENDPOINT: https://some-number.r2.cloudflarestorage.com"
            - "DISCOURSE_S3_ACCESS_KEY_ID: 'keyid'"
            - "DISCOURSE_S3_SECRET_ACCESS_KEY: 'secret'"
            - "DISCOURSE_S3_CDN_URL: 'https://r2.myforum.us/xyz'"
            - "DISCOURSE_CDN_URL: 'https://r2.literatecomputing.com'"
            - "DISCOURSE_S3_BUCKET: 'myforum/xyz'"
            - "DISCOURSE_S3_BACKUP_BUCKET: 'myforum/xyz/backups'"

```

> [@tknospdr](#):
>
> 이것을 해결할 수 있다면 R2가 본격적인 사용(ready for prime time)에 적합하다고 말할 수 있을 것입니다.

그러니까 이건 한 번도 작동한 적이 없나요?

---

<div class="post-metadata">

### Author: ![tknospdr](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/tknospdr/32/529762_2.png) [@tknospdr](https://meta.discourse.org/u/tknospdr)
#### Post date: [7월 22, 2025, 2:55오후 UTC](https://meta.discourse.org/t/configure-an-s3-compatible-object-storage-provider-for-uploads/148916/488 "2025-07-22T14:55:24Z")

</div>

> [@pfaffman](#):
>
> 이것(그리고 다른 여러 파일들)이 [https://eufiles.technospider.com/extra-locales/ca382c69f8e6b85162b2ba58f2ce100bfe741966/en/mf.js?\_\_ws=eu.technospider.com](https://eufiles.technospider.com/extra-locales/ca382c69f8e6b85162b2ba58f2ce100bfe741966/en/mf.js?__ws=eu.technospider.com) 에서 누락되어 있습니다.

"extra-locales"는 어디에 있어야 하나요? 'public’이나 ‘assets’ 아래에서, 심지어 컨테이너 내부에서도 보이지 않습니다. 어디를 봐야 할까요?

> [@](#):
>
> 그것은 당신의 CDN인가요, 아니면 버킷인가요? 그 파일이 버킷에 존재하나요? 아마도 버킷에는 있지만 CDN이 깨진 것일까요?

멍청한 질문을 해서 죄송합니다. 하지만 저에게는 완전히 새로운 도전입니다.  
제 CDN이 뭔가요, 아니면 버킷이 뭔가요?

> [@](#):
>
> > [@tknospdr](#):
> >
> > 이것을 해결할 수 있다면 R2가 본격적인 사용에 준비가 되었다고 말할 수 있을 것입니다.
> 
> 저는 이전에 R2를 이렇게 구성했고 작동했던 것 같습니다.
> 
> ```plaintext
> - "DISCOURSE_S3_REGION: 'auto'"
> - "DISCOURSE_S3_ENDPOINT: https://some-number.r2.cloudflarestorage.com"
> - "DISCOURSE_S3_ACCESS_KEY_ID: 'keyid'"
> - "DISCOURSE_S3_SECRET_ACCESS_KEY: 'secret'"
> - "DISCOURSE_S3_CDN_URL: 'https://r2.myforum.us/xyz'"
> - "DISCOURSE_CDN_URL: 'https://r2.literatecomputing.com'"
> - "DISCOURSE_S3_BUCKET: 'myforum/xyz'"
> - "DISCOURSE_S3_BACKUP_BUCKET: 'myforum/xyz/backups'"
> 
> ```

앞에 있는 대시와 모든 싱글쿼트와 더블쿼트를 포함하여? 제 app.yml 파일에는 그런 것이 하나도 없습니다. 테스트를 위해 그것들을 추가하고 다시 빌드해야 하나요?  
제 파일은 정확히 이렇습니다. 각 줄마다 2공백 들여쓰기가 되어 있습니다:

```plaintext
## This set of lines allows R2 S3 hosted files to be uploaded and downloaded..
  DISCOURSE_CDN_URL: https://eufiles.technospider.com
  DISCOURSE_USE_S3: true
  DISCOURSE_S3_ENDPOINT: https://randomnumber.r2.cloudflarestorage.com
  DISCOURSE_S3_CDN_URL: https://eufiles.technospider.com
  DISCOURSE_S3_BACKUP_BUCKET: exotics-unlimited-backups
  DISCOURSE_INCLUDE_S3_UPLOADS_IN_BACKUPS: true
  DISCOURSE_BACKUP_LOCATION: s3
  DISCOURSE_S3_BUCKET: exotics-unlimited
  DISCOURSE_S3_REGION: auto
  DISCOURSE_S3_ACCESS_KEY_ID: randomnumbers
  DISCOURSE_S3_SECRET_ACCESS_KEY: randomnumbers
  DISCOURSE_S3_INSTALL_CORS_RULE: false

```

> [@](#):
>
> > [@tknospdr](#):
> >
> > 이것을 해결할 수 있다면 R2가 본격적인 사용에 준비가 되었다고 말할 수 있을 것입니다.
> 
> 그러니까 이것은 한 번도 작동한 적이 없다는 뜻인가요?

웹 UI를 통해 설정을 입력했을 때는 작동했습니다. 그런데 모든 것을 app.yml 파일에 넣은 후에 사이트로 가보셨을 때 보셨던 문제가 발생했습니다.

---

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [7월 22, 2025, 3:08오후 UTC](https://meta.discourse.org/t/configure-an-s3-compatible-object-storage-provider-for-uploads/148916/489 "2025-07-22T15:08:49Z")

</div>

어떤 자산에 접근할 때 제가 보는 내용은 다음과 같습니다:

```plaintext
This object does not exist or is not publicly accessible at this URL. Check the URL of the object that you're looking for or contact the owner to enable Public access.

```

호스트명을 Cloudflare 엔드포인트로 변경하면 `https://eufiles.technospider.com/extra-locales/ca382c69f8e6b85162b2ba58f2ce100bfe741966/en/mf.js?__ws=eu.technospider.com` 이 URL이 작동하는지 확인해 볼 수 있습니다.

버킷에서 해당 파일을 찾을 수 있나요? 접근이 가능한가요?

> [@tknospdr](#):
>
> “extra-locales” 는 어디에 있어야 하나요?

모르겠지만, 그것은 제 브라우저 개발자 도구에서 복사해 온 URL입니다.

그러니 먼저 버킷에서 해당 파일을 찾아 실제로 존재하는지 확인한 후, CDN이 왜 그 파일을 찾지 못하는지 파악해 보세요.

> [@tknospdr](#):
>
> 앞의 대시와 모든 싱글 쿼트, 더블 쿼트까지 포함해서요?

아니요. 저는 설정을 위해 다른 도구를 사용하지만, 그건 제가 한때 작동했던 것으로 확신하는 ENV 설정 값들입니다.

> [@tknospdr](#):
>
> 웹 UI를 통해 설정을 입력했을 때는 작동했는데, 모든 것을 app.yml 파일에 넣었을 때 사이트로 접속하면 당신이 보았던 문제가 발생했습니다.

알겠습니다. 정말 답답하시겠네요. 행운을 빕니다.

---

<div class="post-metadata">

### Author: ![tknospdr](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/tknospdr/32/529762_2.png) [@tknospdr](https://meta.discourse.org/u/tknospdr)
#### Post date: [7월 22, 2025, 3:12오후 UTC](https://meta.discourse.org/t/configure-an-s3-compatible-object-storage-provider-for-uploads/148916/490 "2025-07-22T15:12:20Z")

</div>

> [@pfaffman](#):
>
> /extra-locales/ca382c69f8e6b85162b2ba58f2ce100bfe741966/en/mf.js?\_\_ws=[eu.technospider.com](http://eu.technospider.com)

다음과 같은 오류가 발생합니다:

```plaintext
This XML file does not appear to have any style information associated with it. The document tree is shown below.
<Error>
<Code>InvalidArgument</Code>
<Message>Authorization</Message>
</Error>

```

제 엔드포인트는 다음과 같습니다:  
[https://7100e60b936991e069a3230dc05d4976.r2.cloudflarestorage.com/exotics-unlimited/](https://7100e60b936991e069a3230dc05d4976.r2.cloudflarestorage.com/exotics-unlimited/)

방금

```plaintext
DISCOURSE_S3_CDN_URL: https://eufiles.technospider.com

```

을

```plaintext
DISCOURSE_S3_CDN_URL: https://eufiles.technospider.com/exotics-unlimited

```

으로 변경했는데, 이제 사라지지 않는 로딩 스핀너(throbber)에 직면해 있습니다.  
진전이 있을까요? 장담하기 어렵네요. 🙂

---

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [7월 23, 2025, 8:45오전 UTC](https://meta.discourse.org/t/configure-an-s3-compatible-object-storage-provider-for-uploads/148916/491 "2025-07-23T08:45:40Z")

</div>

버킷 URL로 접근할 수 있는 자산을 찾아보세요. 그런 다음 해당 자산을 CDN을 통해 어떻게 접근하는지 확인해 보세요.

---

<div class="post-metadata">

### Author: ![tknospdr](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/tknospdr/32/529762_2.png) [@tknospdr](https://meta.discourse.org/u/tknospdr)
#### Post date: [7월 23, 2025, 12:45오후 UTC](https://meta.discourse.org/t/configure-an-s3-compatible-object-storage-provider-for-uploads/148916/492 "2025-07-23T12:45:27Z")

</div>

몰라서 죄송합니다. 그런데 버킷과 CDN은 어떤 차이가 있나요?

---

<div class="post-metadata">

### Author: ![Jagster](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/jagster/32/192154_2.png) [@Jagster](https://meta.discourse.org/u/Jagster)
#### Post date: [7월 23, 2025, 1:28오후 UTC](https://meta.discourse.org/t/configure-an-s3-compatible-object-storage-provider-for-uploads/148916/493 "2025-07-23T13:28:26Z")

</div>

버킷은 사용자가 만든 '메인 디렉터리’이며 모든 파일이 저장되는 곳입니다. CDN은 전 세계에 분산된 수많은 서버를 말하며, 이 서버들은 해당 버킷의 사본을 받아 보관합니다. 사용자의 버킷은 연결 생성 시 제공한 URL(예: `cdn.example.com`)을 통해 식별됩니다.

---

<div class="post-metadata">

### Author: ![tknospdr](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/tknospdr/32/529762_2.png) [@tknospdr](https://meta.discourse.org/u/tknospdr)
#### Post date: [7월 23, 2025, 1:54오후 UTC](https://meta.discourse.org/t/configure-an-s3-compatible-object-storage-provider-for-uploads/148916/494 "2025-07-23T13:54:11Z")

</div>

R2에서는 버킷에 커스텀 도메인을 지정하면 CDN이 자동으로 생성되는 것 같습니다. CDN에 대해 별도로 할 일이 없었기 때문에 조금 혼란스러웠습니다.

알아볼 수 있는 것을 찾아보겠습니다.

---

<div class="post-metadata">

### Author: ![tknospdr](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/tknospdr/32/529762_2.png) [@tknospdr](https://meta.discourse.org/u/tknospdr)
#### Post date: [7월 23, 2025, 7:17오후 UTC](https://meta.discourse.org/t/configure-an-s3-compatible-object-storage-provider-for-uploads/148916/495 "2025-07-23T19:17:10Z")

</div>

어떤 방법을 시도해도 R2 엔드포인트 URL에서 어떤 객체에든 접근할 수 없는 것 같습니다.

```plaintext
https://7100 *********** dc05d4976.r2.cloudflarestorage.com/exotics-unlimited/assets/logo-815195ae.png

```

그리고

```plaintext
https://exotics-unlimited.7100 *********** dc05d4976.r2.cloudflarestorage.com/assets/logo-815195ae.png

```

다음과 같은 오류가 발생합니다:

```plaintext
This XML file does not appear to have any style information associated with it. The document tree is shown below.
<Error>
<Code>InvalidArgument</Code>
<Message>Authorization</Message>
</Error>

```

하지만 CDN을 통해 접근하면:

```plaintext
![discourse](upload://4axzzMIqD328iAou0u6qv18Avo8.png)

```

다음과 같은 결과가 나옵니다:  
 ![discourse](https://global.discourse-cdn.com/meta/original/3X/1/d/1d39bfce648516eeeacf9c2aaf07e76be519fb54.png)  
오류 메시지에 인증(Authorization) 관련 내용이 언급되어 있어서 이에 대해 조금 조사해 보았고, 다음과 같은 내용을 찾았습니다:

> 참고
> 
> 기본적으로 특정 파일 유형만 캐시에 저장됩니다. 버킷의 모든 파일을 캐시에 저장하려면 ‘Cache Everything’ 페이지 규칙을 설정해야 합니다.
> 
> 기본 캐시 동작 방식과 커스터마이징 방법에 대한 자세한 내용은 [기본 캐시 동작](https://developers.cloudflare.com/cache/concepts/default-cache-behavior/#default-cached-file-extensions)을 참조하세요.

다음 페이지에서 확인했습니다:

> **[Public buckets](https://developers.cloudflare.com/r2/buckets/public-buckets/#managed-public-buckets-through-r2dev)**
>
> Expose R2 bucket contents to the Internet via a custom domain or r2.dev subdomain.

‘cache everything’ 규칙을 생성해 보았지만, 아무런 변화가 없습니다.

[이전 페이지](https://meta.discourse.org/t/configure-an-s3-compatible-object-storage-provider-for-uploads/148916.md?page=12)

[다음 페이지](https://meta.discourse.org/t/configure-an-s3-compatible-object-storage-provider-for-uploads/148916.md?page=14)
