本文へスキップ
← すべての記事

自分のサーバーで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でアプリを試すのがいちばん手軽です。詳しくは料金をご覧ください。