コンテンツにスキップ

サーバーキャパシティ計画

対象フェーズ: PoC/Beta → Growth 最終更新: 2026-04-19 ステータス: 承認待ち

ポリシー準拠

本ドキュメントは最新インフラポリシーに準拠しています。Beta 基盤は XServer VPS 6 core / 10 GB RAM + CoreServerV2 CORE+X (6 GB)。HLS / HEIC 変換は ffmpeg / libheif を Docker ワーカーで実行するため CPU 負荷を計画に織り込んでいます。DB は MySQL(MariaDB 互換スキーマを維持)、オブジェクトストレージは Garage(S3互換 OSS)。


1. 前提条件

1.1 ユーザー規模想定

フェーズ 登録ユーザー DAU (日次アクティブ) 同時接続 期間
PoC 50〜100 20〜40 5〜10 1〜2ヶ月
Closed Beta 100〜500 50〜150 15〜40 2〜3ヶ月
Open Beta 500〜2,000 200〜600 50〜150 3〜6ヶ月
Growth 2,000〜10,000 800〜3,000 200〜800 6ヶ月〜

1.2 トラフィックパターン(PoC/Beta)

Recerdo は「旧友との Social Media」であるため、以下のパターンを想定:

時間帯 割合 特性
朝 (7-9時) 15% 通知確認・軽い閲覧
昼 (12-14時) 20% 投稿閲覧・返信
夕方〜夜 (18-23時) 50% メイン利用時間・投稿・チャット
深夜〜早朝 15% 低トラフィック(HLS 変換バッチを夜間に寄せる余地あり)

2. リクエスト量の見積

2.1 ユーザーあたりのAPI呼び出し

1セッション(平均15分)あたりの API 呼び出し:

操作 呼び出し回数 サイズ
タイムライン取得 3〜5回 10KB/回
プロフィール参照 2〜3回 2KB/回
イベント操作 1〜2回 5KB/回
通知取得 2〜3回 3KB/回
メッセージ送受信 5〜10回 1KB/回
画像アップロード(HEIC含む) 0〜1回 3MB/回
動画アップロード 0〜0.2回 30MB/回
HLS マニフェスト・セグメント取得 5〜20回(再生時のみ) 1〜2MB/回
合計 約15〜30回/セッション

2.2 RPS(Requests Per Second)計算

フェーズ DAU セッション/日 API呼出/日 ピークRPS 平均RPS
PoC 30 60 1,200 0.5 0.01
Closed Beta 100 250 5,000 2 0.06
Open Beta 400 1,200 24,000 8 0.3
Growth 2,000 6,000 120,000 40 1.4

PoC/Beta のトラフィック

API リクエスト自体は 最大でも 10 RPS 未満 で、単一 XServer VPS(6 core)で十分処理可能。ボトルネックは HLS / HEIC 変換の CPU 負荷 側にある(§3 参照)。


3. リソースサイジング(XServer VPS 6 core / 10 GB)

3.1 Beta: 単一 VPS 構成

┌───────────────────────────────────────────────────┐
│     XServer VPS: 6 core / 10 GB RAM               │
│                                                   │
│  ┌──────────┐  CPU: 0.1 core                      │
│  │ Traefik  │  RAM: 80MB                          │
│  └────┬─────┘                                     │
│       │                                           │
│  ┌────▼────────────────────────┐                  │
│  │  Go/Node Services (Docker)  │                  │
│  │  ├─ auth-svc      0.2 core  │                  │
│  │  ├─ core-svc      0.4 core  │                  │
│  │  ├─ event/timeline 0.4 core │                  │
│  │  ├─ album-svc     0.2 core  │                  │
│  │  ├─ messaging-svc 0.3 core  │                  │
│  │  ├─ notif-svc     0.2 core  │                  │
│  │  ├─ audit-svc     0.1 core  │                  │
│  │  ├─ permission    0.1 core  │                  │
│  │  ├─ admin-console 0.1 core  │                  │
│  │  └─ flipt         0.1 core  │                  │
│  │  小計: ~2.1 core / 2.0 GB   │                  │
│  └─────────────────────────────┘                  │
│                                                   │
│  ┌─────────────────────────────┐                  │
│  │ Media Transcoder Workers     │                  │
│  │  ├─ ffmpeg-hls   1.5 core   │ ★ CPU重           │
│  │  └─ libheif       0.3 core  │                  │
│  │  小計: ~1.8 core (burst 3c) │                  │
│  └─────────────────────────────┘                  │
│                                                   │
│  ┌────────────┐  CPU: 0.8 core                    │
│  │  MySQL     │  RAM: 2.5 GB (InnoDB Pool 2GB)    │
│  │  (MariaDB互換スキーマ)                           │
│  └────────────┘                                   │
│                                                   │
│  ┌────────────┐  CPU: 0.3 core                    │
│  │  Redis 7.x │  RAM: 400 MB (+ BullMQ)           │
│  └────────────┘                                   │
│                                                   │
│  ┌────────────┐  CPU: 0.2 core                    │
│  │ Grafana Loki│  RAM: 300 MB                      │
│  └────────────┘                                   │
│                                                   │
│  空き: ~0.8 core / 4.7 GB(バースト/ピーク用)       │
└───────────────────────────────────────────────────┘

3.2 各コンポーネントのリソース配分

コンポーネント CPU予約 メモリ予約 メモリ上限 備考
Traefik 0.1 core 80MB 128MB TLS終端 + API Gateway
auth-svc 0.2 core 128MB 256MB Cognito JWT 検証
core-svc 0.4 core 256MB 512MB ユーザー・組織・イベント・タイムライン
album-svc 0.2 core 128MB 256MB Garage 署名URL + メタデータ
messaging-svc 0.3 core 256MB 512MB WebSocket + Redis Pub/Sub
notification-svc 0.2 core 128MB 256MB FCM + Postfix SMTP 送信
audit / permission / admin-console / flipt 各 0.1 core 各 128MB 各 256MB
ffmpeg HLS worker 1.5 core (burst 3) 512MB 1GB CPU 重。変換中は他サービスに影響する可能性
libheif worker 0.3 core 256MB 512MB HEIC→JPEG/WebP 変換
MySQL 8.0(MariaDB互換) 0.8 core 2.5GB 3GB innodb_buffer_pool_size=2G
Redis 7.x + BullMQ 0.3 core 400MB 768MB キュー + セッション + キャッシュ
Grafana Loki 0.2 core 300MB 512MB ログ集約
合計(定常) ~5.2 core ~6.0 GB ~9 GB 6 core / 10 GB VPS に収まる

3.3 HLS 変換の負荷戦略

ffmpeg による HLS ABR(360p/720p/1080p、6 秒セグメント)変換は CPU 非常に重い 処理。

戦略 内容
CPU Quota 設定 docker-composecpus: '2'、優先度は他サービスより低く(cpu_shares: 256
ジョブキュー経由 アップロードと変換を同期させず、Redis + BullMQ に投入。オンデマンド再生時のフォールバック変換は行わない
オフピーク寄せ 夜間帯(01:00〜06:00 JST)に未変換ジョブをバッチ処理
プリセット選定 preset=veryfast + crf=23 で速度優先。品質は preset=medium を本番フェーズで再検討
第二 VPS へのオフロード Growth フェーズで変換専用 XServer VPS を追加し、ネットワーク経由で入出力

参考: HLS 配信パイプラインの構築(ffmpeg + マイクロサービス)

3.4 Docker Compose リソース制限設定例

# docker-compose.yml (抜粋)
services:
  core-svc:
    image: recerdo/core-svc:latest
    deploy:
      resources:
        limits:
          cpus: '0.8'
          memory: 512M
        reservations:
          cpus: '0.4'
          memory: 256M
    environment:
      - GOMAXPROCS=1

  media-transcoder:
    image: recerdo/media-transcoder:latest
    deploy:
      resources:
        limits:
          cpus: '3.0'  # バースト時は 3 core まで
          memory: 1G
        reservations:
          cpus: '1.5'
          memory: 512M
    environment:
      - MEDIA_TRANSCODER=ffmpeg-hls
      - MEDIA_HLS_VARIANTS=360p,720p,1080p
      - MEDIA_HLS_SEGMENT_SEC=6

  mysql:
    image: mysql:8.0
    deploy:
      resources:
        limits:
          cpus: '1.2'
          memory: 3G
        reservations:
          cpus: '0.8'
          memory: 2.5G
    command: >
      --innodb-buffer-pool-size=2048M
      --max-connections=100
      --thread-cache-size=16
      --sql-mode=STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION
      --default-storage-engine=InnoDB

MariaDB 互換性の維持

JSON_TABLE(MySQL 8.0.4+)、一部の MySQL 専用 CHECK 制約、MySQL 独自の空間関数などは使用しない。ウィンドウ関数は MariaDB 10.6+ でも利用可のため OK。CI で MariaDB 10.6 に対する互換性テストを走らせる。参考: MariaDB vs MySQL Compatibility


4. データベースキャパシティ

4.1 データ量見積(Closed Beta: 500ユーザー)

テーブル レコード数/月 レコードサイズ 月間データ量
users 500 1KB 0.5MB
organizations 50 2KB 0.1MB
org_users 1,000 0.5KB 0.5MB
events 200 3KB 0.6MB
timeline_posts 3,000 2KB 6MB
post_media 1,500 0.5KB(メタのみ) 0.75MB
messages 10,000 1KB 10MB
album_media 2,000 0.5KB(メタのみ) 1MB
media_variants 3,000 0.3KB(HLS/HEIC 変換後メタ) 0.9MB
notifications 5,000 0.5KB 2.5MB
access_logs 50,000 0.3KB 15MB
合計 約 38MB/月

データベース容量

6ヶ月運用でも 約 230MB であり、XServer VPS 内の MySQL で十分。InnoDB Buffer Pool 2GB に対して余裕がある。

4.2 クエリパフォーマンス指標

クエリタイプ 目標レイテンシ インデックス戦略
ユーザー検索 (PK) < 1ms PRIMARY KEY
タイムライン取得 (組織別・時系列) < 10ms (org_id, created_at DESC)
イベント一覧 (組織別・日付範囲) < 5ms (org_id, start_date)
メッセージ取得 (スレッド別) < 5ms (thread_id, created_at)
通知一覧 (ユーザー別・未読) < 5ms (user_id, is_read, created_at)

5. ストレージキャパシティ(Garage on CoreServerV2 CORE+X)

5.1 オブジェクトストレージ見積

コンテンツタイプ 月間アップロード数 平均サイズ 月間データ量
プロフィール画像 100 200KB 20MB
投稿画像(オリジナル + HEIC→JPEG/WebP) 1,500 1.5MB 2.25GB
アルバム写真(オリジナル + 変換版) 2,000 2.5MB 5GB
動画(オリジナル) 200 30MB 6GB
動画(HLS マスタ + レンディション + セグメント) 200 50MB(合計) 10GB
Live Photos ペア(画像 + 短尺 HLS) 300 4MB 1.2GB
サムネイル(自動生成) 4,000 50KB 200MB
合計 約 24.7GB/月

CoreServerV2 CORE+X 容量上限

CORE+X の 6GB ストレージ枠では月産 24GB のメディアを格納しきれない。Beta では以下のいずれかを選択: - CoreServerV2 の上位プランに切替(実運用で最初に発生する制約) - メディアは XServer VPS 内 Garage(追加ディスク)へ退避、CoreServerV2 はバックアップ/メール専用 - Open Beta 以降、早期に OCI Object Storage へ移行

5.2 ストレージコスト(参考)

項目 6ヶ月累計 コスト(JPY 概算)
Garage on CoreServerV2 最大 6GB ¥1,738/月 × 6 = ¥10,428
(超過時)OCI Object Storage 約 150GB 約 ¥1,500/6ヶ月
エグレス(CDN 経由) 動画再生量次第 Cloudflare 無料枠内で吸収可

6. WebSocket キャパシティ

6.1 接続数見積

フェーズ 同時WebSocket接続 メモリ使用量 備考
PoC 5〜10 5〜10MB 1接続 ≈ 1MB (Go goroutine + buffer)
Closed Beta 15〜40 15〜40MB
Open Beta 50〜150 50〜150MB
Growth 200〜800 200〜800MB Redis Pub/Sub による分散要検討

6.2 メッセージスループット

フェーズ メッセージ/秒 帯域 処理方法
PoC/Beta 1〜5 msg/s < 50KB/s 単一Go プロセス
Growth 10〜50 msg/s < 500KB/s Redis Pub/Sub + 複数ワーカー

7. Beta インフラ選定(確定)

Beta フェーズ確定構成

  • VPS: XServer VPS 6 core / 10 GB RAM(約 ¥3,960/月)
  • レンタルサーバー: CoreServerV2 CORE+X(6 GB)(約 ¥1,738/月)
  • CDN: Cloudflare Free
  • 合計月額: 約 ¥6,000

他 VPS(Hetzner / DigitalOcean / Vultr / Linode)は検討対象外。日本リージョンかつ国内サポート・メール運用のしやすさから XServer + CoreServerV2 に確定済み。


8. 監視・アラート

8.1 Beta で最低限必要な監視

監視項目 ツール アラート閾値
CPU使用率 Prometheus + Grafana (Docker) > 80% 持続5分
メモリ使用率 Prometheus + node_exporter > 85%
ディスク使用率 node_exporter > 80%
HTTP エラー率 Traefik access log 5xx > 5%
API レスポンスタイム Go middleware (Prometheus) p95 > 500ms
MySQL 接続数 mysqld_exporter > 80 / 100
HLS 変換ジョブ遅延 BullMQ メトリクス 待機 > 5分
メール送信失敗率(Postfix) Postfix ログ + Prometheus bounce > 5%
Docker コンテナ状態 cAdvisor restart > 3/h

8.2 Beta では不要な監視

項目 理由
APM (Datadog/New Relic) 有料。Prometheus + Grafana + Loki で十分
分散トレーシング (Jaeger) サービス間通信が HTTP 直接のため不要
外部ログ SaaS Loki(OSS)で完結

9. スケールアップ判断基準

以下の閾値に達したら、次のフェーズのインフラへ移行する:

指標 閾値 アクション
CPU使用率 持続的に > 70% 第二 XServer VPS 追加(メディア変換オフロード)
メモリ使用率 持続的に > 80% VPS スペックアップ or OCI 移行
同時WebSocket接続 > 100 Redis Pub/Sub 本格活用 + メッセージング専用ノード分離
DBレコード数 > 100万行 OCI MySQL Database Service 移行検討
日次API呼出 > 100K ロードバランサー導入 + 複数ノード
Garage 使用量 > 5GB(CORE+X 上限近傍) OCI Object Storage へ移行 or 追加ディスク
HLS 変換ジョブ待機 常時 > 5分 変換専用 VPS を追加
オブジェクトストレージ > 100GB Cloudflare CDN または OCI CDN 導入(AWS CloudFront は不採用)
DAU > 1,000 本番 OCI(Compute A1.Flex + MySQL HeatWave + Object Storage)へ段階移行開始(AWS ECS Fargate / RDS は不採用)

最終更新: 2026-04-19 ポリシー適用