# 업로드를 위해 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:** 7

<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: [9월 21, 2022, 10:14오전 UTC](https://meta.discourse.org/t/configure-an-s3-compatible-object-storage-provider-for-uploads/148916/352 "2022-09-21T10:14:35Z")

</div>

안녕하세요, @mcwumbly. 전에 "S3 clone"으로 검색하면 아주 쉽게 찾을 수 있었어요. 그런데 방금에는 찾지 못했어요. 제목에 문제가 있었던 건가요? 이 항목을 찾을 수 있는 검색 방법이 있을까요? 표준 설치([standard install](https://meta.discourse.org/t/142537?silent=true))처럼 특정 단어가 자동으로 링크되도록 하는 (이름을 잘 기억이 안 나네요) 기능을 추가할 수 있을까요? (어떤 단어를 사용해야 할지 떠오르지 않네요.)

---

<div class="post-metadata">

### Author: ![Falco](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/falco/32/179432_2.png) [@Falco](https://meta.discourse.org/u/Falco)
#### Post date: [9월 21, 2022, 1:58오후 UTC](https://meta.discourse.org/t/configure-an-s3-compatible-object-storage-provider-for-uploads/148916/353 "2022-09-21T13:58:48Z")

</div>

> [@pfaffman](#):
>
> "S3 clone"로 검색할 수 있을 때 이걸 찾는 건 정말 쉬웠습니다.

저는 매주 여러 번 해당 주제를 링크하는 사람으로서, 어느 정도 동의합니다 😛

혹시 OP 본문에 "s3 clones"를 추가하면 검색이 더 잘 될까요?

---

<div class="post-metadata">

### Author: ![mcwumbly](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/mcwumbly/32/103861_2.png) [@mcwumbly](https://meta.discourse.org/u/mcwumbly)
#### Post date: [9월 21, 2022, 2:00오후 UTC](https://meta.discourse.org/t/configure-an-s3-compatible-object-storage-provider-for-uploads/148916/354 "2022-09-21T14:00:01Z")

</div>

> [@pfaffman](#):
>
> 제목에 뭔가 문제가 있었나요?

실제 환경에서 "S3 compatible"라는 표현이 더 흔하다는 것을 발견하여, 문서 제목을 전반적으로 업데이트하는 과정에서 해당 제목을 변경했습니다. 예를 들어: [AIStor S3 API: Full AWS S3 Compatibility On-Prem | MinIO](https://min.io/product/s3-compatibility)

다만, 원본 글 본문에 다른 검색어를 포함하자는 제안은 타당하다고 생각합니다. (해당 제안은 이 글에 이미 추가했습니다.)

---

<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: [9월 21, 2022, 2:16오후 UTC](https://meta.discourse.org/t/configure-an-s3-compatible-object-storage-provider-for-uploads/148916/355 "2022-09-21T14:16:00Z")

</div>

> [@mcwumbly](#):
>
> 실제로는 "S3 호환"이라는 표현이 더 흔한 것 같습니다.

괜찮아 보입니다. 시대에 맞춰 변해야 할 것 같네요. 🤷

> [@pfaffman](#):
>
> 이를 찾을 수 있는 검색이 있나요?

네. 사실 그렇게 어렵지 않습니다. @pfaffman 님도 할 수 있습니다!

@falco:

 ![image](https://global.discourse-cdn.com/meta/original/4X/8/c/5/8c5b0f5683ad567ee581359218b41498249b279d.png)

---

<div class="post-metadata">

### Author: ![tuxed](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/tuxed/32/275571_2.png) [@tuxed](https://meta.discourse.org/u/tuxed)
#### Post date: [9월 28, 2022, 3:57오후 UTC](https://meta.discourse.org/t/configure-an-s3-compatible-object-storage-provider-for-uploads/148916/356 "2022-09-28T15:57:12Z")

</div>

안녕하세요, 혹시 Contabo Object Storage를 S3 호환 업로드로 성공적으로 사용하신 분이 계신가요? 업로드 시 URL에 리포지토리 이름이 접두사로 추가되는 것 같습니다.

예를 들어, community라는 이름의 버킷을 사용하면 [https://community.eu2.contabostorage.com과](https://community.eu2.contabostorage.xn--com-rg8l) 같은 URL이 생성됩니다.

Duplicati 같은 프로그램에서 이러한 동작을 확인했지만, 도메인에 버킷 이름을 접두사로 붙이는 것을 제외할 수 있습니다.

이 Object Storage는 가격이 매우 저렴해서 사용할 수 있는 해결책이 있다면 정말 감사하겠습니다.

Cloudflare에서 제 도메인으로 CNAME을 설정하여 SSL을 제공하기 위해 여러 테스트를 해보았지만, community.cdn.midominio.com의 경우 SSL 인증서가 더 이상 적용되지 않습니다. 와일드카드 인증서를 사용하기 때문이며, Cloudflare 프록시를 비활성화하면 인증서가 올바르지 않다는 오류가 발생합니다.

감사합니다,

---

<div class="post-metadata">

### Author: ![Falco](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/falco/32/179432_2.png) [@Falco](https://meta.discourse.org/u/Falco)
#### Post date: [9월 28, 2022, 5:19오후 UTC](https://meta.discourse.org/t/configure-an-s3-compatible-object-storage-provider-for-uploads/148916/357 "2022-09-28T17:19:04Z")

</div>

S3 CDN 설정을 `https://community.eu2.contabostorage.com`으로 변경해 보셨나요? 제 생각에는 그렇게 하면 작동할 것 같습니다.

---

<div class="post-metadata">

### Author: ![tuxed](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/tuxed/32/275571_2.png) [@tuxed](https://meta.discourse.org/u/tuxed)
#### Post date: [9월 28, 2022, 7:56오후 UTC](https://meta.discourse.org/t/configure-an-s3-compatible-object-storage-provider-for-uploads/148916/358 "2022-09-28T19:56:53Z")

</div>

> [@Falco](#):
>
> [https://community.eu2.contabostorage.com](https://community.eu2.contabostorage.com)

존재하지 않습니다. `eu2.contabostorage.com`는 Contabo의 엔드포인트입니다.

---

<div class="post-metadata">

### Author: ![Falco](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/falco/32/179432_2.png) [@Falco](https://meta.discourse.org/u/Falco)
#### Post date: [9월 28, 2022, 8:02오후 UTC](https://meta.discourse.org/t/configure-an-s3-compatible-object-storage-provider-for-uploads/148916/359 "2022-09-28T20:02:47Z")

</div>

네, 하지만 버킷에 있는 예시 파일의 최종 URL은 어떻게 될까요?

---

<div class="post-metadata">

### Author: ![tuxed](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/tuxed/32/275571_2.png) [@tuxed](https://meta.discourse.org/u/tuxed)
#### Post date: [9월 29, 2022, 5:30오후 UTC](https://meta.discourse.org/t/configure-an-s3-compatible-object-storage-provider-for-uploads/148916/360 "2022-09-29T17:30:19Z")

</div>

![](https://global.discourse-cdn.com/meta/original/4X/d/3/0/d300673fcd5f1b6297a58a0bd49b3a91ff7f2182.png)

```plaintext
![](upload://u6BBQfNFGrA4yuaLeqABnVkt87U.png)

```

---

<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: [9월 30, 2022, 10:36오전 UTC](https://meta.discourse.org/t/configure-an-s3-compatible-object-storage-provider-for-uploads/148916/361 "2022-09-30T10:36:07Z")

</div>

그의 말은, 당신이 직접 버킷에 파일을 업로드할 때(파일을 업로드할 수 있는 어떤 도구를 사용하든) 그 파일에 액세스하려면 어떤 URL을 사용해야 하느냐는 것입니다.

---

<div class="post-metadata">

### Author: ![tuxed](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/tuxed/32/275571_2.png) [@tuxed](https://meta.discourse.org/u/tuxed)
#### Post date: [9월 30, 2022, 10:38오전 UTC](https://meta.discourse.org/t/configure-an-s3-compatible-object-storage-provider-for-uploads/148916/362 "2022-09-30T10:38:54Z")

</div>

`https://eu2.contabostorage.com/9198f3bf2d6e43dd86fab037ebad3aee:comunidad/castopod-1.png`

구조는 다음과 같습니다.

**호스트:** [https://eu2.contabostorage.com/](https://eu2.contabostorage.com/)  
**사용자:** 9198f3bf2d6e43dd86fab037ebad3aee  
**버킷:** comunidad  
**파일:** castopod-1.png

---

<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: [9월 30, 2022, 10:43오전 UTC](https://meta.discourse.org/t/configure-an-s3-compatible-object-storage-provider-for-uploads/148916/363 "2022-09-30T10:43:07Z")

</div>

그것은 작동하지 않는 URL입니다. 하지만 그 콜론을 슬래시로 바꾸면 작동할 수도 있겠네요.

첫 번째 게시물에서 설명한 방식과 다르네요. 그래서 이번에는 그가 다른 제안을 할 수 있을지도 모릅니다.

---

<div class="post-metadata">

### Author: ![Falco](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/falco/32/179432_2.png) [@Falco](https://meta.discourse.org/u/Falco)
#### Post date: [9월 30, 2022, 2:05오후 UTC](https://meta.discourse.org/t/configure-an-s3-compatible-object-storage-provider-for-uploads/148916/364 "2022-09-30T14:05:07Z")

</div>

다음과 같이 설정을 시도해 보세요.

```plaintext
  DISCOURSE_S3_CDN_URL: "https://eu2.contabostorage.com/9198f3bf2d6e43dd86fab037ebad3aee:comunidad"

```

그 후 다시 빌드해 주세요.

---

<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: [10월 2, 2022, 7:28오후 UTC](https://meta.discourse.org/t/configure-an-s3-compatible-object-storage-provider-for-uploads/148916/365 "2022-10-02T19:28:39Z")

</div>

Cloudflare의 R2가 마침내 공개적으로 사용 가능해졌습니다(대략 1년이 걸렸다고 하네요). (원래 발표 링크: [Announcing Cloudflare R2 Storage: Rapid and Reliable Object Storage, minus the egress fees | Cloudflare Blog](https://blog.cloudflare.com/introducing-r2-object-storage/))

저는 버킷을 생성했습니다.

다음과 같은 권한을 포함하는 [토큰](https://developers.cloudflare.com/r2/data-access/s3-api/tokens)을 생성했습니다: “Edit: 모든 객체에 대한 편집 액세스 허용 및 모든 버킷에 대한 List, Write, Delete 작업 허용”

다음과 같은 설정을 시도해 보았습니다:

```plaintext
  DISCOURSE_USE_S3: true
  DISCOURSE_S3_REGION: auto
  DISCOURSE_S3_ACCESS_KEY_ID: redacted
  DISCOURSE_S3_SECRET_ACCESS_KEY: redacted
  DISCOURSE_S3_CDN_URL: https://pub-72eaa03782c542edbe00598fd1666be1.r2.dev
  DISCOURSE_S3_BUCKET: lc-testing
  DISCOURSE_S3_BACKUP_BUCKET: lc-testing/backups
  DISCOURSE_BACKUP_LOCATION: s3
  DISCOURSE_S3_ENDPOINT: https://cb46accbfcc3db1bdbba2bce07f8b509.r2.cloudflarestorage.com
  DISCOURSE_S3_INSTALL_CORS_RULE: false
  DISCOURSE_S3_CONFIGURE_TOMBSTONE_POLICY: false
  FORCE_S3_UPLOADS: 1

```

그러나 업로드 시 다음 오류가 발생했습니다:

```plaintext
Aws::S3::Errors::NotImplemented: Header 'x-amz-acl' with value 'public-read' not implemented

```

그 후, [Public buckets · Cloudflare R2 docs](https://developers.cloudflare.com/r2/data-access/public-buckets/#enable-public-access-for-your-bucket%EC%97%90) 설명된 대로 버킷을 공개로 설정해야 한다는 것을 기억해냈습니다.

하지만 여전히 작동하지 않았습니다.

[https://developers.cloudflare.com/r2/data-access/s3-api/api/에서](https://developers.cloudflare.com/r2/data-access/s3-api/api/%EC%97%90%EC%84%9C) `x-amz-acl`이 구현되지 않았음을 확인할 수 있습니다.

Discourse 코드를 살펴보니, 코어 변경 없이 R2를 작동시킬 수 있는지 명확하지 않습니다.

업로드를 비활성화한 후에도 백업은 작동하므로, R2는 S3 백업을 매우 저렴하게 사용할 수 있는 방법인 것으로 보입니다. 하지만 해당 버킷을 공개로 설정했기 때문에 백업 파일도 공개되었습니다(파일 이름을 추측할 수 있다면). 따라서 이 문제가 해결된다면 백업과 업로드를 위한 별도의 버킷을 사용해야 할 것입니다.

다음 링크의 줄을 제거한 후 파일이 업로드되었음을 확인했고, `s3_cdn_url`로 커스텀 도메인을 사용하여 파일에 액세스할 수 있었습니다. (s3 rake task에 유사한 수정을 적용하면 에셋이 업로드되도록 할 수 있습니다.)

> <https://github.com/discourse/discourse/blob/main/lib/file_store/s3_store.rb#L87>

---

<div class="post-metadata">

### Author: ![Falco](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/falco/32/179432_2.png) [@Falco](https://meta.discourse.org/u/Falco)
#### Post date: [10월 2, 2022, 7:33오후 UTC](https://meta.discourse.org/t/configure-an-s3-compatible-object-storage-provider-for-uploads/148916/366 "2022-10-02T19:33:21Z")

</div>

> [@pfaffman](#):
>
> 이 줄을 제거한 후 파일이 업로드되는 것을 확인할 수 있었습니다.

그러므로 그들이 객체 수준 ACL을 구현할 때까지 OP에서 이를 비호환으로 표시하는 것으로 하겠습니다. 테스트해 주셔서 감사합니다!

---

<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: [10월 2, 2022, 7:35오후 UTC](https://meta.discourse.org/t/configure-an-s3-compatible-object-storage-provider-for-uploads/148916/367 "2022-10-02T19:35:46Z")

</div>

맞아요. ACL 설정을 건너뛰게 하려면 코어에 필요한 변경 사항이 꽤 복잡해 보입니다. 백업 용도로만 사용한다면 괜찮다고 볼 수 있죠. 버킷을 공개하기 위해 복잡한 절차를 거치지 않는다면 문제없을 겁니다.

---

<div class="post-metadata">

### Author: ![tuxed](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/tuxed/32/275571_2.png) [@tuxed](https://meta.discourse.org/u/tuxed)
#### Post date: [10월 3, 2022, 6:57오전 UTC](https://meta.discourse.org/t/configure-an-s3-compatible-object-storage-provider-for-uploads/148916/368 "2022-10-03T06:57:35Z")

</div>

![image](https://global.discourse-cdn.com/meta/original/4X/0/7/d/07d4a153d5435af866d6963bd2c25a0f316a3abc.png)

문제는 s3 엔드포인트입니다

---

<div class="post-metadata">

### Author: ![Falco](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/falco/32/179432_2.png) [@Falco](https://meta.discourse.org/u/Falco)
#### Post date: [10월 11, 2022, 12:39오전 UTC](https://meta.discourse.org/t/configure-an-s3-compatible-object-storage-provider-for-uploads/148916/369 "2022-10-11T00:39:14Z")

</div>

> [@pfaffman](#):
>
> 이 라인을 제거한 후 파일이 업로드되었음을 확인했고, `s3_cdn_url`을 커스텀 도메인으로 사용하여 파일에 접근할 수 있었습니다. (s3 rake 작업에 비슷한 수정을 적용하면 에셋이 업로드됩니다.)

방금 R2를 테스트해 보았는데, 문서에는 그렇게 되어 있지만 “Content-Encoding” 정보를 존중하지 않는 것 같습니다. 아마 1년 후에야 사용 가능할지도 모르겠습니다.

---

<div class="post-metadata">

### Author: ![teward](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/teward/32/148702_2.png) [@teward](https://meta.discourse.org/u/teward)
#### Post date: [11월 4, 2022, 4:29오후 UTC](https://meta.discourse.org/t/configure-an-s3-compatible-object-storage-provider-for-uploads/148916/370 "2022-11-04T16:29:37Z")

</div>

MinIO 또는 일반 섹션에 경고 문구를 추가해야 합니다. "Discourse는 S3 호환 저장 시스템의 경로에 DNS 모드를 사용합니다. 백엔드가 버킷 경로에 대해 경로 모드(path-mode)만 지원하고 DNS 모드를 지원하지 않는 경우, 이는 Discourse와 호환되지 않습니다."라는 안내 문구를 여기에 작성해야 합니다. 이것이 MinIO가 _처음에는_ 목록에 포함되지 않았다가 나중에 추가된 이유입니다.

또한 MinIO Storage Server 섹션도 업데이트해야 합니다. 단서 #2에 다음 내용이 명시되어야 합니다:

> 1. MinIO 구성에서 도메인 기반 버킷 경로를 위해 도메인 지원(Domain Support)이 활성화되어 있어야 합니다. 이는 **필수** 사항이며, Discourse는 S3 저장 메커니즘에서 도메인이 아닌 경로 기반 버킷 경로를 지원하지 않기 때문입니다.

_ **수정** _: 이 게시글 덕분에 회원 상태(신뢰 수준 2)가 되어서 이제 위키 게시글을 직접 수정할 수 있게 되었습니다. 수정을 요청했음에도 불구하고, 관리자의 조치는 필요 없습니다.

---

<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: [11월 4, 2022, 4:39오후 UTC](https://meta.discourse.org/t/configure-an-s3-compatible-object-storage-provider-for-uploads/148916/371 "2022-11-04T16:39:20Z")

</div>

> [@teward](#):
>
> 이 게시글 덕분에 멤버 상태(신뢰 수준 2)를 얻게 되어 이제 위키 게시글을 수정할 수 있게 되었습니다.

멋지네요! 최신 정보를 유지해 주셔서 감사합니다. 그런 경고가 있으면 좋겠다는 생각이 드네요.

🥂 🤲

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

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