本文へ移動
Architecture · One picture

全体像Architecture

実装した共通土台が、本番環境でどう連動するかを 1 枚にまとめました。話の筋は一本です。1 つのリポジトリ(モノレポ)からビルドし、4 つのサービス + 1 つのジョブとして本番(Cloud Run)へ送り出し、外部サービス(データベース・ストレージ・Drive・メッセージ基盤)へ繋ぐ ── この流れと、作った成果物の全件一覧をこのページに置きます。各テーマの詳細は、以降のページへ展開します。

実装済み: 土台のコード・本番初回デプロイ・疎通確認 今後: 各サービスに業務処理を載せる
01

器から動く土台へFrom repository to runtime

クラウド基盤を「器」とすると、その器に収める「中身(コード)」を実装し、本番で動く状態まで運びました。上から下へ、リポジトリ → ビルド → 本番サービス → 外部接続、と追えるように配置しています。

実線 = 実装済み・本番疎通済み 破線 = まだ実装していない業務処理(今後の開発で対応)
図 01 · 1 リポジトリ → ビルド → 4 サービス + 1 ジョブ → 外部
REPOSITORY · モノレポ(1 リポジトリ)matsuba(GitHub 1 リポジトリ) — TypeScript と Go が同居pnpm workspaceTurborepogo.work(Go)Buf(protobuf)apps/ … 4 アプリ(web・api・sync・scanner) / packages/ … 7 共通部品(database・shared・auth・events・ui・設定 2)buildBUILD · ビルド(Turborepo が束ねる)Buf: proto → TS / Go型を 1 定義から両言語生成Prisma generateDB の型を生成next build / go build各アプリをビルドコンテナ画像Artifact Registryキーレス CD でデプロイRUNTIME · CLOUD RUN(東京)— /HEALTH 応答 = 疎通済みmatsuba-webNext.js · 画面matsuba-apiHono · 業務 APImatsuba-syncGo · Drive 同期matsuba-scannerGo · ウイルス検査matsuba-batchJob · 定期Drive 同期(今後実装)EXTERNAL · 外部サービスSupabasePostgres · RLSCloud Storage5 バケットPub/Sub13 + 13 DLQGoogle Drive片方向ミラー(今後実装)Resendメール送信※ 各サービスの「中身の業務処理」は今後の開発で実装。土台が組み上がり、本番で /health が応答する(疎通する)状態まで到達。

読み方: 上 3 段(リポジトリ → ビルド → 本番)が主役です。matsuba-web / -api / -sync / -scanner の 4 サービスと、定期処理を 1 つに束ねた matsuba-batch ジョブが、本番にデプロイされ /health(生存確認エンドポイント)に応答するところまで確認しました。最下段の外部サービスのうち、Google Drive への同期など「業務処理そのもの」は、破線で示した今後の実装分です。

02

実装した成果物の一覧What we built

コードとして実装・整備したものを、テーマ別に並べました。それぞれの設計意図と仕組みは、対応するページに展開しています。件数は実際のコードに合わせています。

テーマ成果物件数役割
モノレポワークスペースの 4 軸4 軸pnpm workspace / Turborepo / go.work / Buf。複数言語・アプリを 1 リポジトリで管理
アプリCloud Run サービス / ジョブ4 + 1web / api / sync / scanner + ジョブ batch(定期処理の統合)
共通部品共通パッケージ @repo/*7database / shared / auth / events / ui / eslint 設定 / TypeScript 設定
型と契約イベント定義(protobuf)134 つの定義ファイルから TypeScript と Go を自動生成
データベース限定値の型(Prisma Enum)10状態・種別・ロール等、決まった値だけを取る列を型で固定
データベース認可判定ヘルパ(RLS 関数)8「誰がどの Box の何を見てよいか」を DB 側で判定する関数
データベースマイグレーション6スキーマ(テーブル設計)の変更履歴
イベント基盤ワーカー(worker)18送り出し役 outbox-dispatcher を実装、残り 17 は今後実装する処理の枠(スタブ)
イベント基盤Pub/Sub の受け渡し基盤13 + 13 / 22主トピック + 退避先(DLQ)+ サブスクリプション(前段で整備済の流通路に接続)
画面基盤画面部品(shadcn/ui)の精査551 つずつ採否を判断(採用 19 / 個別修正 35 / 不採用 1)
自動デプロイCD ワークフロー5サービス別 4 本 + 共通の再利用ワークフロー 1 本(キーレス)

「土台」であることの意味: 上記はいずれも、業務機能(ファイル共有や通知の中身)そのものではなく、それらを安全・確実に載せるための骨格です。骨格を先に正しく組んでおくことで、後から機能を追加するたびに発生しがちな手戻り・不具合・抜け漏れを構造的に減らせます。

03

到達点Where we are

誇張せず、事実として「どこまで動く状態になったか」を記します。「疎通(そつう)」とは、リクエストや通知が経路を通って相手に届き、応答が返る状態を指します(平たく言えば「ちゃんと繋がって動く」状態)。

Local
4サービス起動

手元のパソコンで 4 サービスを起動し、本番のデータベース等に繋いで /health が応答。

Deploy
初回本番疎通

自動デプロイで本番(Cloud Run)へ送り出し、*.run.app の /health が 200 応答。

Contracts
2言語に型生成

1 つの定義から TypeScript・Go の型を生成。送り手と受け手の型ズレを構造的に排除。

Next
業務処理は今後

ファイル操作・通知などの中身は、この土台の上に今後 載せていきます。

正直な注記: 現時点では各サービスは「起動雛形(中身が空の骨格)」の段階で、ファイル一覧や共有リンクといった業務処理はこれから実装します。本資料の図では、こうした今後の実装分を破線、実装して本番疎通まで確認したものを実線で示し、区別できるようにしています。