開発計画と工数/ Phases & effort
松葉 / Matsuba は 9 つのフェーズで構築します。延べ作業日は約 129 営業日、実工期は約 108 営業日(クリティカルパス、Phase 5 / 6 / 8 の並行作業を考慮)です。想定工数は、経験者がフルタイムで進める前提では約 6.5 人月、これに対し一人のエンジニアが生成 AI を使わずに進める(初見技術のキャッチアップ時間を含む)前提では約 10〜13 人月と見立てています。
フェーズ依存関係Phase dependencies
基盤と認証を直列で固め、コア機能の上に信頼性レイヤと公開ページ、保持・アーカイブを並行で重ねます。最後に管理画面を集約してリリース準備へ進みます。
Phase 5(信頼性)と Phase 6(保持)、Phase 8(公開画面)は Phase 4 完了後に並行で進められます。Phase 7(管理画面)は Phase 5 で蓄積されるデータに依存するため、Phase 5 完了が前提です。Phase 9 のリリース準備は監視・アラートの最終設定のみで、コード作業はほぼ発生しません。
フェーズ一覧Phase summary
9 つのフェーズの担当範囲と想定期間、主な構築物(機能カテゴリと画面数の目安)を表にまとめます。「想定期間」は経験者がそのフェーズに集中して取り組んだ場合の営業日数で、フェーズ単独の所要を表します(並行作業は加味していません)。
| Phase | 担当範囲 | 主な構築物 | 想定期間 |
|---|---|---|---|
| Phase 1 基盤構築 | Google Cloud / Supabase / Resend / Workspace / モノレポ / DB / Pub/Sub の土台 | GUI 操作手順 12 本 + 共通基盤タスク 11 本 / 5 バケット + Pub/Sub 13 トピック + WIF | 14 日 |
| Phase 2 認証基盤 | Better Auth + メール OTP MFA + 4 ロール + RLS(行レベルセキュリティ) | 機能 4 / 画面 8(サインイン入口分岐 / 社内 / 社外 / OTP / 招待 / 初回 MFA 等) | 14 日 |
| Phase 3 コア基盤 | Box CRUD + メンバー + フォルダ + UL / DL / 差し替え / 世代管理 / 可視性 3 段階 | 機能 11 / 画面 6(ホーム / Box 新規作成 / Box 詳細ファイル・メンバー・設定 / ゴミ箱) | 21 日 |
| Phase 4 コア運用機能 | プレビュー 4 種 / Box 内検索 / メタ拡張 / タグナビ / 一括 DL / コメント | 機能 5 / 画面 3 + ホーム差分(最近のファイル) | 14 日 |
| Phase 5 信頼性レイヤ | ウイルススキャン / Drive 同期 / 通知 / 共有リンク / 監査 / 関連 admin | 機能 7 / 画面 4 + 管理画面 7(最も重いフェーズ) | 28 日 |
| Phase 6 保持・アーカイブ | 保持期間 + Hold + ローリングウィンドウ + Drive アーカイブ参照 | 機能 4 / 画面 1(Phase 5 と並行可) | 14 日 |
| Phase 7 管理画面 | /admin 残ページ + 監査 UI + admin_metrics 集計バッチ + 長期運用バッチ群 | 機能 2 / 画面 10 + 18 種のバッチ統合 | 14 日 |
| Phase 8 公開・システム画面 | ブランド LP / 利用規約 / プライバシー / お問い合わせ / メンテナンス / エラー / オフライン | 画面 7(業務ロジックなし、Phase 5 と並行可) | 7 日 |
| Phase 9 リリース準備 | 監視・アラートの最終設定(しきい値再評価・到達確認・Billing アラート) | タスク 1 本(コード作業なし) | 3 日 |
| 合計 | 機能 33 / 画面 39 / バッチ 18 種 | 延べ 約 129 日 実工期 約 108 日(並行考慮) |
各フェーズの詳細Per-phase scope & DoD
フェーズごとに目的・主な構築物・完了条件(DoD)・注目ポイントを示します。注目ポイントは、本サービスがプロダクション運用を前提に組み込んでいる設計の所在です。
基盤構築
クラウド / ローカル / モノレポ / DB / Pub/Sub / 共通基盤を整備し、後続フェーズが「DB がある・認証ライブラリが入っている・Pub/Sub が動く・ファイル UL 可能」の状態を作ります。
主な構築物
- Google Cloud プロジェクト + 10 種の API 有効化
- 5 バケット(未検査 / 検査済み / 隔離 / ミラー〔ウイルス定義〕 / 共有 ZIP)
- Pub/Sub 13 トピック + DLQ(配信失敗キュー)
- WIF(Workload Identity Federation、鍵不要のクラウド権限委譲)
- 4 サービス(web / api / sync / scanner)の Docker Compose 起動
完了条件
- 追記専用 RLS + SECURITY DEFINER 書き込み関数で監査ログが動く
- Outbox テーブル + Dispatcher Worker で DB ↔ Pub/Sub が整合
注目: 鍵レスデプロイ(WIF)と 5 バケット分離 + Eventarc 連動を最初に固めることで、後続のすべてのファイル処理が「責務分離 + 鍵漏洩リスクなし」で組み上がります。
認証基盤
Better Auth 1.3+ を中核に、社内 SSO / 社外メール+パス + メール OTP MFA / 4 ロール認可 / RLS を完成させます。
主な構築物
- 社内 Google SSO(
hd=example.com強制 + サーバ側ドメイン再検証) - 社外メール OTP 必須(信頼デバイス 30 日 / バックアップコード 10 個)
organizationのadditionalFieldsで Box を単一テーブル管理- 4 ロール(Viewer / Uploader / Editor / Owner)の accessControl
完了条件
- 三層認可(プロキシ / ルート / DB-RLS)の経路がすべて通る
- 認証イベント全件が
audit_logsに追記される
注目: 「セッション検証はプロキシ層、ロール判定はルート層、データ可視範囲は DB の RLS」と三層に分解された認可を初回から組み込みます。
コア(Box・ファイル基盤)
Box CRUD + メンバー + フォルダ階層 + UL / DL / 差し替え / 世代管理を完成させ、業務の中核を動かします。
主な構築物
- Box 可視性 3 段階(members / internal_searchable / internal_open)と参加申請
- tus-js-client + GCS Resumable Upload で 200 MB UL
- 世代管理(最新 + 10 世代、Box 単位設定可)
- 論理削除 → 30 日ゴミ箱 → 物理削除
完了条件
- 未検査バケット → スタブ scanner → 検査済みバケットへの rewrite の動線がスタブで通る
- マクロ Office と古い Office 形式が拡張子レベルで拒否される
注目: 「Box 可視性 3 段階 + 参加申請」は本サービス独自の業務概念で、社内非メンバーを擬似ロール internal_viewer で RLS が read-only に縛ります。
コア(ファイル運用機能)
UX を支える周辺機能を一通り揃えます。プレビュー 4 種、Box 内検索、ファイルメタ拡張、タグナビ、一括 DL、コメント、最近のファイル。
主な構築物
- PDF / 動画 / 音声 / 画像 / Office(Drive Viewer)のプレビュー
- Box 内検索(pg_trgm + ILIKE、ファイル名 / フォルダ名 / タグ / 説明 / UL者)
- ファイルメタ拡張(description 1000 字 + tags text[])
- nuqs(URL 状態管理ライブラリ)でタグナビ
?tag=...
完了条件
- 一括 DL の ZIP しきい値(200 MB / 10 ファイル)で個別 DL 誘導が動く
- 「最近のファイル」ウィジェットが直近の上位 10 件を返す
注目: URL 状態管理を nuqs に集約することで、検索条件・タグ絞り込みをそのまま URL として共有・ブックマーク可能にします。
信頼性レイヤ
業務利用に耐える信頼性レイヤを全方位で構築します。ウイルススキャン / Drive 同期 / 通知 / 共有リンク / 監査 / 関連管理画面。
主な構築物
- ClamAV 1.4 + freshclam 6 時間ごと + 月次 EICAR テスト
- apps/sync(Go)= Pub/Sub Push + Drive Resumable Upload + appProperties
- 指数バックオフ(回数を限って再試行) + DLQ +
processed_eventsによる冪等性 - 日次の補修バッチ(Box 単位の並列)
- Resend + react-email で 16 種テンプレ + 30 分間隔の digest worker
- 共有リンク(期限・パスワード・回数・受取人 OTP・メール送信)
- 監査ログ閲覧 UI + CSV エクスポート + アプリ層アラート 7 種
完了条件
- 感染検出 → 即時メール(system_admin + UL者 + Box Owner)の経路が動く
- Drive 直接アップロード検知 / Drive 側削除検知が日次で記録される
注目: 多層ウイルススキャン + Outbox + DLQ + 冪等性キーを組み合わせたイベント駆動アーキテクチャを、Go と TypeScript の型を protobuf で共有しながら構築します。
保持・アーカイブ
ストレージの無制限増加を防ぎつつ、「ある日突然消える」を絶対に回避するための保持期間運用を組み立てます。
主な構築物
- 全社デフォルト 180 日 + Box デフォルト + 個別 Hold(理由必須)
- ローリングウィンドウ(アクセスで
last_accessed_at更新 → 期限延長) - 凍結期間 30 日(UL 直後の最低保持)
- 削除当日メール通知(immediate 強制、Owner + UL者 + 最終アクセス者)
- 影響シミュレーション(全社デフォルト変更時に「N ファイル / X GB」を即表示)
- Drive アーカイブ参照タブ(read-only)
完了条件
- 共有リンク有効ファイルは「失効 + 7 日」まで削除延期される
- Hold 合計が一定容量以上の Box は 3 箇所にバッジ常時表示される
注目: 削除予告 → 当日通知 → 実削除 → Drive アーカイブ参照という 4 段階の安全網を機能群として独立させた、保持期間設計です。
管理画面
/admin の運用ダッシュボード本体、監査閲覧、設定 UI、長期運用バッチ群を仕上げます。
主な構築物
- ダッシュボード(信号機方式のヘルスインジケータ 6 観点 + KPI 6 種)
- ストレージ / ユーザ / Box / 保持 / 監査 / 設定 各画面
- 重大操作の理由必須 + 即時メール通知 + 監査記録
- 長期運用バッチ 10 種以上を
docshare-batchに統合 - JWKS(JWT 鍵セット)の年次自動ローテ、旧鍵の一定期間の並行公開
完了条件
- 監査ログ CSV エクスポートが「直近 1 ヶ月オンライン + それ以前 GCS 退避」の二段で取れる
- メンテナンスモード ON で全リクエスト 503 + 告知バナー表示
注目: 長期運用バッチ 18 種を単一 Cloud Run Jobs サービスに統合し、20 年運用を見据えた監査ログ月次パーティション + GCS 退避を組み込みます。
公開・システム画面
非認証ユーザ向けの最小 LP、法務ページ、お問い合わせ、メンテナンス / エラー / オフライン画面を整えます。
主な構築物
- 未認証
/はミニマム LP、認証済みは/boxesへリダイレクト - 利用規約・プライバシーポリシー(章立てのみ、本文は法務確定後)
- お問い合わせ(フォームなし、メール窓口 + FAQ)
- PWA 最小対応(マニフェスト + apple-touch-icon + 専用オフライン画面)
- 404 / 500 / 403 の共通エラー画面(unDraw イラスト + Teal 配色)
完了条件
proxy.tsの matcher で認証要否が URL ごとに正しく分岐する- OnlineWatcher が
navigator.onLine === false検知時に/offlineへ遷移
注目: Service Worker やキャッシュ戦略といった過剰機能を意図的に省き、「最小限の見た目だけインストール可能」な PWA に絞った判断。
リリース準備
監視・アラート最終設定のみを行います。コード作業は基本発生せず、しきい値の再評価とアラート到達確認、Billing 予算アラートの最終調整に集中します。
主な構築物
- app_alerts 13 種の実機シミュレーション
- 通知到達確認(Resend + メール)
- Cloud Billing 予算アラート(段階的な割合)
完了条件
- すべての critical アラートが system_admin 全員に到達する
- 感染検出のシミュレーションで即時メールが配信される
注目: 「リリース後の活動」は本ロードマップ外として明確に分離し、別に扱う設計です。
工数の見立てPerson-month estimates
各フェーズの想定人月を 2 つの前提で並列に示します。経験者前提は、採用技術に習熟したエンジニアがフルタイムで進めた場合の純作業量(1 人月 = 20 営業日換算)です。ソロ + キャッチアップ込みは、一人のエンジニアが生成 AI を使わずに進める前提で、Next.js 16 / Better Auth / Go / protobuf / WIF / Cloud Run / RLS / Pub/Sub / ClamAV など初見技術の学習時間を含めた想定(経験者前提の 1.5〜2.0 倍)です。
| Phase | 主な技術領域 | 経験者前提 | ソロ + キャッチアップ込み |
|---|---|---|---|
| Phase 1 基盤構築 | Google Cloud(Cloud Run / GCS / Pub/Sub / Eventarc / WIF) / Terraform / Docker Compose / モノレポ | 0.7 | 1.0〜1.4 |
| Phase 2 認証基盤 | Better Auth + organization / admin / jwt / twoFactor / emailOTP / RLS 設計 | 0.7 | 1.0〜1.4 |
| Phase 3 コア基盤 | Box + 可視性 3 段階 + tus UL + 世代管理 + RLS ポリシー | 1.05 | 1.6〜2.1 |
| Phase 4 コア運用機能 | プレビュー 4 種 + pg_trgm + nuqs + 一括 ZIP + コメント | 0.7 | 1.0〜1.4 |
| Phase 5 信頼性レイヤ | ClamAV + Drive 同期 Go + Resend テンプレ + 共有リンク + 監査 UI | 1.4 | 2.1〜2.8 |
| Phase 6 保持・アーカイブ | 保持期間 + Hold + ローリング + Drive アーカイブ + 影響シミュレーション | 0.7 | 1.0〜1.4 |
| Phase 7 管理画面 | /admin 10 画面 + 長期運用バッチ 12 種 | 0.7 | 1.0〜1.4 |
| Phase 8 公開画面 | 公開ページ + PWA 最小 + エラー画面 | 0.35 | 0.5〜0.7 |
| Phase 9 準備 | 監視・アラート最終確認 | 0.15 | 0.2〜0.3 |
| 合計 | 約 6.5 人月 | 約 10〜13 人月 |
工期と工数の関係: 工数(人月)は純粋な作業量を、工期(営業日)はカレンダー上の経過日数を表します。延べ作業日 約 129 営業日(÷ 20 ≒ 6.5 人月)は経験者前提の純作業量と一致します。実工期はクリティカルパスで 約 108 営業日(Phase 5 / 6 / 8 の並行作業を考慮)です。ソロ + 生成 AI 不使用 + 初見技術キャッチアップ込み(約 10〜13 人月)は、同じ作業範囲を一人で担う場合の学習・試行錯誤を含む見積りで、純作業量 6.5 人月との差分(約 3.5〜6.5 人月)が学習コスト相当です。
設計難易度・実装難易度Difficulty assessment
本サービスの開発難易度を、設計と実装の 2 軸で評価します。
設計難易度
★★★★★ 5 / 5- 社内 SSO / 社外メール OTP / 共有リンク受取という 3 経路の認証認可を、Better Auth 上で破綻なく組み立てる必要があります。
- 三層認可(プロキシ層のセッション / ルート層の accessControl / DB 層の RLS)の責務分離と漏れ防止を要求します。
- Outbox パターン + Pub/Sub + DLQ + 冪等性キーを破綻なく組み合わせるイベント駆動の整合性設計が必要です。
- 監査ログ月次パーティション + GCS 退避、JWKS 年次ローテ、disabled-user 5 年消去など、20 年運用を見据えた長期設計が要ります。
- Box 可視性 3 段階 + 参加申請という、本サービス独自の業務概念を扱います。
- Drive 同期 ON / OFF の途中切替で、既存ファイルの初期同期・orphan 検知・削除検知の整合性を保つ必要があります。
- 多層ウイルススキャン(クライアント / ClamAV / Drive / エンドポイント)の責務分担と、scan_status による DB 二重防御を設計します。
実装難易度
★★★★★ 4 / 5- 採用技術の幅が広いです。Next.js 16(Cache Components / PPR)+ Hono RPC + Better Auth + Prisma 7 Driver Adapter + Go + ClamAV + tus + Cloud Run × 4 + Jobs + Cloud Tasks + Cloud Scheduler + Eventarc + Pub/Sub + buf/protobuf + Turborepo + pnpm workspace + go workspace。
- TypeScript と Go を横断し、Pub/Sub メッセージスキーマを protobuf + buf で TS / Go の両方に生成して型共有します。
- クリーンアーキテクチャ 4 層(Domain / Application / Infrastructure / Presentation)の徹底と、UseCase から Prisma 直接利用を禁止する依存方向の徹底が必要です。
- モック原則禁止のテスト戦略で、Vitest + Playwright + go testing + 実 Postgres + fake-gcs-server + Pub/Sub emulator + Resend dev mode を組み合わせます。
- CI/CD は GitHub Actions + Workload Identity Federation + Turborepo 差分ビルド + Docker マルチステージで、paths-filter による該当サービスのみの自動デプロイを組みます。
- 減点要因: 設計が固まっていれば、各層単体の実装は標準的なパターンを踏襲できます(Resumable Upload・Pub/Sub Push・RLS は Google Cloud と Supabase の公式パターンに沿って書ける)。
本サービスを支える本格的な仕組みProduction-grade foundations
本サービスが備える 10 の仕組みを整理します。それぞれの詳細は他のページでも取り上げています。
| No. | 要素 | 所在 |
|---|---|---|
| 01 | 4 サービス分離デプロイ | web / api / sync / scanner を Cloud Run 上の独立サービスとして配備 |
| 02 | 5 バケット + Eventarc + ClamAV | 未検査バケット → 検査済み / 隔離バケットへの rewrite で多層ウイルススキャン |
| 03 | 追記専用 RLS + 月次パーティション + GCS 退避 | 監査ログの UPDATE と DELETE を DB で拒否し、20 年運用に耐える設計 |
| 04 | Outbox + DLQ + 冪等性 | DB 書き込みと Pub/Sub publish のトランザクション整合性 |
| 05 | 三層認可 | プロキシ / ロール / DB-RLS の三段重ねがけ |
| 06 | 20 年運用バッチ 18 種 | JWKS 年次ローテ / 無効化 5 年消去 / EICAR 月次テストなど |
| 07 | Hold + ローリングウィンドウ + 凍結期間 + 影響シミュレーション | 保持期間運用の安全網を 4 段階で構成 |
| 08 | 共有リンク多層認証 | パスワード + OTP + 回数制限 + ブルートフォース検知 + レート制限 |
| 09 | Go × TS 型共有 protobuf | Pub/Sub メッセージスキーマを buf で両言語生成 |
| 10 | WIF 鍵レスデプロイ | GitHub Actions にサービスアカウントキーを発行しない CI/CD |