BunnyCDN과 함께 BackBlaze S3 설정하기

이 모든 것을 어떻게 해야 하는지 파악하는 데 정말 오랜 시간이 걸렸기 때문에, 다른 사람들에게 더 쉽게 이해할 수 있도록 이 가이드를 작성했습니다. 이미지를 이런 방식으로 서빙하면 웹사이트가 더 빠르게 로드되도록 설계되어 있습니다. 제 Discourse 설정은 DigitalOcean 드롭렛, Backblaze B2 S3, BunnyCDN, 그리고 Cloudflare의 무료 버전을 조합하여 사용하고 있습니다.

신뢰성, 가격, 벤치마크에 대해 조금 조사한 후 이 서비스들을 선택했습니다. 제 기준에서 가장 좋은 옵션들이라고 생각했습니다. Cloudflare는 보안을 도와주지만, 제 이해로는 사이트 속도를 약간 늦추기도 하므로 이 점도 확인해 보시는 것이 좋습니다. Backblaze는 Cloudflare와 Bunny 모두와 파트너십을 맺고 있어 무료 데이터 전송을 허용합니다.

Cloudflare는 CDN이라고 불리지만, 일반적인 CDN처럼 작동하지 않으며, Discourse에서 S3를 설정하는 데 단독으로 사용될 경우 제대로 작동하지 않을 가능성이 높습니다. 아마도 BunnyCDN과 같이 다른 CDN 제공사가 필요할 것입니다. Cloudflare만으로도 성공적으로 설정한 분이 있다면 방법을 알려주세요 :stuck_out_tongue:

S3 업로드 설정 방법:
먼저 Backblaze에 가입하고, 버킷을 생성한 다음 해당 세부 정보를 Discourse 설정에 입력해야 합니다:

그 다음 BunnyCDN에 가입하고 다음 가이드를 따르세요:

bunny.net - The Global Edge Platform that truly Hops (추천 링크, 제 청구서에 20달러 크레딧이 적용됩니다)

BunnyCDN 풀 존(pull zone)을 생성한 후에는 Discourse 관리자 백엔드 설정의 "s3 cdn url"에 삽입할 올바른 URL을 가져와야 합니다. bunnycdn 대시보드 > 풀 존 > 풀 존 관리 > 해당 존 클릭 > “host name” 옆의 URL을 복사하세요.

URL은 example.b-cdn.net과 같은 형태여야 하며, 앞에 https://를 붙여 https://example.b-cdn.net과 같이 입력해야 합니다.

Discourse 관리자 설정 영역에서 변경 사항을 저장하세요.

브라우저에서 Discourse 사이트에서 Ctrl+F5를 두 번 누르세요.

Discourse 텍스트 작성기에 이미지를 업로드하여 테스트를 수행하세요. 테스트 이미지 요소를 검사하거나 이미지 소스를 확인하여 작동하는지 확인하세요. URL은 일반적인 도메인과 다르게 보이며, example.b-cdn.net / filename과 같은 형태여야 합니다.

이제 누군가 이미지를 업로드할 때마다 해당 이미지는 DigitalOcean 드롭렛의 공간을 차지하지 않고 Backblaze 버킷에 저장됩니다 :stuck_out_tongue:

S3로 백업 업로드하기
Discourse 백업을 Backblaze 버킷으로 보내고 싶다면 다음을 수행해야 합니다:

이 스레드 위에서 제가 게시한 가이드를 참고할 때, 두 개의 별도 버킷이 필요하다는 설명에 주의하세요. 한 버킷은 공개(public) 버킷으로, 사용자가 포럼에 이미지를 업로드하는 용도로 사용됩니다. 다른 버킷은 비공개(private) 버킷으로, 백업용 버킷입니다. 무엇이든 깨질 경우에 대비해 Discourse의 자동 백업을 설정하는 것이 중요하며, 이렇게 하면 백업을 로드하여 수정할 수 있습니다.

BunnyCDN 대시보드에서 두 번째 풀 존을 생성해야 합니다. 첫 번째 풀 존은 업로드용이었지만, 이 새로운 풀 존은 백업용으로 사용됩니다.

bunnycdn 대시보드 > 풀 존 > 풀 존 추가

앞서 링크한 BunnyCDN의 “How to Speed up your Backblaze B2 file delivery with BunnyCDN” 가이드를 그대로 따르되, 이번에는 업로드 버킷 대신 백업 버킷에 새로운 풀 존을 연결해야 합니다.

BunnyCDN 풀 존 생성 페이지에서 “high volume tier 5$/TB” 사용을 권장합니다. 업로드 버킷에 사용했던 더 비싸고 빠른 "standard tier 10$/TB"는 백업에는 필요하지 않다고 생각합니다.

Discourse 관리자 설정 영역에서 백업 설정을 구성하세요. "backup location"은 S3로 설정하고, "s3 endpoint"는 Backblaze에서 확인한 값, 예를 들어 다음과 같은 값으로 설정해야 합니다:
s3.us-west-002.backblazeb2.com

캐시를 지우기 위해 웹사이트에서 Ctrl+F5를 두 번 누르세요.

백업을 시작하고 완료되도록 두세요. 그런 다음 5분 정도 기다린 후 Backblaze 백업 폴더를 확인하면 새로운 백업을 볼 수 있어야 합니다.

기존 이미지 마이그레이션:
이 단계는 선택 사항이지만 권장되며, 특히 서버 저장 공간이 부족한 경우입니다. 이제 새 이미지 업로드를 위한 모든 설정이 완료되었지만, 기존 이미지들도 버킷으로 이전할 수 있습니다. 이 프로세스가 작동하려면 다음을 따르세요:

Cloudflare CDN 설정
Backblaze가 Bunny로의 데이터 전송을 무료로 제공하는 파트너십을 맺었기 때문에 이 단계는 선택 사항입니다. 하지만 추가적인 보안 및 기타 기능을 위해 데이터를 먼저 Cloudflare를 통해 지나가게 한 다음, Bunny가 Cloudflare가 데이터를 전달하는 위치에서 데이터를 가져오도록 설정할 수 있습니다.

https://help.backblaze.com/hc/en-us/articles/217666928-Using-Backblaze-B2-with-the-Cloudflare-CDN

8개의 좋아요

빌이 한 것처럼 나도 똑같이 해봤는데, 실제로 작동한다는 걸 확인했습니다! 다만 새로운 파일에는 작동하지만 기존 파일에는 작동하지 않는다는 점이 단점입니다. 빌의 방법의 좋은 점은 리빌드조차 필요하지 않았다는 것입니다. 하지만 누군가가 기존 파일도 S3에서 작동하도록 하는 방법을 찾아주길 바랍니다.

참고로 백업도 작동하지 않습니다. 적어도 제 경우에는 빌과 완전히 똑같은 절차를 따랐는데도 작동하지 않았습니다.

5개의 좋아요

rake 작업을 사용하여 기존 파일을 마이그레이션할 수 있습니다.

1개의 좋아요

이 명령어를 말씀하시는 거라면, 이미 시도해 봤는데 이전 자산이 업로드되지 않았습니다:

sudo -E -u discourse bundle exec rake s3:upload_assets

게시물을 다시 생성(rebake)해 보기도 했는데, 역시 효과가 없었습니다.

작업은 다음과 같습니다:

cd /var/discourse
./launcher enter app
rails c
rake uploads:migrate_to_s3
cd /var/discourse
./launcher enter app
rails c
rake uploads:migrate_from_s3

@AntiMetaman 님, 이렇게 하면 되나요?
되시면 가이드에 추가하겠습니다.

백업이 올바르게 작동하도록 하는 방법을 알아보고, 그 내용도 가이드에 업데이트할 예정입니다. 두 번째 pull zone을 만들어야 한다는 것은 확실합니다.

저는 Backblaze로 백업이 정상적으로 작동하고 있습니다 … 어떤 문제를 겪고 계신가요?

1개의 좋아요

저도 이 방법으로 백업이 정상적으로 작동하고 있습니다. 설정이 잘못되어 있을 가능성이 높아요. 제가 백업을 어떻게 설정했는지 바로 가이드에 업데이트하겠습니다. @AntiMetaman

죄송하지만 무슨 말씀인지 잘 모르겠어요? 제가 무언가를 잘못 설정했다는 건데, 왜 제 쪽에서는 아무 문제 없이 잘 작동하고 있는 건가요?

@itsbhanusharma에게 말씀드리고 있습니다. 제 백업이 작동하지 않습니다. 제 설정은 Bill의 것과 동일합니다. 다만 백업 버킷을 위해 별도의 풀 존을 사용하지는 않았기 때문에 그 때문일 수도 있습니다. 저는 환경 변수에 백업 버킷 이름만 입력해 두었습니다.

나중에 Bhanu의 제안대로 S3 자산을 마이그레이션해 보겠습니다.

버킷(업로드 및 백업) 각각에 대해 두 개의 pull zone을 생성했습니다. 관리 패널에서 백업을 시작했지만 실패했습니다. Discourse가 아는 것은 백업 버킷 이름뿐입니다.

DISCOURSE_S3_CDN_URL: https://duelistsunite.b-cdn.net
DISCOURSE_S3_BUCKET: s3omega
DISCOURSE_S3_BACKUP_BUCKET: s3omegabackup
DISCOURSE_BACKUP_LOCATION: s3

여기서 무엇을 놓치고 있는지 확실하지 않습니다. 백업의 URL이 다르기 때문에 S3_CDN_BACKUP_URL이라는 것이 존재합니까?

@itsbhanusharma 또한, 말씀하신 방법을 시도해 보았지만 migrate_from_S3는 정의되어 있지 않습니다(undefined).

또한, migrate_to_s3를 말씀하신 것인지 확실하지 않아서 이것도 시도해 보았지만, 이것 역시 정의되어 있지 않았습니다.

혼동해서 죄송합니다. rake uploads:migrate_to_s3라고 말씀드린 것입니다.

1개의 좋아요

URL에 amazonaws.com을 추가하기 때문에 rake가 중단되는 것 같습니다. 실제로는 이것이 잘못된 것입니다. 이것이 문제입니다. Amazon이 아닌 S3를 사용하면 rake가 URL 변경이 하드코딩되어 있어 작동하지 않습니다.

1개의 좋아요

app.yml의 env 섹션에 설정을 추가했는지, 아니면 admin > settings 페이지에 설정을 추가했는지 확인해 주시겠습니까?

S3를 백업용으로 설정하여 정상적으로 작동하도록 했습니다. 따라서 S3를 이용한 기존 업로드와 새 업로드 모두 정상적으로 작동합니다. SSL과 DDoS 방어에는 Cloudflare를, 업로드 및 백업 풀 존에는 BunnyCDN을, S3 스토리지에는 BackBlaze를 사용하고 있습니다. 이제 모든 것이 정상적으로 작동합니다!

참고로, 환경 변수는 아래 링크에 나와 있는 것처럼 app.yml 파일에서 정의하는 것이 좋습니다: Configure an S3 compatible object storage provider for uploads

그 후 다시 빌드(rebuild)하여 S3 설정이 관리자 패널에만 있는 것이 아니라 전역적으로 정의되도록 하세요. 이렇게 하면 기존 파일을 S3로 마이그레이션할 때 다음 3개의 명령어로 더 쉽게 처리할 수 있습니다:

./launcher enter app
rake uploads:migrate_to_s3
rake posts:rebake

3개의 좋아요

여기서 무엇을 놓치고 있는지 모르겠습니다. 백업용 URL이 다르기 때문에 S3_CDN_BACKUP_URL이 존재합니까?

이 질문에 대한 해결책을 찾았나요? 저는 백업 버킷을 가리키는 풀 존(pull zone)의 URL을 어디에 입력해야 할지 명확하지 않습니다.

수정: CDN은 업로드 버킷에만 필요한 것으로 이해하는 것이 맞나요? 이 주제에 대한 가이드에서는 백업 버킷을 위해 두 번째 CDN 풀 존을 생성해야 한다고 제안하고 있습니다. 만약 제 이해가 틀렸다면, 가이드를 업데이트해야 할 것 같습니다 @Bill

보관소 버킷 이름만 있으면 되는 것 같습니다. 이름만 있으면 업로드 URL과 이름만 다를 뿐 나머지는 동일하므로 백업 S3 URL을 얻을 수 있습니다. 따라서 별도의 S3 백업 URL을 정의할 필요가 없는 것입니다. 물론 이는 두 버킷이 동일한 S3 서비스에 있는 경우를 전제로 합니다.

하지만 백업 버킷이 비공개라면 CDN이 어떻게 액세스할 수 있을까요? 저는 CDN에 대해 잘 알지 못해서 무언가를 놓치고 있을 수도 있지만, Discourse가 백업에 CDN을 전혀 사용하지 않는다고 의심합니다.

그렇습니다. 백업 버킷을 확인해 보니 백업이 정상적으로 업로드되어 있었습니다. 버킷은 비공개로 설정되어 있지만, Discourse는 이를 접근할 수 있습니다. URL이 존재하는 경우 권한을 설정할 수 있으며, 자신의 사이트만 버킷에 접근하도록 하거나 모든 HTTPS 소스에서 접근할 수 있도록 설정할 수도 있습니다.

백업이 CDN을 통해 이루어졌는지, 아니면 Discourse 설치 환경에서 BackBlaze B2로 직접 전송되었는지 확인해 주실 수 있나요?