본문으로 건너뛰기
← 모든 글

내 서버에서 tapeshelf 운영하기

tapeshelf는 AGPL-3.0 라이선스의 오픈 소스이고, tapeshelf.com을 돌리는 앱이 바로 내 서버에서 운영할 수 있게 될 앱이에요. 공개 저장소와 설치 가이드는 아직 나오지 않았어요. 그 전까지, 나만의 인스턴스를 운영하면 어떤 모습일지 소개할게요. 나에게 맞는지 판단하고 서버를 계획하는 데 참고하세요.

스택 하나

인스턴스는 Docker Compose 스택 하나예요.

browser ──HTTPS──► Caddy ─── 웹 앱, 보안 헤더
                     └── /api, /ws ──► api ──► Postgres, Redis
                                       worker (ffmpeg) ──► Postgres, Redis
browser ──► S3 호환 저장소: 업로드, 동영상 세그먼트, 이미지
  • Caddy는 웹 앱을 제공하고 API와 WebSocket 트래픽을 넘겨줘요. Let’s Encrypt 인증서를 알아서 받고 갱신해요. 이미 리버스 프록시를 쓰고 있다면 Caddy를 TLS 없이 그 뒤에 둘 수 있어요.
  • api는 앱이 하는 모든 일이에요. 계정, 선반, 권한 확인, 요청과 교환, 임시 링크, 동영상 키 발급이요.
  • worker는 같은 코드를 두 번째 프로세스로 실행한 것으로, ffmpeg가 든 이미지에서 돌아가요. 업로드한 파일을 정리하고 변환하고, 스트리밍용 사본을 암호화하고, 프레임과 미리보기를 만들고, 편집을 렌더링하고, 이메일과 알림을 보내요.
  • Postgres에는 데이터가, Redis에는 작업 대기열과 수명이 짧은 캐시가 있어요.
  • 일회성 migrate 컨테이너가 시작할 때마다 실행돼요. 데이터베이스 마이그레이션을 적용하고, 설정에 따라 관리자 계정을 만들고, 버킷을 준비해요. 이미지용으로 목록 조회 없는 공개 읽기, 버려진 업로드 정리 규칙, 내 도메인용 CORS를 설정해요.
  • backup 서비스가 하루에 한 번 데이터베이스를 내 버킷에 덤프하고, 최근 덤프 14개를 보관해요.

동영상은 절대 API를 거치지 않아요. 브라우저가 저장소로 바로 업로드하고 저장소에서 바로 세그먼트를 스트리밍해요. 그래서 저장소에는 브라우저가 접근할 수 있는 자체 주소가 필요해요. 조금 고민이 필요한 부분은 여기뿐이에요. 이미 쓰고 있는 S3 호환 서비스를 연결해도 되고, 같은 스택에서 저장소를 돌려도 돼요.

필요한 것

  • Docker와 Compose 플러그인이 설치된 Linux 서버. CPU 코어 2개와 RAM 4GB가 적당한 최소 사양이에요.
  • 워커의 임시 파일을 위한 디스크 공간. 동시에 처리하는 동영상마다 가장 큰 동영상의 약 2.5배가 필요해요.
  • 서버를 가리키는 도메인과 열려 있는 80, 443 포트.
  • 이메일 발송용 SMTP 계정. 인증 메일, 비밀번호 재설정, 알림을 보내요.
  • 선택: ‘Google로 로그인’을 위한 내 Google OAuth 클라이언트, 반복 가입과 새 게스트에 대한 캡차를 위한 Cloudflare Turnstile 키.

무거운 작업은 동영상 변환이에요. 1080p 이하의 H.264 동영상이 몇 가지 확인을 더 통과하면 다시 포장하기만 하면 돼서 몇 초면 끝나요. 코어 2개짜리 작은 서버에서 전체 변환을 하면 동영상 길이만큼, 때로는 그보다 오래 걸려요. 업로드한 사람은 진행 상황을 실시간으로 보면서 사이트를 계속 쓸 수 있어요.

절대 잃어버리면 안 되는 비밀 키

모든 설정은 환경 파일 하나에 있어요. 데이터베이스 비밀번호, 세션 비밀 값, 저장소 인증 정보, SMTP, 그리고 모든 동영상의 암호화 키를 만들어 내는 마스터 키예요. 자세한 내용은 tapeshelf가 동영상을 암호화하는 방법에 있어요. 운영 환경에서 API는 예시 파일의 샘플 값으로는 시작되지 않아요.

마스터 키는 만들자마자 비밀번호 관리자에 넣어 두세요. 잃어버리면 업로드한 동영상은 하나도 다시 재생되지 않고, 데이터베이스를 복원해도 소용없어요. 2단계 인증의 인증 앱 코드도 작동하지 않게 돼요. 그 비밀 값도 마스터 키로 봉인되어 있거든요.

tapeshelf.com과 다른 점

셀프 호스팅 인스턴스에는 요금제도 결제도 없어요. Free도 Pro도, 요금제 탭도, 업그레이드 안내도, 다운로드 전 대기 페이지도 없어요. 자세히 보면:

  • 직접 정하기 전까지 제한이 없어요. 기본으로 동영상 크기나 선반 용량에 한도가 없어요. 관리자는 동영상 1개당 한도 하나, 선반당 한도 하나를 모두에게 똑같이 정할 수 있어요.
  • 다운로드는 바로, 최고 속도로, 저장소에서 직접 시작돼요.
  • tapeshelf.com의 Pro 기능을 모두가 써요. 동영상 편집기, 페이지 숨기기, 임시 링크 비밀번호예요. 삭제한 동영상은 90일 동안 되돌릴 수 있어요.
  • 악용 방지는 그대로예요. 하루 요청 한도(기본 30개, 조정 가능)와 API 요청 속도 제한은 서버를 보호하기 때문에 남아 있어요.
  • 내 이름, 내 규칙. 인스턴스에는 자체 이름과 연락처 이메일이 있고, 내가 준비한 파일로 이용약관과 개인정보 처리방침을 보여 줘요. 방문자는 처음에 간단한 로그인 페이지를 봐요.

나머지는 모두 같은 앱이에요. 묶음과 카테고리가 있는 선반, 이어서 올릴 수 있는 업로드, 16프레임 미리보기, 암호화 스트리밍, 요청과 여러 차수의 교환, 게스트와의 교환, 임시 링크, 친구와 채팅, 2단계 인증(관리자는 필수), 알림, 20개 언어로 된 앱, 신고, 관리자 페이지까지요.

인스턴스는 독립된 섬이라는 점을 기억하세요. 그 인스턴스의 사람들은 서로끼리만 공유하고 교환할 수 있고, tapeshelf.com이나 다른 인스턴스의 계정과는 그럴 수 없어요.

업데이트와 백업

업데이트는 새 버전을 받아서 스택을 다시 시작하면 끝이에요. 마이그레이션은 시작할 때 적용되고, 처리 중이던 동영상은 처음부터 다시 처리돼요. 그래도 큰 업데이트 전에는 백업을 해 두세요.

데이터베이스 덤프는 매일 알아서 버킷에 쌓여요. 동영상은 이미 저장소에 있고, 그 키는 마스터 키에서 나와요. 그러니 안전하게 지켜야 할 건 버킷, 데이터베이스 덤프, 그리고 그 키 하나, 이렇게 세 가지예요.

라이선스를 한 문단으로

tapeshelf를 운영하고, 연구하고, 수정할 수 있어요. 수정한 버전을 네트워크로 다른 사람이 쓰게 한다면, AGPL에 따라 그 버전의 소스 코드를 그 사람들에게 제공해야 해요. 수정하지 않고 나, 가족, 친구를 위해 운영한다면 라이선스를 함께 두는 것 말고는 필요한 게 없어요.

언제 나오나요

곧 저장소, 미리 만든 컨테이너 이미지, 저장소·이메일·백업·문제 해결을 다루는 설치 가이드를 공개할 예정이에요. 공개하는 날 셀프 호스팅 페이지와 이 블로그에서 알려 드릴게요. 놓치지 않으려면 RSS 피드가 가장 쉬워요. 그동안 앱을 가장 빨리 써 보는 방법은 tapeshelf.com이고, 자세한 내용은 요금제에 있어요.