メインコンテンツまでスキップ

検索インフラ調査(2026-04-08)

背景

既存の 02-cost-estimation.md では Meilisearch のコストを「動画1本 = 1ドキュメント」で試算していたが、実際にはセグメント単位(1動画あたり約500セグメント)で投入するため、ドキュメント数が想定の500倍になる。これにより Meilisearch のコストが1〜2桁過小評価されていることが判明した。

本ドキュメントは、R2・Meilisearch・代替検索エンジンの役割分担とコスト構造を整理し、今後のアーキテクチャ判断の材料とする。


1. 各ストレージの役割

確定した役割分担

ストレージ役割保存するデータ
Cloudflare R2字幕のプライマリストレージ(原本)タイムスタンプ付き字幕JSON(セグメント単位)
Meilisearch検索インデックス + ドキュメント保持検索に必要なフィールドを含むセグメント単位のドキュメント
Tursoリレーショナルデータチャンネル・動画メタデータ、ユーザー情報、クレジット管理

R2の位置づけに関する訂正

04-data-strategy.md では R2 を「バックアップ」と記載しているが、実際はプライマリストレージとして機能する。理由:

  • Meilisearch は投入したドキュメントの元データを必ず内部保持する(インデックスだけの保存は技術的に不可能)
  • そのため R2 は「Meilisearch が壊れた場合の復旧元」かつ「UI表示用の詳細データ取得先」として機能する
  • YouTube API から再取得する方法もあるが、APIクォータ消費と時間がかかるため、R2 からの再インデックスの方が実用的

字幕の保存先: R2 vs Turso

字幕データは「動画ID → JSON」のキーバリューアクセスのみで SQL は不要。コスト面でも R2 が圧倒的に有利。

規模R2 月額Turso 月額(Scaler $29基本料含む)
10万動画(1GB)≈$0(無料枠内)$29
100万動画(10GB)$0.78$29
1000万動画(100GB)$7.80$67

2. Meilisearch のストレージ構造

「インデックスだけ保存」は不可能

Meilisearch にドキュメントを追加すると、以下が両方とも保存される:

  1. 転置インデックス — トークン → ドキュメント位置のマッピング(検索用)
  2. 元のドキュメント全文 — 検索結果として返すために必要(LMDB に保存)

displayedAttributessearchableAttributes の設定で表示・検索対象を絞っても、内部ストレージに保存されるデータ量は変わらない

ディスク使用量

Meilisearch のディスク使用量は元データの約3〜8倍(ドキュメント圧縮・zstd適用後で約3倍、未圧縮で5〜8倍)。圧縮は10,000ドキュメント以上で自動有効化される。

コスト削減の方法

Meilisearch のストレージコストを下げるには、投入するJSON自体を小さくするしかない:

  1. 不要なフィールドを投入しない
  2. フィールド名を短くする(効果小)
  3. セグメントをまとめて投入する(後述)

3. セグメント粒度とコストの関係

前提

  • youtube-transcript-plus で取得される字幕は、発話区間ごとのセグメント(開始時刻・終了時刻付き)
  • 1動画あたり平均500セグメント
  • 1セグメントの Meilisearch ドキュメントサイズ: 約300バイト

粒度別のドキュメント数

まとめ方1動画あたり10万動画100万動画
セグメント単位(現行設計)500件5,000万件5億件
30秒ごとにまとめ約50件500万件5,000万件
動画丸ごと1件1件10万件100万件

セグメント単位を採用すべき理由

30秒まとめにするとプロダクトの核心的なUXが損なわれる:

  • 検索結果に正確なタイムスタンプ(例: 2:05)を表示できない
  • 「ゴミ箱」で検索 → ヒットしたが「120〜150秒のどこか」としか分からない
  • 正確な時刻を得るには R2 から原本を取得して再検索する必要がある(二度手間)
  • チャンネル横断検索で20件ヒットすると、20件分の R2 リクエストが追加で発生

セグメント単位であれば:

  • Meilisearch のレスポンスに startTime: 125.3 が含まれ、そのまま該当時刻にジャンプ可能
  • R2 への追加リクエストは動画詳細画面の表示時のみ

4. Meilisearch ドキュメント設計

R2 に保存する原本 JSON

{
"videoId": "dQw4w9WgXcQ",
"language": "ja",
"segments": [
{ "text": "こんにちは", "start": 0.0, "end": 2.5 },
{ "text": "今日は天気がいいですね", "start": 2.5, "end": 5.3 },
...
]
}

保存先: r2://subtitles/{videoId}.json

Meilisearch に投入するドキュメント

{
"id": "dQw4w9WgXcQ_0",
"videoId": "dQw4w9WgXcQ",
"channelId": "UCuAXFkgsw1L7xaCfnd5JJOw",
"title": "動画タイトル",
"text": "こんにちは",
"startTime": 0.0,
"endTime": 2.5,
"language": "ja",
"publishedAt": 1680000000
}

フィールドの役割

フィールドsearchablefilterablesortable必要な理由
id---Meilisearch 必須の一意キー
videoId---検索結果から動画に遷移
channelId--チャンネル絞り込み
title--動画タイトルでも検索可能に
text--字幕テキスト検索(メイン)
startTime---該当箇所へのジャンプ
endTime---同上
language--言語絞り込み
publishedAt--新着順ソート

投入タイミング

  1. 初回取得: ユーザーがチャンネルを指定 → YouTube API で動画一覧取得 → 各動画の字幕を順次取得 → 1動画取得ごとに R2 保存 + Meilisearch 投入(随時。全動画完了を待たない)
  2. 差分取得: 検索時に前回取得から24時間以上経過していたら、新規動画のみ追加投入

5. Meilisearch コスト試算(修正版)

既存試算との差分

既存の 02-cost-estimation.md の前提:

項目既存試算修正後
ドキュメント粒度動画1本 = 1ドキュメント動画1本 = 500ドキュメント(セグメント単位)
100万動画のドキュメント数100万件5億件
100万動画のデータ量60GB750GB
100万動画の Meilisearch 月額$13$470〜500

Fly.io セルフホスト vs Meilisearch Cloud

セグメント単位投入、Meilisearch ディスク倍率5倍の前提:

規模ドキュメント数ディスクFly.io セルフホストMeilisearch Cloud (Resource-based)
10万動画5,000万件75GB≈$100/月≈$170/月
100万動画5億件750GB≈$500/月≈$470/月
1000万動画50億件7.5TB≈$5,500/月≈$1,500〜3,000/月

Fly.io セルフホストの内訳

規模VM(RAM/CPU)ボリューム月額
10万動画8GB RAM, 2CPU(≈$84)75GB($11)≈$100
100万動画16GB RAM, 4CPU × 2台(シャーディング必須)375GB × 2≈$500
1000万動画32GB+ RAM × 15台500GB × 15≈$5,500
  • Fly.io のボリューム上限は500GB/台。100万動画(750GB)で上限を超えるため、複数台のシャーディングが必須
  • シャーディングはアプリケーション側でのルーティング実装が必要で、運用の複雑性が大幅に増す

Meilisearch Cloud (Resource-based) の内訳

規模インスタンス追加ストレージ月額
10万動画L(8GB, $161)43GB × $0.165 = $7≈$170
100万動画XL(16GB, $353)718GB × $0.165 = $118≈$470
1000万動画カスタム要相談≈$1,500〜3,000
  • Resource-based はドキュメント数・検索回数無制限
  • ストレージは100GiB単位で自動スケール、上限なし
  • 500GB制約によるシャーディング不要

スケール別の優位性

規模有利な方理由
10万動画Fly.io単純にVM+ボリュームが安い
100万動画ほぼ同等Fly.io はシャーディングコストが乗る
1000万動画Meilisearch CloudFly.io は15台シャーディングでコスト・複雑性が爆発

Meilisearch Cloud (Usage-based) は非現実的

プランドキュメント上限超過料金5,000万セグメントの月額
Build ($30)10万件$0.30/1K件≈$15,000/月
Pro ($300)100万件$0.20/1K件≈$10,000/月

→ セグメント単位の大量ドキュメントには Usage-based は使えない。Resource-based 一択


6. 全体コストと損益(修正版)

インフラコスト合計(Meilisearch Cloud Resource-based 採用時)

規模MeilisearchR2TursoVercelFly.io API合計
10万動画 / 1,000ユーザー$170$0$0$0$2$172
100万動画 / 10,000ユーザー$470$0.78$0〜5$20$4$500
1000万動画 / 100,000ユーザー$3,000$7.80$67$20$4+$3,100

収入(03-business-model.md の試算から)

ユーザー数課金収入広告収入Stripe手数料純収入
1,000$1,280$84-$60$1,304
10,000$12,793$837-$601$13,029
100,000$127,930$8,370-$6,006$130,294

損益

規模収入コスト損益
10万動画 / 1,000ユーザー$1,304$172+$1,132
100万動画 / 10,000ユーザー$13,029$500+$12,529
1000万動画 / 100,000ユーザー$130,294$3,100+$127,194

結論: 修正後もすべてのスケールで黒字。 ただし既存試算と比べてコストが10〜100倍増加しているため、特に成長初期のマージンは注意が必要。

損益分岐点

Meilisearch Cloud $3,000/月の場合、損益分岐点は約2,500ユーザー($3,100 ÷ ユーザーあたり純収入$1.30)。動画が1000万に達する頃にはユーザーも十分いるはずなので、コストだけが先行するリスクは低い。


7. コスト構造と課金設計の乖離

問題

トリガー負担者
コスト発生(Meilisearch)チャンネルの動画がインデックスされた時サービス運営側(固定費)
収入発生(クレジット消費)ユーザーが字幕を閲覧した時ユーザー

インデックス化にコストがかかるのに、クレジットは閲覧にしか課金していない。

問題のシナリオ

Free ユーザー100人が各自1チャンネル(平均500本の動画)を登録した場合:

項目
インデックスされる動画数50,000本
Meilisearch ドキュメント数2,500万件
Meilisearch コスト≈$50/月
Free ユーザーの収入(広告のみ)≈$8/月
損益-$42/月

検討すべき対策

対策効果デメリット
チャンネル登録(インデックス化)にクレジットを消費コスト発生と課金が一致UX悪化(検索前にクレジット消費)
Free プランのチャンネル登録数に上限インデックスコスト制限無料ユーザーの体験を制限
既にインデックス済みのチャンネルのみ Free で検索可能新規インデックスのコストを課金ユーザーに限定Free の価値低下
インデックス化は遅延実行、課金ユーザー優先コスト増のペースを抑制Free ユーザーの検索体験が悪い

未決定。別途検討が必要。


8. 代替検索エンジンの調査

Vectorize + Turso 構成

Meilisearch を使わず、Vectorize(セマンティック検索)と Turso FTS5(全文検索)を組み合わせるアーキテクチャ。Turso が字幕テキストの保存と全文検索を兼ね、R2 は不要になる。

YouTube → 字幕取得

Turso(字幕テキスト + メタデータ + FTS5 インデックス)← 原本 & 全文検索

Workers AI → 埋め込みベクトル生成

Vectorize(ベクトルのみ保存)← セマンティック検索

R2 が不要になる理由

Meilisearch 構成では「Meilisearch = 検索用、R2 = 原本保存」と役割を分けていたが、この構成では Turso が原本保存と全文検索の両方を担う。字幕テキスト + タイムスタンプが Turso にあるため、UI 表示用データも Turso から取得でき、R2 に同じデータを重複保存する必要がない。

ただし Turso のストレージ単価($0.50/GB、Scaler 超過分)は R2($0.015/GB)より高いため、大規模ではストレージコストが増える点に注意。

なぜ D1 ではなく Turso か

当初 D1(Cloudflare の SQLite サービス)を検討したが、DB 容量 10GB 上限があり、5億セグメント(TB 単位)を保存できない。Turso は既に技術スタックに含まれており、ストレージ上限も大きい。Cloudflare Workers から @libsql/client/web 経由でアクセス可能。

Vectorize の料金体系

Vectorize は保存されたベクトルの次元数クエリされたベクトルの次元数に対して課金される。CPU、メモリ、インデックス数は課金対象外。

項目単価無料枠(Workers Paid)
保存された次元数$0.05 / 1億次元1,000万次元/月
クエリされた次元数$0.01 / 100万次元5,000万次元/月

注意: Vectorize に保存されるのはテキスト本体ではなく、埋め込みモデルが生成した数値ベクトル(768個の浮動小数点数など)のみ。セマンティック検索を行う限り、このベクトル保存コストは避けられない。

制限事項:

  • 1インデックスあたり最大1,000万ベクトル(複数インデックスに分割可能)
  • メタデータフィルタは1インデックスあたり最大10個
  • 短いテキスト(10〜50文字の字幕セグメント)ではコンテキスト不足によりセマンティック検索の精度が落ちる可能性がある

各サービスの料金

サービス料金
Vectorize 保存$0.05/1億次元
Vectorize クエリ$0.01/100万次元
Workers AI 埋め込み$0.012/100万入力トークン(BGE-M3)
TursoFree: 5GB / Scaler: $29/月(超過 $0.50/GB)

Meilisearch vs Vectorize + Turso の特性比較

MeilisearchVectorize + Turso
キーワード + セマンティック1つの API で両方2つのサービスを組み合わせ
スコア統合自動(semanticRatio で調整)自前で実装が必要
タイポ許容○(標準機能)△(FTS5 は限定的)
短いテキストの検索精度○(文字列レベルの曖昧検索)△(セマンティック検索は短文で精度低下)
実装コスト低い高い(統合ロジック実装が必要)
運用1サービスの管理複数サービスの管理
大規模実績あり限定的(Vectorize は新しい)
字幕原本の保存別途 R2 が必要Turso に統合(R2 不要)

推奨戦略

MVP〜成長期は Meilisearch(実績・実装の容易さ・ハイブリッド検索が1 API で完結)で開始し、スケールでコストが問題になった段階で Vectorize + Turso 構成への移行を検討する。


9. ソリューション別総合コスト比較

3つのソリューションについて、ユーザー数・動画数・収益・費用を横断的に比較する。

前提

  • セグメント粒度: 1動画あたり500セグメント
  • 埋め込みモデル: 768次元(BGE-Base 相当)
  • 収入試算は 03-business-model.md に基づく(Plus 課金率 5%、Pro 課金率 2%、広告 RPM $3)
  • Vectorize + Turso 構成では、Turso が字幕テキストの保存と全文検索を兼ねるため R2 は不要
  • Meilisearch 構成では R2 を字幕原本の保存先として使用
  • Meilisearch Cloud は Resource-based プランを採用

9.1 検索インフラコスト比較

A. Meilisearch Fly.io セルフホスト

規模ドキュメント数ディスクVMボリューム月額
10万動画5,000万75GB8GB RAM ($84)75GB ($11)≈$100
100万動画5億750GB16GB RAM × 2台 ($338)375GB × 2 ($113)≈$500
1000万動画50億7.5TB32GB+ × 15台 ($3,863)500GB × 15 ($1,125)≈$5,500

※ Fly.io のボリューム上限 500GB/台のため、100万動画以上でシャーディング(複数台分割)が必須。

B. Meilisearch Cloud(Resource-based)

規模インスタンス追加ストレージ月額
10万動画L: 8GB ($161)43GB × $0.165 ($7)≈$170
100万動画XL: 16GB ($353)718GB × $0.165 ($118)≈$470
1000万動画カスタム要相談≈$1,500〜3,000

※ ドキュメント数・検索回数は無制限。ストレージは 100GiB 単位で自動スケール。

C. Vectorize + Turso

Turso が字幕テキストの保存(原本)と全文検索(FTS5)を兼ねるため、R2 は不要。ただし Turso のストレージ単価($0.50/GB、Scaler 超過分)は R2($0.015/GB)より高い。

字幕テキスト保存による Turso ストレージ増分:

  • 10万動画: 約1GB → Free 枠内
  • 100万動画: 約10GB → Scaler 24GB 内
  • 1000万動画: 約100GB → Scaler 超過 76GB × $0.50 = $38 追加
規模Vectorize 保存Vectorize クエリTurso(メタ + 字幕 + FTS5)月額
10万動画384億次元 → $19$1$0(Free)≈$20
100万動画3,840億次元 → $192$1$29(Scaler)≈$222
1000万動画3.84兆次元 → $1,920$7$29 + $38(超過分) = $67≈$1,994

※ Vectorize はセマンティック検索のみ。キーワード全文検索は Turso FTS5 で実装。
※ Workers AI の埋め込み生成コスト(初回インデックス時)は別途発生するが、月次の継続コストは差分更新分のみ。
※ FTS5 インデックス自体がストレージを消費するため、実際の Turso ストレージはテキスト量の1.5〜2倍程度になる可能性がある。

9.2 検索インフラコスト比較表

規模Meilisearch Fly.ioMeilisearch CloudVectorize + Turso
10万動画$100$170$20
100万動画$500$470$222
1000万動画$5,500$1,500〜3,000$1,994

9.3 全体インフラコスト(検索 + 共通基盤)

共通基盤コスト(検索インフラ以外)。ソリューションによって構成が異なる:

  • Meilisearch 構成: Turso(メタデータのみ)+ R2(字幕原本)+ Vercel + Fly.io API
  • Vectorize + Turso 構成: Turso(メタデータ + 字幕を検索インフラ側に含む)+ Vercel + Fly.io API。R2 は不要

Meilisearch 構成の共通基盤:

規模Turso(メタデータ)R2(字幕原本)VercelFly.io API共通小計
10万動画 / 1,000ユーザー$0$0$0$2$2
100万動画 / 10,000ユーザー$0〜5$0.78$20$4$25〜30
1000万動画 / 100,000ユーザー$67$7.80$20$4+$99

Vectorize + Turso 構成の共通基盤(Turso・R2 コストは検索インフラ側に含まれるため):

規模VercelFly.io API共通小計
10万動画 / 1,000ユーザー$0$2$2
100万動画 / 10,000ユーザー$20$4$24
1000万動画 / 100,000ユーザー$20$4+$24

全体コスト = 検索インフラ + 共通基盤:

規模 / ユーザー数Meilisearch Fly.ioMeilisearch CloudVectorize + Turso
10万動画 / 1,000ユーザー$102$172$22
100万動画 / 10,000ユーザー$530$500$246
1000万動画 / 100,000ユーザー$5,599$1,599〜3,099$2,018

9.4 収入試算(再掲)

03-business-model.md より:

ユーザー数Plus 収入Pro 収入広告収入Stripe 手数料純収入/月
1,000$500$780$84-$60$1,304
10,000$4,995$7,798$837-$601$13,029
100,000$49,950$77,980$8,370-$6,006$130,294

9.5 損益比較(純収入 − 全体インフラコスト)

規模 / ユーザー数純収入Meilisearch Fly.ioMeilisearch CloudVectorize + Turso
10万動画 / 1,000ユーザー$1,304+$1,202+$1,132+$1,282
100万動画 / 10,000ユーザー$13,029+$12,499+$12,529+$12,783
1000万動画 / 100,000ユーザー$130,294+$124,695+$127,195〜128,695+$128,276

すべてのソリューション・すべてのスケールで黒字。 差額は収入に対して小さく、検索インフラの選択が損益を根本的に左右することはない。

9.6 利益率比較

規模 / ユーザー数Meilisearch Fly.ioMeilisearch CloudVectorize + Turso
10万動画 / 1,000ユーザー92.2%86.8%98.3%
100万動画 / 10,000ユーザー95.9%96.2%98.1%
1000万動画 / 100,000ユーザー95.7%97.6〜98.8%98.5%

9.7 総合評価

観点Meilisearch Fly.ioMeilisearch CloudVectorize + Turso
コスト(小規模)
コスト(大規模)×
実装の容易さ
セマンティック検索
タイポ許容
短文(字幕)検索精度
運用の複雑さ△(大規模でシャーディング)△(複数サービス統合)
大規模実績
スケーラビリティ×(500GB上限)

9.8 推奨

フェーズ別の推奨ソリューション:

フェーズ推奨理由
MVP〜成長期(〜10万動画)Meilisearch Fly.io セルフホスト実装が最も簡単。コスト $100/月。ハイブリッド検索が1 API で完結
成長期〜拡大期(10万〜100万動画)Meilisearch Cloud(Resource-based)Fly.io の 500GB 上限を回避。運用をマネージドに移行
大規模(100万動画〜)Meilisearch Cloud or Vectorize + Turso を検討コスト面では Vectorize + Turso が有利だが、実装の複雑さとのトレードオフ。Vectorize の成熟度と Turso FTS5 の大規模実績を見て判断

判断基準: 実装の複雑さよりコストを優先する場合は Vectorize + Turso、開発速度と検索品質を優先する場合は Meilisearch Cloud。どのソリューションを選んでも収益に対するインフラコストの比率は小さく(2〜14%)、選択を誤っても致命的にはならない。


10. その他の検索サービスの検討

Algolia代替サービスの比較記事を含む13サービスを調査したが、subseek の要件(字幕セグメント単位の大量ドキュメント、チャンネル絞り込み付きキーワード検索、セマンティック検索)に合致するものは限られた。

eコマース・企業向け(対象外)

サービス除外理由
ClickUpワークスペース内検索ツール。外部データの全文検索用途ではない
Coveoエンタープライズ検索特化。カスタム価格で小規模サービスには不向き
Bloomreacheコマースの商品検索・マーチャンダイジング特化
Constructor.ioeコマース特化。リアルタイム行動分析ベースのランキング
SearchSpringeコマースのマーチャンダイザー向け。ノーコード設定が売り
Luigi's Boxeコマース向けプラグアンドプレイ検索
Doofindereコマース向け。Basic $39/月〜

技術的に候補になりうるが不採用としたもの

サービスOSS不採用理由
TypesenseMeilisearch の直接競合だが、インデックスをメモリに保持する設計のため、5億セグメント規模ではメモリコストが高騰する(100万動画で ≈$3,000/月 vs Meilisearch $470/月)
Elasticsearch高機能だが運用が重い(クラスタ管理、シャード設計等)。マネージド(Elastic Cloud)は $500+/月〜。subseek の規模にはオーバースペック
OpenSearchElasticsearch のフォーク(AWS 主導)。同様に運用が重く、マネージド(AWS OpenSearch)も高コスト
QdrantベクトルDB 専用(Vectorize と同カテゴリ)。セマンティック検索は可能だがキーワード検索ができないため、全文検索エンジンとの併用が必須。Vectorize + Turso 構成と同じ問題を抱える
Lucene検索エンジンのライブラリであり、サービスではない。自分で検索エンジンを構築する必要があり、開発・運用コストが高すぎる
Algolia×レコード数課金($0.40/1K 件)のため、5,000万セグメントで ≈$20,000/月。論外

結論

subseek の要件を満たし、かつコスト・実装容易さ・検索品質のバランスが取れるのは Meilisearch(+ 将来的に Vectorize + Turso)のみ。主な理由:

  1. ハイブリッド検索(キーワード + セマンティック)が1つの API で完結する唯一のサービス
  2. ディスクベース(LMDB)のためメモリ依存の Typesense より大規模でコスト効率が良い
  3. Elasticsearch/OpenSearch と同等の検索機能を持ちつつ、運用がはるかにシンプル
  4. OSS でセルフホスト可能、かつマネージド(Cloud)への移行パスも明確

11. 未決定事項

項目状態影響
セグメント粒度セグメント単位で確定(UX上の理由)コスト試算の前提として確定
04-data-strategy.md の R2 記述「バックアップ」→「プライマリストレージ」に要修正ドキュメント整合性
02-cost-estimation.md の Meilisearch コストセグメント単位を反映して要修正損益試算の正確性
コスト構造と課金設計の乖離未検討Free ユーザーによるコスト増リスク
検索インフラの選定確定 — MVP〜成長期は Hetzner US セルフホスト、大規模で Meilisearch Cloud への移行を検討(セクション12参照)インフラ設計・コスト
Vectorize + Turso への将来的移行要検討(Vectorize の大規模実績、Turso FTS5 の成熟度次第)長期的なコスト最適化
Turso FTS5 の字幕データ保存可否Vectorize + Turso 採用時に検証が必要(Scaler プランのストレージ上限、FTS5 インデックスのサイズ、読取行数の課金影響)移行判断

12. 決定事項(2026-04-08)

採用技術

Meilisearch(ハイブリッド検索: キーワード + セマンティック)

採用理由

  1. セマンティック検索が必要 — YouTube 字幕は自動生成が多く、誤字・表記揺れが頻発する(例: 「ゴミ箱」→「ごみ箱」「ゴミバコ」)。キーワード完全一致だけでは取りこぼしが多く UX が悪い
  2. ハイブリッド検索が1つの API で完結 — キーワード検索とセマンティック検索のスコア統合を semanticRatio パラメータ1つで自動調整できる。他のソリューション(Vectorize + Turso 等)ではスコア統合を自前実装する必要がある
  3. ディスクベース(LMDB) — メモリ依存の Typesense と比べ、大規模(5億セグメント)でコスト効率が良い
  4. OSS でセルフホスト可能 — MVP は Fly.io で低コスト運用し、成長後にマネージド(Cloud)へ移行するパスが明確

Vectorize + Turso を不採用とした理由

理由詳細
開発工数スコア統合、インデックス分割管理、検索ルーティングの自前実装に数週間〜1ヶ月。Meilisearch なら数日
コスト差が小さい100万動画 / 1万ユーザーで年 $3,000 の差。開発工数を時給換算すると回収に数年
Vectorize の制限1インデックス1,000万ベクトル上限。100万動画(5億セグメント)で50インデックスに分割が必要
精度リスク短い字幕テキスト(10〜50文字)でのセマンティック検索精度が未知数

構成

MVP〜成長期は Hetzner US(Ashburn)でセルフホスト。 大規模(100万動画〜)で運用負荷が問題になった段階で Meilisearch Cloud への移行を検討する。

Hetzner US を選択した理由:

  • コスト差が大きい — 10万動画で月3,000〜3,750円 vs Cloud 25,500円(7〜8倍の差)
  • 機能差がない — Meilisearch 本体は同じ。ハイブリッド検索、セマンティック検索、フィルタ等すべて同一
  • レイテンシが同等 — US East 同士で Fly.io API との通信は5〜20ms
  • スペックが同等以上 — 同じ RAM 容量で CPU コア数は Hetzner の方が多い場合がある
  • 運用負荷が低い — Docker 1コマンドで起動。実際の運用は月0.5〜2時間程度(セキュリティパッチ、障害時対応)
  • 移行が容易 — Meilisearch のダンプ/インポート機能で1〜2日、4〜8万円で Cloud に移行可能。ベンダーロックインなし

BAN リスクへの対策:

  • Meilisearch ダンプを毎日 R2/S3 に自動保存 — BAN されてもデータは残る
  • Meilisearch Cloud のアカウントを持っておく — BAN 時の即移行先
  • 移行手順を事前にドキュメント化 — BAN 時に1〜2日で Cloud に復旧

規模別コスト(Hetzner US セルフホスト)

規模セグメント数ディスクHetzner US プラン月額
1,000動画50万0.75GBCPX11: 2vCPU/2GB≈750円
1万動画500万7.5GBCPX21: 3vCPU/4GB≈1,500円
10万動画5,000万75GBCPX31: 4vCPU/8GB≈3,000〜3,750円
100万動画5億750GBCPX41: 8vCPU/16GB + 590GB ボリューム≈12,000〜15,000円

参考: Meilisearch Cloud の場合は 10万動画で25,500円、100万動画で70,500円。

全体インフラ構成(確定)

YouTube → 字幕取得
→ Meilisearch on Hetzner US(検索 + セマンティック + データ保持)
→ Turso(チャンネル・動画メタデータ、ユーザー情報)
  • R2 はバックアップとして必要 — Hetzner のアカウント BAN リスクに備え、Meilisearch ダンプを毎日 R2 に自動保存する。BAN 時に Meilisearch Cloud に移行する際の復旧元として使用
  • 詳細なホスティング比較は Meilisearch ホスティング比較 を参照