서버의 용량은 미디어를 저장하기에는 턱없이 부족하다
SNS을 이용함에 있어, 용량을 많이 차지하는 부분은 글 보다는 보통 이미지나 동영상 등의 미디어가 차지하는 경우가 많습니다. 글은 1년동안 써도 얼마 안 하지니까 같은 컴퓨터의 데이터베이스에 쌓아놔도 별 문제가 없지만, 제 마스토돈 계정의 통계에 따르면 1년동안 올린 이미지 등의 미디어가 벌써 6.6기가바이트나 되거든요.
저희가 빌린 서버의 용량은 50기가바이트인데, 그마저도 운영체제 설치하지, firefish 돌리지 하면 5명만 서버를 이용해도 금세 몇 년 안에 남은 용량을 다 소진해버릴 것입니다. 그러면 서버가 죽고, 행복한 SNS 생활은 물건너가겠죠...
그래서 이미지 같은 대용량 파일들은 서버에 직접 저장하지 않고 외부 서비스인 "오브젝트 스토리지"를 사용해야 합니다.
오브젝트 스토리지, 쓴 만큼 내는 무한의 저장공간 서비스
오브젝트 스토리지(Object Storage)는 저장공간 대여 서비스의 일종입니다.
일반적인 클라우드 드라이브와 가장 큰 차이점은, "프로그램"을 위한 저장공간이라는 점입니다.
- 보통 일반 사용자가 사용하지 않고, 프로그램이 사용합니다.
- 파일 단위로 저장하고, 파일 단위로 읽어옵니다.
파일 단위로 동작하기 때문에 "오브젝트" 스토리지에요. - 프로그램용이라서 보통 UI가 제공되지 않아요.
- 파일 단위로 저장하고, 파일 단위로 읽어옵니다.
- 데이터가 어디에 저장되어있는지는 관심이 없어요.
- 데이터의 저장 장소는 서비스 운영 측이 책임져야 할 부분입니다.
- 쓴 만큼 냅니다.
- 보통은 저장하거나 읽어오는 동작 하나하나가 전부 과금 대상입니다.
- 다운로드나 업로드 등의 전송 비용도 받는다는 뜻입니다. 일반 클라우드하고는 개념이 좀 다르죠?
- 대체로 용량 제한이 없습니다.
- 무한의 저장공간인 셈이죠. 쓴 만큼 내겠지만요...
- 저장용량 부족 문제는 서비스 운영 측이 책임져야 할 부분입니다.
- 종종 저장용량의 상한이 있는 곳도 있긴 합니다.
네, 맞아요, 이런 서비스 중 하나에 가입해서 Firefish가 이미지나 동영상 등을 여기에 저장하게 할 거에요. 그럼 서버의 용량이 꽉 차서 멈출 걱정은 좀 덜어도 되겠죠?
AWS S3와 호환되는 서비스를 고르자
인터넷 쇼핑몰 아마존은 개발자나 회사를 대상으로 하는 서비스에도 강합니다.
갑자기 왜 이런 얘기가 나왔냐면, 오브젝트 스토리지의 사실상의 표준은 아마존에서 나왔기 때문이에요. 아마존 웹 서비스(AWS, Amazon Web Service) 라는 아마존의 서비스 중, 심플 스토리지 서비스(S3, Simple Storage Service) 가 가장 유명한 오브젝트 스토리지 서비스거든요.
AWS S3가 사실상의 시장 지배자인 상황이라, 대부분의 다른 서비스들은 AWS S3와 호환되는 방식의 서비스를 같이 제공합니다. 구글의 GCP도 예외는 아니구요, 네이버의 네이버 클라우드 플랫폼도, NHN의 TOAST 클라우드도 같은 방식을 제공합니다.
프로그램이 다른 프로그램을 사용할 때의 방식을 "API" (에이-피-아이, Application Programming Interface) 라고 부릅니다. 거의 모두가 아마존 S3의 API를 따르고 있는 실정이에요. 그래서 대부분이 호환이 되죠.
Firefish도 AWS S3의 API를 지원합니다. 아마존의 서비스인 S3, 혹은 S3와 호환되는 서비스를 지원하는 거죠.
선택: Cloudflare R2
데이터를 다운로드받을 때 드는 비용인 egress (송신... 서비스에서 나가니까 송신이에요) 비용이 무료인 Cloudflare R2를 사용합시다. 요즘 가격 면에서 인기있는 Backblaze B2도 있지만, 서비스로의 접속을 보호하는 과정이 생각보다 복잡해서 이번에는 배제하겠습니다.
파일을 아무리 다운로드해도 무료이므로, 다른 오브젝트 스토리지를 썼다면 "파일 대신 전달해드립니다 서비스"(CDN, Content Delivery Network) 뒤에 숨겼어야 할 오브젝트 스토리지를 그냥 인터넷에 노출해도 요금 폭탄이 나올 걱정은 없습니다. (* 다른 오브젝트 스토리지를 사용한다면, 여러분의 SNS에 파일을 올린 뒤 주소를 복사해가서 커뮤니티 같은 데 올려도 비용폭탄이 부과되지 않도록 CDN 뒤에 잘 숨겨야 합니다. 사실 Cloudflare는 유명한 CDN 업체이기도 해요.)
참고한 자료: firefish와 비슷한 SNS인 mastodon용으로 설정하는 공식 가이드
카드 등록
Cloudflare에 로그인한 뒤, 해외결제가 가능한 카드의 정보를 입력해서 자동으로 결제가 되도록 준비합시다.
(예시 이미지에는 한글로 적었는데, "성" 부분에서 두 글자 이상을 요구하니 영어로 쓰시면 될 것 같습니다. 아니면 페이팔?)
버킷 만들기
버킷을 만듭시다. 버킷(Bucket, 양동이)은 파일이 저장되는 공간이라고 생각해주시면 됩니다. 나중에 Firefish에 이 버킷의 정보를 넣어줄거에요.
이름은 마음대로 지정해도 됩니다. 혹시 모르니까 특수문자는 대시 (-) 정도만 쓰도록 합시다.
버킷을 인터넷에 공개하기
이제 인터넷에서 바로 접속할 수 있도록 도메인을 연결해줍시다.
----
----
도메인을 Cloudflare에서 관리하고 있다보니 별다른 설정 없이 바로 들어가네요. 이거 편하네요!
API 키 (비밀번호) 만들기
아까 프로그램이 다른 프로그램을 쓰는 방식을 API라고 설명했었죠?
Cloudflare R2 라는 서비스를 Firefish가 사용하려면 Cloudflare R2의 API를 Firefish가 사용해야 합니다. 누구나 사용할 수 있으면 문제가 되겠죠? 그래서 Cloudflare R2에 접근할 수 있게 해주는 API 키 (key) 를 만들어야 합니다. 자동으로 만들어지는 비밀번호에요. 다른 사람에게 공유하면 안 되겠죠?
R2의 개요화면으로 돌아가서, "R2 API 토큰 관리" 를 누릅시다.
----
---
이름은 마음대로 해도 돼요.
권한은 읽기 & 쓰기를 줘야 합니다. firefish가 이미지를 올려야 하니까 쓰기 권한도 필요하죠.
모든 버킷(저장공간)에 권한을 줘도 되고, 방금 만든 버킷에만 접근할 수 있게 설정해도 좋습니다. 상관없어요. 어차피 하나의 버킷만 쓰고 있잖아요?
TTL, 이 API 키가 유효한 기간을 말합니다. time to live죠. 종료기간을 정해줄 필요는 없습니다. 종료기간을 정하면 그 때부터 이 키로는 이미지 업로드가 안 되기 시작할거에요... 그래서 이 부분은 건드리지 않습니다.
이 API 키로 Cloudflare R2에 접근할 수 있는 컴퓨터의 주소들을 넣을...수도 있어요. 근데 어차피 키를 모르면 접근할 수 없으니 그냥 안 넣어도 상관없습니다. 이 부분도 스킵.
생성
API 키는 잘 메모해두자
API 키 생성을 완료하면 아래와 같은 화면이 나옵니다. 이 화면은 보안상의 이유로 두 번 다시 나오지 않으므로, 내용을 잘 복사해둡시다. 3가지입니다.
실수로 닫아버렸다면 API 키를 새로 만들면 되기는 합니다. 대신 기존 키는 못 쓰겠죠? 잘 메모해둡시다.
어라, 근데 3가지네요?
- 위의 1가지는 Cloudflare 의 자체 접속용 암호입니다.
- Cloudflare의 자체 기능은 안 쓸거니까 필요하지 않겠네요.
- 아래의 2가지가 우리가 필요한, 아마존 S3와 호환되는 API의 암호(API Key) 입니다.
- 두 가지 키가 모두 필요합니다. 잘 메모해둡시다.
firefish에서 오브젝트 스토리지 설정
이제 firefish 쪽에서 설정하면 됩니다.
제어판에서 오브젝트 스토리지 란을 찾아서,
다음과 같이 채워넣으면 됩니다.
- 오브젝트 스토리지 사용 -> 체크
- Base URL: 아까 연결한 도메인
- ex) https://storage-lake.naru.cafe
- Bucket (버킷): 아까 만든 버킷의 이름
- ex) firefish-storage
- 이 부분은 공개되지 않는 부분으로, firefish가 Cloudflare R2에 접속하기 위해 필요한 부분입니다.
- Prefix (프리픽스): 모든 파일을 이 폴더 아래에 저장합니다.
- 안 넣어도 될 거 같은데 그냥 넣어줬어요.
- ex) firefish-uploads
- Endpoint (엔드포인트): Firefish가 Cloudflare R2의 API를 사용하기 위한 주소입니다.
- 버킷 이름 아래에 적혀있는 주소를 넣어줍시다.
(혹은 같은 건데요, S3 API 라고 적혀있는 걸 넣으셔도 돼요) - 테스트해보니까, 끝 부분의 버킷 이름은 떼고 넣어야되더라구요.
- 버킷 이름 아래에 적혀있는 주소를 넣어줍시다.
- Region (지역): 이 옵션은 아마존 쪽의 서비스에 있는, 어느 지역에 저장할지에 관한 부분입니다. 저희는 해당하지 않습니다.
- Access Key 에 액세스 키,
Secret Key 에 비밀 액세스 키를 넣어줍니다.- 각각 ID, 암호 취급인가봐요. (저도 잘 모름)
- SSL 사용: ON으로 설정합니다. https 보안연결을 사용할지 여부입니다. 끄지 마세요
- 연결에 프록시를 사용: 이 옵션이 정확하게 뭔지는 모르겠는데 OFF로 해둡시다. Firefish가 직접 Cloudflare R2에 요청을 하고 있으니까요.
- 업로드할 때 'public-read'를 설정하기: OFF. 추측컨데, 아마존 서비스에 있는 파일별 권한 기능인 것 같습니다. 저희와는 상관없습니다.
- s3ForcePathStyle: ON. 아마존쪽 서비스의 경우, 오브젝트 스토리지에 접근할 수 있는 방식이 2가지가 있는데, Cloudflare R2 같은 호환 API는 Path Style만 지원하는 경우가 많습니다. ON으로 설정해두면 됩니다.
다 됐으면 오른쪽 위의 체크표시를 꼭 누릅시다.
이미지를 올려보고, 주소를 확인하자
이제 글쓰기 화면에서 이미지를 올려보고, 이미지를 새로운 탭에 띄워서 아까 설정한 주소로 잘 나오는지 확인해봅시다.
잘 되네요!
Cloudflare 쪽 화면에서도 폴더와 파일이 생긴 걸 확인하실 수 있습니다.
기본 설정 완료!
이제 이대로 써도 됩니다! 설정 화면을 둘러보시면서, 회원가입 가능 여부를 변경한다던가, 이것저것 꾸미셔도 상관없습니다.
next: 회원가입을 위한메일 설정
조금 더 알아봐야할 기본 설정이 있는데 바로 이메일 전송 설정입니다. 추가로 회원가입을 받거나, 비밀번호 찾기 등의 기능을 사용하려면 이메일을 전송할 수 있어야겠죠.
이메일 전송도 여러 이유로 서비스를 사용할 예정입니다. 스팸메일함으로 들어가지 않도록 만드는 게 개인에게는 굉장히 어려운 일이거든요...