Fincs

横断/運用基盤 / メディアパイプライン

横断/運用基盤 / メディアパイプライン

本ページは 2 段構成。上段が biz/CS 向け(ユーザー提示可)、下段(## 🔧 実装詳細 以降)が dev 向け。biz/CS がユーザーへ提示・転用してよいのは上段のみ。

概要

fincs サービスにおけるメディア(動画・画像・PDF 等)の保存・変換・配信のための横断基盤。講師がアップロードしたファイルを安全に保存し、受講者の環境に応じて最適な形式・経路で配信する仕組み。

主な構成要素:

  • 大容量ファイルのアップロード: 動画ファイル等のマルチパートアップロード対応
  • ストリーミング配信形式への変換: アップロード動画を HLS 形式に変換し、複数ビットレートでの配信に対応
  • ライブ配信からアーカイブへの自動移行: ライブ配信終了後、録画ファイルを検出してアーカイブ動画コンテンツとして公開
  • 2 系統ストレージの併用: 信頼性向上のため複数のクラウドストレージにファイルを保持し、配信時はフォールバックで切替
  • 画像処理(ブラウザ側): アップロード前にブラウザで画像を圧縮・形式変換(HEIC → JPEG 等)。サーバー側は変換しない
  • 署名付き URL 発行: アップロード・ダウンロード時に時限付きの安全な URL を発行
  • CDN 経由の配信: 配信高速化と地理的最適化のため CDN を併用
  • 整合性チェック: 2 系統ストレージ間のファイル整合性を定期的に確認し、不整合検知時に運営に通知

主な利用想定は、講師による動画・資料のアップロード、受講者の動画受講、ライブ配信のアーカイブ生成、運営による整合性メンテナンスなど。

再生時の段階的フォールバック: 動画再生時、複数のストレージ・形式から最適なものを順次試す段階的フォールバック(4 段階)が走る。一方が障害でも他方から配信できる仕組み。詳細は dev 下段。

ライブ配信→アーカイブの遅延: ライブ配信終了から数分以内にアーカイブ生成が完了するのが標準。長時間生成されない場合(30 分超)は運営に自動通知。詳細は ../contents/livearchive.md 参照。

HEIC 画像のブラウザ側変換: iPhone 等で撮影された HEIC 形式の画像をアップロードする際、ブラウザ側で自動的に JPEG/PNG に変換する処理が走る。サーバー側での画像変換は行わない方式。

MIME 検証・ウイルススキャンは未対応: アップロードされたファイルのマジックナンバーによる MIME 検証や、ウイルススキャンは現時点では提供していない。今後の改善対象。

📝 レビュー観点:

  • 目的: メディアの保存・変換・配信の横断基盤
  • 誰が使うか: 講師(アップロード)、受講者(受講)
  • どこで使うか: コンテンツ作成・編集・受講の各画面、ライブ配信
  • 隣接機能との関係: コンテンツ機能(../contents/ 各ページ)、運営アドミンコンテンツ管理(../admin/contents.md)、バッチ運用(./batch.md
  • CS 問い合わせで頻発する論点: 「動画が再生できない」「アップロードした HEIC 画像が表示されない」「ライブ録画がいつ見れる」「Wasabi と S3 の使い分け」
  • [本機能特有] 受講時 4 段フォールバック: Wasabi HLS → AWS HLS → Wasabi 圧縮 → AWS 圧縮 → AWS 原盤
  • [本機能特有] HLS 変換完了は外部 webhook 経由: 認証は auth-token ヘッダのみ
  • [本機能特有] ライブ→VOD アーカイブ 30 分超で内部通知: バッチ駆動
  • [本機能特有] HEIC 変換は FE 側 heic2any: BE はサーバー側変換しない
  • [本機能特有] MIME 検証 / ウイルススキャン未対応: ファイル拡張子は MIME 文字列を素通し

利用シナリオ

シナリオ 1: 講師が動画をアップロードして配信形式に変換

講師がコンテンツ編集画面から動画ファイルをアップロード。大容量ファイルはマルチパートで分割送信され、効率的にアップロードされる。アップロード完了後、システム側で配信形式(HLS)への変換が走り、変換完了後に受講者が再生できる状態となる。

シナリオ 2: ライブ配信終了後の自動アーカイブ生成

ライブ配信が終了すると、システムが録画ファイルを検出し、自動的にアーカイブ動画として公開状態へ昇格。30 分以上経過しても生成されない場合は運営に通知が飛ぶため、長時間放置されることはない。

シナリオ 3: HEIC 画像のプロフィール画像アップロード

iPhone で撮影した HEIC 形式の画像をプロフィール画像としてアップロード。ブラウザ側で自動的に JPEG / PNG 形式に変換され、規定サイズ(300px 等)に圧縮された上でアップロードされる。

シナリオ 4: 受講者の動画受講と段階的フォールバック

受講者が動画を再生すると、複数のストレージ・形式から最適なものを順に試して配信。1 つの経路で問題が発生しても別経路でフォールバックされ、再生継続性が高い。

シナリオ 5: 整合性チェック

定期バッチで複数ストレージ間のファイル整合性を確認。差分が検出された場合は運営担当者に通知が飛び、必要に応じて手動補修。

よくある失敗ケース

  • 配信形式への変換失敗: アップロード後に変換処理が失敗するケース。再生は元動画で代替されるか、運営側の手動補修対応となる
  • HEIC 変換失敗: 一部のブラウザで HEIC 変換が動かないケース。代替手段の提示・案内が必要
  • 整合性破綻: 2 系統ストレージのいずれかに欠損が出るケース。バッチ検知 → 運営対応
  • 未対応のファイル形式: 想定外の MIME タイプのファイルがアップロードされた場合の挙動

権限別仕様

権限定義は ../user-roles.md 参照。

メディアパイプラインは基盤機能のため、ユーザー権限軸での直接の操作は無い。コンテンツ機能側の権限軸は ../contents/ 各ページ参照。

操作 受講者 講師 運営アドミン
動画 / 画像 / 文書のアップロード × ○(自講座のみ)
HLS 変換完了通知の受信(webhook) システム システム システム
Wasabi/S3 整合性チェック × × ○(バッチ起動経由)

機能詳細(ふるまい)

配信形式への変換完了の検知

  • 外部の変換サービスで mp4 → 配信形式(HLS)への変換が完了すると、システムへ通知
  • 通知受信時点で、コンテンツの保存先情報を変換後ファイルへ切替
  • 受講者は変換完了後から HLS 形式での配信を受けられる

ライブ配信からアーカイブへの自動移行

  • ライブ配信終了後、システムが録画ファイルを検出
  • 検出され次第、コンテンツが「アーカイブ動画」として昇格し受講可能になる
  • 30 分以上経過しても生成されない場合は運営担当者に通知が飛ぶ
  • 自動再試行は行わず、運営による手動補修対応

2 系統ストレージの併用

  • 信頼性向上のため、複数のクラウドストレージにファイルを保持
  • 受講時は最適な経路を順に試す段階的フォールバックで配信
  • 1 つの経路で障害があっても別経路から配信継続可能
  • CDN 経由で配信高速化

画像処理(ブラウザ側)

ブラウザ側でアップロード前に画像を最適化:

  • プロフィール画像: 最大 300px に圧縮
  • コンテンツ画像: 最大 1280px、WebP 形式に変換
  • 章扉画像: 100px / 0.01MB に圧縮
  • トーク用画像: 用途別圧縮
  • プラン詳細用画像: 用途別圧縮

HEIC 形式の画像(iPhone 撮影など)は JPEG / PNG への変換処理が走る。WebP 未対応のブラウザでは解像度のみ調整。

整合性チェック(バッチ)

  • 定期バッチで複数ストレージ間のファイルサイズ・チェックサムを突合
  • 差分が検出された場合は運営担当者に通知
  • 必要に応じて手動補修対応となる

未対応項目

  • ファイルのマジックナンバー検査による MIME 検証
  • ウイルススキャン
  • サムネイル再生成専用経路

📝 レビュー観点:

  • 入力 → 処理 → 出力: アップロード → 署名 URL 発行 → S3 → 変換 webhook → HLS 切替 → 受講
  • エッジケース: 変換途中の受講試行、Wasabi/S3 片側欠損、HEIC 変換失敗、MIME 偽装
  • エラー表示: 受講失敗時はフォールバック試行、最終的に再生不可
  • [本機能特有] MIME 検証なしのセキュリティリスク: 改善課題

admin 操作

該当なし / 実装されていない

  • MIME 検証: ファイル拡張子は MIME 文字列を素通し
  • ウイルススキャン: 未実装
  • サムネイル再生成専用経路: 未実装(Firestore 投影で間接反映)

📝 レビュー観点:

  • セキュリティ要件としての MIME 検証導入優先度
  • 既存ファイルへのウイルススキャン適用フロー

品質 / 約束事項

  • 応答性: アップロード即時、変換完了は外部処理時間に依存(数分〜)。ライブ→VOD は終了後数十分以内
  • 信頼性: Wasabi/S3 整合性は定期バッチで監視、不整合時は内部通知
  • 制限値:
    • 画像圧縮上限: プロフィール 300px、コンテンツ 1280px、章扉 100px / 0.01MB
    • 動画ファイル: マルチパートアップロード対応
    • アーカイブ生成警告: 30 分超で内部通知
  • データ保持: 論理削除済みコンテンツの実ファイルはバッチで物理削除

📝 レビュー観点:

  • [本機能特有] CDN 経路(Bunny + CloudFront)の使い分け
  • [本機能特有] 4 段フォールバックの体感レイテンシ

変更履歴(リリースノート候補)

v2.31.0: 2026-05-05

  • [改善] ファイルコピー処理を効率化し、コピー専用のタイムアウト設定を分離(FIN-366)。大容量ファイルや高負荷時のコピー処理が安定化、通常の取得処理に巻き込まれる形でタイムアウトが効きすぎる問題を回避

v2.30.0: 2026-05-05

  • [改善] ライブアーカイブ動画(ARCHIVE_MOVIE)のメディア配信を HLS ABR(自動ビットレート切替)対応に変更(FIN-383)。受講者環境の通信状況に応じて自動的に画質が切り替わり、再生中断や読み込み待ちが減少。詳細は ../contents/livearchive.md も参照

v2.29.2: 2026-05-04(PSD 初版)

  • [PSD 追加] 本ドキュメント初版作成。v2.29.2 時点の実装を起こし。機能追加・変更は含まない

📝 レビュー観点:

  • 過去の主要変更(HLS 変換導入 / Wasabi 併用導入 / HEIC 変換対応 等)

関連ドキュメント


このページの内容を AI に質問しますか?
関連 spec を自動抽出して ChatGPT / Claude などに渡せます。
AI Prompt で開く →