自分のサーバーでtapeshelfを動かす

tapeshelfはAGPL-3.0のオープンソースで、tapeshelf.comで動いているアプリをそのまま自分のサーバーで動かせるようになります。公開リポジトリとインストールガイドはまだ出ていません。それまでの間に、自分のインスタンスがどんな構成になるのかを紹介します。自分に合うかどうかを判断し、サーバーを用意する参考にしてください。
スタックは1つ
インスタンスは、Docker Composeのスタック1つで動きます。
browser ──HTTPS──► Caddy ─── Webアプリ、セキュリティヘッダー
└── /api, /ws ──► api ──► Postgres, Redis
worker (ffmpeg) ──► Postgres, Redis
browser ──► S3互換ストレージ:アップロード、動画セグメント、画像
- Caddy はWebアプリを配信し、APIとWebSocketの通信を中継します。Let’s Encryptの証明書の取得と更新も自動で行います。すでにリバースプロキシを使っているなら、その後ろにTLSなしでCaddyを置けます。
- api はアプリの機能すべてを担います。アカウント、棚、アクセス権の確認、リクエストと交換、期限付きリンク、動画の鍵の受け渡しです。
- worker は同じコードを2つ目のプロセスとして、ffmpeg入りのイメージで起動したものです。アップロードされたファイルの整理と変換、配信用コピーの暗号化、コマ画像とプレビューの作成、編集の書き出し、メールと通知の送信を行います。
- Postgres がデータを、Redis がジョブのキューと短期間のキャッシュを持ちます。
- 使い捨ての migrate コンテナが起動のたびに動きます。データベースのマイグレーションを適用し、設定に従って管理者アカウントを作り、バケットを準備します。画像は一覧なしで公開読み取りにし、放置されたアップロードを片づけるルールを置き、自分のドメイン向けのCORSを設定します。
- backup サービスが1日1回データベースのダンプをバケットに保存し、直近の14個を残します。
動画がAPIを通ることはありません。ブラウザはストレージに直接アップロードし、セグメントもストレージから直接受け取ります。そのため、ストレージにはブラウザから届く専用のアドレスが必要です。少し考える必要があるのはここだけです。すでに使っているS3互換サービスをtapeshelfにつなぐことも、同じスタックの中でストレージを動かすこともできます。
必要なもの
- DockerとComposeプラグインが入ったLinuxサーバー。CPU2コア、メモリ4GBが現実的な最低ラインです。
- ワーカーの一時ファイル用のディスク容量。並行して処理する動画1本につき、いちばん大きな動画の約2.5倍です。
- サーバーを指すドメインと、開放したポート80と443。
- メール用のSMTPアカウント。確認メール、パスワードの再設定、通知に使います。
- 必要に応じて、「Googleでログイン」用の自分のGoogle OAuthクライアントと、繰り返しの新規登録や新しいゲストに出すキャプチャ用のCloudflare Turnstileのキー。
いちばん重いのは動画の変換です。1080pまでのH.264動画で、ほかにいくつかの確認を通ったものは、パッケージし直すだけなので数秒で済みます。2コアの小さなサーバーでの完全な変換には、動画の長さと同じくらいか、それ以上の時間がかかります。アップロードした人には進み具合がリアルタイムで表示され、その間もサイトを使い続けられます。
なくしてはいけないシークレット
設定はすべて1つの環境ファイルにまとまっています。データベースのパスワード、セッションのシークレット、ストレージの認証情報、SMTP、そして各動画の暗号化の鍵を導出するもとになるマスターキーです。詳しくはtapeshelfが動画を暗号化する仕組みで説明しています。本番環境では、サンプルファイルの値のままだとAPIが起動しません。
マスターキーは、生成したらすぐにパスワードマネージャーに保存してください。なくすと、アップロード済みの動画はどれも二度と再生できず、データベースを復元しても役に立ちません。2段階認証の認証アプリのコードも使えなくなります。そのシークレットもマスターキーで暗号化されているからです。
tapeshelf.comとの違い
セルフホストのインスタンスには、プランも支払いもありません。FreeもProもなく、「プラン」タブも、アップグレードの案内も、ダウンロード前の待機ページもありません。具体的には次のとおりです。
- 制限は、自分で設定しない限りありません。 初期状態では、動画のサイズにも棚の容量にも上限がありません。管理者は、動画1本あたりと棚1つあたりの上限を1つずつ、全員共通で設定できます。
- ダウンロード はすぐに、最大速度で、ストレージから直接始まります。
- tapeshelf.comでProの機能が、全員に使えます。 動画エディター、非表示ページ、期限付きリンクのパスワードです。削除した動画は90日間復元できます。
- 不正利用への対策は残ります。 1日のリクエスト数の上限(初期値は動画30本、変更可)とAPIのレート制限はサーバーを守るためのものなので、そのまま残ります。
- 名前もルールも自分のもの。 インスタンスには独自の名前と連絡先のメールアドレスがあり、利用規約とプライバシーポリシーは用意したファイルから表示します。訪問者が最初に見るのはシンプルなログインページです。
それ以外は同じアプリです。スタックとカテゴリのある棚、途中から再開できるアップロード、16コマのプレビュー、暗号化された配信、リクエストと何往復もの交換、ゲストとの交換、期限付きリンク、友達とチャット、2段階認証(管理者は必須)、通知、20言語に対応したアプリ、報告、管理パネル。
なお、インスタンスはそれぞれ独立した島です。そこにいる人どうしでしか共有も交換もできず、tapeshelf.comやほかのインスタンスのアカウントとはやり取りできません。
アップデートとバックアップ
アップデートは、新しいバージョンを取得してスタックを再起動するだけです。マイグレーションは起動時に適用され、処理中だった動画は最初から処理し直されます。それでも、大きなアップデートの前にはバックアップを取ってください。
データベースのダンプは毎日、自動的にバケットに保存されます。動画はもともとストレージにあり、その鍵はマスターキーから導出されます。つまり、守るべきものはバケット、データベースのダンプ、そしてマスターキーの3つです。
ライセンスをひと言で
tapeshelfは、動かすことも、調べることも、変更することも自由です。変更したうえで、そのバージョンをネットワーク越しにほかの人に使わせる場合、AGPLにより、そのバージョンのソースコードを相手に提供する必要があります。変更せずに自分や家族、友達のために動かすだけなら、ライセンスを添えておく以外に必要なことはありません。
公開時期
近いうちに、リポジトリ、ビルド済みのコンテナイメージ、インストールガイドを公開します。ガイドではストレージ、メール、バックアップ、トラブルシューティングを扱います。公開当日にはセルフホストのページとこのブログでお知らせします。見逃したくなければRSSフィードがいちばん確実です。それまでは、tapeshelf.comでアプリを試すのがいちばん手軽です。詳しくは料金をご覧ください。