本文へ移動

Technology

使用技術

松葉を構成する技術を、フロントエンドから Google Cloud のサービスまで分類ごとに、バージョンと用途つきで示します。主要な技術は常に表示し、補助的な技術は分類ごとに開いて読めます。

全体像

言語
TypeScript / Go / SQL
アプリケーション
5
共有パッケージ
12
画面
68
API エンドポイント
375
テーブル
61

2026-09-17 時点の数値とバージョン(開発期間の終わりのソースコード)

動かす技術

利用者が触れる画面から、API・非同期処理・データ・認証・メールまで、松葉を動かしている技術です。

フロントエンド

利用者と管理者が使う Web アプリです。Next.js の App Router に shadcn/ui の部品を組み合わせ、サーバ状態は TanStack Query、フォームは React Hook Form と zod で扱います。

  • Next.js16.3.5Web アプリの基盤(App Router・Cache Components・standalone の出力)
  • React19.3.0UI の描画(React DOM を含む)
  • TypeScript5.9.3言語(strict の設定を全ワークスペースで共有)
  • Tailwind CSS4.3.3スタイル(色・角丸・影はトークンの CSS 変数で管理)
  • shadcn/ui4.21.0UI 部品の土台(CLI で生成し、規約に合わせて調整)
  • TanStack Query5.102.8サーバ状態の取得とキャッシュ
  • zod4.6.3入力の検証スキーマ(API と同じ定義を共有)
フロントエンドの補助の技術(35 項目)
  • 状態とフォーム

    • React Hook Form7.88.0フォームの状態と検証(resolver で zod と接続)
    • Zustand5.0.15クライアント状態
    • nuqs2.10.1URL のクエリで持つ状態
  • UI 部品

    • Radix UI1.6.7アクセシブルなプリミティブ(ダイアログ・メニューなど)
    • Base UI1.8.0コンボボックス・数値入力のプリミティブ(Radix と併用)
    • react-icons5.7.0画面のアイコンの主な供給元(Feather・ファイルの種類・製品ロゴ)
    • Lucide1.45.0shadcn/ui の部品が内部で使うアイコン
    • motion12.43.0アニメーション
    • next-themes0.4.6ライトとダークのテーマの切替
    • Embla Carousel8.6.0カルーセル
    • input-otp1.5.0ワンタイムコードの入力欄
    • React Day Picker10.0.1日付の選択
    • React Resizable Panels4.12.4分割パネル
  • ファイル操作

    • Pragmatic drag and drop2.0.2ファイルとフォルダのドラッグ & ドロップ(自動スクロールと読み上げの補助を含む)
    • Headless Tree1.7.0フォルダのツリー
    • hash-wasm4.12.0ブラウザでのハッシュ値の計算(転送中の改変をスキャン時に照合)
    • file-type22.1.0ファイルの種類の判定
    • react-easy-crop6.2.3画像の切り抜き(アバター)
    • Papa Parse5.7.0CSV の解析(プレビューと利用者の一括取り込み)
    • encoding-japanese2.3.0日本語の文字コードの判定(Shift_JIS・EUC-JP)
  • プレビュー

    • PDF.js5.4.296PDF のプレビュー(React PDF と組み合わせ)
    • React PDF10.5.0PDF のページの描画
    • Media Chrome4.19.2動画・音声のプレビューの操作部
    • react-zoom-pan-pinch4.2.0画像の拡大とパン
    • TanStack Virtual3.14.12CSV のプレビューの表の仮想スクロール
  • ヘルプと本文

    • Fumadocs16.15.9アプリ内ヘルプ(MDX の記事)
    • MDX3.1.1ヘルプの本文の形式
    • Orama3.1.18ヘルプの全文検索(ブラウザ内)
    • react-lite-youtube-embed3.7.0ヘルプ記事の動画の埋め込み(再生するまで読み込まない)
    • react-markdown10.1.0お知らせ・規約・Markdown ファイルのプレビューなどの描画(サニタイズつき)
    • Linkify4.3.3コメント本文の URL の自動リンク
  • 編集と表示

    • CodeMirror6.7.2通知テンプレートの編集欄
    • Recharts3.10.1管理ダッシュボードの図表
    • diff9.0.0差分の表示
    • date-fns4.4.0日時の処理(タイムゾーンの拡張を含む)

API

Node.js の Hono で作った HTTP API です。スキーマ駆動で OpenAPI を生成し、Cloud Run のサービスとして動きます。

  • Hono4.13.7API サーバ(Node.js アダプタで Cloud Run のサービスとして起動)
  • Node.js22.23.2Web・API・サムネイル生成の実行環境(コンテナのイメージも同じバージョン)
  • Hono Zod OpenAPI1.6.3zod のスキーマからルーティングと OpenAPI を生成(生成物をコミットし差分を単体テストで固定)
  • google-auth-library9.15.1OIDC トークンの検証とサービスアカウントでの認証
  • sharp0.35.4画像の変換(サムネイル生成の側でも使用)
APIの補助の技術(15 項目)
  • 実行と配布

    • tsup8.5.1ビルド
    • tsx4.23.13開発時の実行
    • Swagger UI0.6.1API 仕様の表示(システム管理者だけに公開)
  • 機能の補助

    • yazl3.3.1ZIP の生成(一括ダウンロード)
    • pg-copy-streams7.0.0監査ログの CSV の書き出し
    • croner10.0.1cron 式の解釈
    • p-limit7.3.2並列数の制御
    • maxmind5.0.7IP アドレスからの地域の推定(MaxMind DB 形式のデータを読む)
    • GeoLite2 City地域の推定に使うデータ(ip-location-db の npm パッケージ)
    • Bowser2.14.1User-Agent の解析
    • i18n-iso-countries7.14.0国名の表示
  • Google Cloud のクライアント

    • @google-cloud/storage7.22.0Cloud Storage のクライアント
    • @google-cloud/pubsub4.11.0Pub/Sub のクライアント
    • @google-cloud/tasks6.3.0Cloud Tasks のクライアント
    • @google-cloud/scheduler6.1.0Cloud Scheduler の宣言と実機の照合(スクリプト)

非同期処理

時間のかかる処理と定期の処理です。Go の同期とスキャンのサービスと Node.js のサムネイル生成はイベントで動き、API と同じイメージのジョブ群は Cloud Scheduler と API から起動します。

  • Go1.26.8共有ドライブへの同期とウイルススキャンのサービス
  • ClamAV1.4.6アップロードされたファイルのスキャン(定義は別のジョブで更新)
  • PDFium2.1.13PDF の先頭ページのサムネイル描画(WebAssembly で実行)
  • FFmpeg動画のポスターフレームの抽出(サムネイル生成サービス)
  • @bufbuild/protobuf2.15.0Pub/Sub のメッセージの型(同じ定義から Node.js と Go のコードを生成)
非同期処理の補助の技術(12 項目)
  • Go のライブラリ

    • pgx5.11.0Go からの PostgreSQL 接続
    • google.golang.org/api0.297.0Drive API・Cloud Run Admin API・Cloud Monitoring・ID トークン
    • cloud.google.com/go/storage1.67.1Cloud Storage のクライアント(Go)
    • cloud.google.com/go/pubsub1.51.1Pub/Sub のクライアント(Go)
    • google.golang.org/protobuf1.36.12Go 側の生成コード
    • google/uuid1.6.0UUID v7 の採番
    • mimetype1.4.15ファイルの種類の判定
  • サムネイル生成

    • libheif1.23.4HEIC の読み込み(ソースからビルド)
    • libde2651.1.2HEVC のデコード(ソースからビルド)
    • libvips8.18.6sharp が使う画像処理ライブラリ(ソースからビルド)
  • 実行イメージ

    • Distroless同期サービスの最小の実行イメージ(静的バイナリ用・非 root で実行)
    • cvdupdateClamAV の定義ファイルの取得とミラー

データ層

Supabase のマネージド PostgreSQL に Prisma で接続し、行レベルセキュリティで可視範囲をデータベース側で強制します。日本語の全文検索は PGroonga です。

  • PostgreSQL17主データストア(Supabase のマネージド・コネクションプーラ経由と直接の接続)
  • Prisma7.10.0ORM(ドライバアダプタで pg に接続し、Enum を zod に再利用)
  • PGroonga3.2.5日本語の全文検索の拡張(CI も同じバージョン)
  • Row Level Securityテーブルごとのポリシーで行の可視範囲をデータベースで強制
データ層の補助の技術(3 項目)
  • pg8.23.0Node.js の PostgreSQL ドライバ
  • @prisma/adapter-pg7.10.0Prisma のドライバアダプタ
  • Table partitioning監査ログを月ごとのレンジパーティションに分割(pg_partman と pg_cron で保守)

認証・認可

Better Auth を土台に、Google アカウントでのサインインと 2 段階認証を備え、共有スペースごとの役割で権限を扱います。

  • Better Auth1.6.22認証の基盤(管理者・2 段階認証・メール OTP・共有スペースを表す組織のプラグイン)
  • Google OAuthGoogle アカウントでのサインイン
  • Role-based access閲覧者・投稿者・編集者・オーナーの役割で共有スペースごとに操作を許可
認証・認可の補助の技術(1 項目)
  • OIDC ID tokenPub/Sub と Eventarc の push の認証(ID トークンの署名・宛先・送信元を検証)

メール

通知メールは React Email で組み、Handlebars で差し込み、外部サービスの Resend から送ります。

  • React Email1.0.12メールのテンプレートを React で記述
  • Handlebars4.7.9本文への差し込み(API と共有)
メールの補助の技術(2 項目)
  • @react-email/render2.1.0テンプレートを HTML に描画
  • react-email CLI6.9.5テンプレートのプレビュー(開発用)

全体像へ戻る

基盤

松葉が動く場所です。Google Cloud のサービスと、それ以外の外部サービスに分けています。

Google Cloud

実行基盤は Cloud Run です。ストレージ・メッセージング・スケジューリング・シークレット・観測・配信の各サービスを使い、コンソールで構築した設定を宣言ファイルと照合しています。

  • 実行

    • Cloud Run servicesWeb・API・スキャン・同期・サムネイル生成の各サービス
    • Cloud Run jobsAPI のバッチ・Drive 同期のバッチ・ClamAV の定義の更新
  • ストレージ

    • Cloud Storage用途ごとのバケット(未検査・検査済み・隔離・サムネイルなど)と署名付き URL での直接の送受信
  • メッセージング

    • Pub/Subドメインイベントの配送(Outbox から発行し購読側で処理・デッドレターつき)
    • EventarcCloud Storage への書き込みをスキャンのサービスへ通知(OIDC で検証)
    • Cloud Tasks通知メールの送信キュー
  • スケジューリング

    • Cloud Scheduler定期のジョブの起動(宣言ファイルと実機の差分を日次で検査)
  • シークレットと認証

    • Secret Manager機密の設定値をサービスに渡す(デプロイ時に由来を検査)
    • Workload Identity FederationGitHub Actions から鍵を持たずに認証(OIDC)
  • 観測

    • Cloud Logging構造化ログの収集と、ログの一致によるアラート
    • Cloud Monitoringアラートポリシーを宣言ファイルで管理し実機と照合
  • 配信と防御

    • Cloud Load BalancingWeb と API を同じオリジンで配信(/api 配下を API のサービスへ振り分け)
Google Cloudの補助の技術(7 項目)
  • 実行

    • Artifact Registryコンテナイメージの保管
    • Cloud Build初回のイメージの作成だけに使用
    • Cloud Run Admin APIAPI と同期サービスからのジョブの起動(ZIP の作成・監査ログの書き出し・同期など)
  • シークレットと認証

    • IAM / service accounts署名用・Drive 用など、用途ごとのサービスアカウント
  • 観測

    • Error Reporting未捕捉の例外の自動集約(デプロイしたバージョンごと)
  • 配信と防御

    • Cloud Armorロードバランサの前段の WAF(OWASP のルールセットと送信元ごとのレート制限)
    • Cloud DNSドメインの DNS の管理(送信ドメインのレコードを宣言から適用し照合)

外部サービス

Google Cloud 以外に利用している外部のサービスです。

  • Supabaseマネージド PostgreSQL(コネクションプーラ経由と直接の接続)
  • Resend6.28.0トランザクションメールの送信と、配信結果の Webhook での受信
  • Google Drive共有ドライブへのアーカイブの同期(Drive API v3)
  • GitHubソース管理・CI/CD(Actions)・依存の更新(Dependabot)
外部サービスの補助の技術(2 項目)
  • Google Workspace Admin SDKWorkspace のアカウントの停止を日次で観測し、セッションを失効して管理者へ通知
  • buf.buildProtocol Buffers のリモート生成(プラグインをローカルに置かない)

全体像へ戻る

品質

壊さずに変え続けるための仕組みです。テスト・静的解析・CI/CD・観測性に分けています。

テスト

モックを原則使わず、実際の PostgreSQL と Cloud Storage の代替を CI のコンテナで動かして検証します。

  • Vitest4.1.11単体・結合・行レベルセキュリティ・性能の各テスト(API は設定を分けて実行)
  • Playwright1.63.0E2E(未認証・認証済み・メンテナンスモードのプロジェクトに分けて実行・不安定なテストは隔離)
  • go testGo のサービスのテスト
テストの補助の技術(2 項目)
  • groonga/pgroonga3.2.5CI のサービスコンテナ(Supabase と同じバージョンの PGroonga を入れた PostgreSQL)
  • fake-gcs-serverCI で Cloud Storage を代替するサービスコンテナ

静的解析

ESLint の flat config に独自の禁止規則を足し、設計上の約束はテストで機械的に守ります。

  • ESLint9.39.5flat config(base・nextjs・node・api の共有設定と、独自の禁止構文・import の制限)
  • typescript-eslint8.65.0TypeScript の構文解析と規則
  • Architecture testsバレルの禁止・機能間の循環参照の禁止・live region の構造などの約束をテストで検査
静的解析の補助の技術(2 項目)
  • eslint-config-next16.3.5Next.js の規則
  • Prettier3.9.6整形

CI/CD

GitHub Actions で検証とデプロイを分け、鍵を持たずに Cloud Run へ配ります。依存の更新は Dependabot です。

  • GitHub ActionsCI(lint・型・テスト・E2E)と、変更のあったアプリケーションだけを配る CD
  • Docker各アプリケーションのコンテナイメージ(CD がランナー上で組み立てて Artifact Registry へ)
  • Dependabotnpm・Go・GitHub Actions・Docker の依存の更新
CI/CDの補助の技術(11 項目)
  • actions/checkoutv7リポジトリの取得
  • actions/setup-nodev7Node.js の準備
  • actions/setup-gov7Go の準備
  • pnpm/action-setupv6pnpm の準備(バージョンは package.json から)
  • actions/cachev6Turborepo と Playwright のブラウザのキャッシュ
  • actions/upload-artifactv7テスト結果の保存
  • dorny/paths-filterv4変更のあったアプリケーションの検知
  • bufbuild/buf-setup-actionv1buf の準備
  • google-github-actions/authv3Workload Identity Federation での認証
  • google-github-actions/setup-gcloudv3gcloud の準備
  • docker/login-actionv4Artifact Registry へのログイン

観測性

構造化ログを Cloud Logging に集め、監視とスケジューラの宣言ファイルを実機と照合して差分を検知します。

  • Structured loggingJSON 形式の構造化ロガー(Web はサーバとブラウザの例外も記録)
  • Drift detection監視・スケジューラ・Pub/Sub・送信ドメインの DNS の宣言と実機を照合(日次のジョブと CD)
  • In-app alertsアプリ内のアラートをテーブルに記録し管理画面に表示

全体像へ戻る

開発基盤

複数のアプリケーションとパッケージを同じリポジトリで扱うための道具です。

モノレポ

pnpm のワークスペースと Turborepo で Node.js のアプリケーションとパッケージを、go.work で Go のモジュールをまとめ、Protocol Buffers の生成は buf で行います。

  • pnpm9.15.4パッケージ管理とワークスペース(推移的な依存の脆弱性は overrides で手当て)
  • Turborepo2.10.12タスクの実行順とキャッシュ
  • go.workGo のモジュールのワークスペース
  • buf1.73.0Protocol Buffers の lint とコード生成
モノレポの補助の技術(1 項目)
  • Docker Compose同期・スキャンのサービスのローカル起動

全体像へ戻る