stackbook

← 作るもの

リアルタイム通信

チャット、通知、共同編集

条件DB中心 · PaaS · 1〜2人 · MVP · 制約なし

推奨:TypeScript

推奨

TypeScript

  • 数万接続に満たないチャットや通知はマネージドの基盤で足り、言語はフロントと揃えられる(§2-10 手順2、§19-9)

構成行を開くと詳細(乗り換える条件・根拠・費用・習熟度)

言語TypeScript

TypeScript

公式サイト ↗

言語別の既定§2-1

選ぶ場面§2-10

  • 実行環境がエッジ(Cloudflare Workers等)
  • DBの読み書きと業務ロジックが中心ボトルネックはDB。言語の性能差はほぼ効かないので、開発速度とチームで選ぶ
  • 外部APIの待ち時間が中心非同期I/Oの書きやすさと、フロントとの型共有
  • サーバーレスのイベント処理起動が速く、AWS SDKが充実。起動速度を詰めるならGo
  • GraphQLサーバーGraphQLのツール群がTypeScript中心

既定:一般的なWeb API・SaaSのバックエンド作成物ごとの言語の決め方

乗り換える条件

  • Go3人以上で公開APIを長期運用するとき(§2-10 手順3)

負荷の性質で決まる場合は §2-10 を優先する

既定:エッジ関数作成物ごとの言語の決め方

乗り換える条件

既定:LLM API呼び出し中心のAIアプリ作成物ごとの言語の決め方

乗り換える条件

  • Python埋め込み処理や評価などML系ライブラリを本格的に使うとき

既定:スクリプト・社内の小さな自動化作成物ごとの言語の決め方

乗り換える条件

  • Go単一バイナリで配りたいとき
  • シェルスクリプト数行で済むとき

代替:CRUD中心のWebアプリ・管理画面作成物ごとの言語の決め方

既定は Rails(画面の多い業務システムを最も速く作れる)。外部API連携が中心、またはReactで画面を作り込みたいとき に乗り換える。

代替:CLIツール作成物ごとの言語の決め方

既定は Go。社内向けでnpmの資産を使いたい に乗り換える。

代替:ブラウザ内の重い処理(画像・動画処理、暗号、大量データの解析)作成物ごとの言語の決め方

既定は Rust → WebAssembly。処理がそこまで重くないとき に乗り換える。

採用の根拠§22-2

GitHubのOctoverse 2025(https://octoverse.github.com/)で、2025年8月に月間コントリビューター数でPythonとJavaScriptを抜き最も使われる言語になった。Next.jsやAstroなど主要フレームワークが既定でTypeScriptのプロジェクトを生成する。型によって多くの不具合をリリース前に検出でき、AIによるコード生成の誤りも型チェックで拾いやすい。フロントとバックエンドを1言語で書ける

「JavaScriptより難しいのでは」→ 型は段階的に導入でき、エディタ補完が効くぶん学習もしやすい

成長したら → 一部をGo/Rustに切り出し§24

きっかけ
CPU負荷・レイテンシがボトルネックになった
最初からの備え
APIをOpenAPIで定義しておき、実装言語を差し替えられるようにする

ケース別の構成§19

  • EC(独自要件が多い)コマースエンジン:Medusa(TypeScript)
  • AI/LLMプロダクトAIバックエンド:LLM API呼び出し中心ならHono(TS)、埋め込み・ML処理があるならFastAPI(uv、Ruff、Pydantic)

習熟度

フロントNext.js(App Router)

Next.js

公式サイト ↗

既定:アプリ(SSR・フルスタック)フロントエンド

乗り換える条件

  • TanStack StartVercel依存を避けたい、クライアント主体で型安全なルーティングを重視するとき
  • React Router(フレームワークモード)Remix系の資産があるとき

代替:画面Elixir(BEAM)

既定は Phoenix LiveView(サーバー主導でリアルタイムUI)。フロントをReactで作りたいとき に乗り換える。

代替:静的サイト・コンテンツ中心フロントエンド

既定は Astro。同じリポジトリでアプリ部分も持つとき に乗り換える。

代替:同一リポジトリ内のフロント⇔バック(TS同士)API設計

既定は Hono RPC。Next.jsの中で完結し、別プロセスのAPIを持たないとき に乗り換える。

成長したら → ECS/Cloud Run(コンテナ)§24

きっかけ
費用の増加、AWSに集約したい
最初からの備え
Next.jsのstandalone出力でコンテナ化できる状態を保つ。Vercel固有の機能への依存を最小にする

ケース別の構成§19

  • EC(独自要件が多い)フロント:Next.js+shadcn/ui
  • 自社SaaS(B2B)フロント:Next.js+shadcn/ui+TanStack Query
  • toCサービス(Web+モバイル)Web:Next.js
  • AI/LLMプロダクトフロント:Next.js(ストリーミング表示)
  • 個人開発・MVPTS全部入り:Next.js+Supabase+Vercel

習熟度

バックエンドHono(軽量・どこでも動く・型安全なRPC)

Hono

公式サイト ↗

既定:HTTPフレームワークTypeScript(Node.js)

乗り換える条件

  • NestJS10人以上のチームでDI・モジュール構造を強制したいとき
  • FastifyNode専用で既存プラグイン資産を使いたいとき

ケース別の構成§19

  • 業務システム・社内ツール(TypeScript構成)API:Hono(RPCでフロントと型共有)
  • 自社SaaS(B2B)バックエンド:Go(net/http+sqlc+pgx)。少人数ならHono
  • toCサービス(Web+モバイル)バックエンド:Hono(またはGo)
  • 個人開発・MVPエッジ:Hono+Cloudflare Workers+D1/R2

習熟度

DBPostgreSQL

PostgreSQL

公式サイト ↗

既定:RDBDB本体とホスティング

乗り換える条件

  • MySQL既存システムとの互換が必要なときのみ

採用の根拠§22-2

OSSでライセンス費用がかからない。AWS、GCP、Azureを含む主要クラウドがすべてマネージド版を提供している。拡張機能(pgvector、pg_bigm)でベクトル検索や日本語全文検索までこなせるため、専用DBを増やさずに済む

「MySQLの方が一般的では」→ 機能・標準SQLへの準拠・拡張性で優位。移行ツールも揃っている

ケース別の構成§19

  • 業務システム・社内ツール(Rails構成)DB:PostgreSQL
  • 業務システム・社内ツール(TypeScript構成)DB:PostgreSQL+Drizzle
  • 自社SaaS(B2B)DB:PostgreSQL(テナントIDカラム+Row Level Security)
  • AI/LLMプロダクトDB・ベクトル:PostgreSQL+pgvector
  • 個人開発・MVPGo単体:Go+PostgreSQL+htmx

習熟度

データアクセスDrizzle(SQLに近い・軽い・エッジ対応)

Drizzle

公式サイト ↗

既定:ORM/クエリTypeScript(Node.js)

乗り換える条件

  • Prismaスキーマ駆動でGUI(Studio)やマイグレーションの手厚さを重視するとき
  • KyselyORMを使わず型付きクエリビルダーだけ欲しいとき

ケース別の構成§19

  • 業務システム・社内ツール(TypeScript構成)DB:PostgreSQL+Drizzle

習熟度

ジョブpg-boss(Postgresベース、§4-3)

pg-boss

公式サイト ↗

既定:ジョブキューTypeScript(Node.js)

乗り換える条件

  • BullMQ(Redis/Valkey)秒間数百件を超える、またはValkeyが既にあるとき(§23-1)
  • Inngest/Trigger.devサーバーレス環境でワークフロー(リトライ・待機・ステップ実行)が必要なとき

ケース別の構成§19

  • 業務システム・社内ツール(TypeScript構成)ジョブ:BullMQ+Valkey(またはpg-boss)
認証Clerk(UI込み・最短で導入)

Clerk

公式サイト ↗

既定:マネージド(toC・スタートアップ)認証・認可

乗り換える条件

費用の注意§25

主な課金の軸
月間アクティブユーザー数
膨らみやすい要因
toCでユーザーが急増
対策
規模が見えたら §24 の移行パスを検討する

成長したら → 他のIdP・自前認証§24

きっかけ
費用の増加、要件がClerkの範囲を超えた
最初からの備え
OIDCの標準仕様で連携する。ユーザー情報の正本は自前のDBに持つ

ケース別の構成§19

  • 自社SaaS(B2B)認証:Clerk(SSO/SCIMが必要になったらWorkOS)
  • toCサービス(Web+モバイル)DB・認証・ストレージ:Supabase(小〜中規模)/ RDS+Clerk+S3(中規模以上)

習熟度

テストVitest

Vitest

公式サイト ↗

既定:テスト(ユニット)TypeScript(Node.js)

乗り換える条件

  • Jest既存プロジェクトのみ
インフラRender

Render

公式サイト ↗

既定:自由に選べる・Webアプリどこで動かすか

乗り換える条件

  • Fly.ioリージョンの指定やマシン単位の細かい制御が必要なとき
  • Railway個人・検証用途

既定:PRプレビュー環境CI/CD・リポジトリ運用

乗り換える条件

  • Neonのブランチ機能と組み合わせてDBも分離プレビューごとに本番相当のデータで確認したいとき

代替:デプロイRuby / Rails

既定は Kamal。サーバー管理をしたくないとき に乗り換える。

成長したら → AWS(ECS+RDS+Terraform)§24

きっかけ
閉域網・監査・細かい権限管理が必要になった
最初からの備え
Dockerfileでビルドし、設定はすべて環境変数から読む

ケース別の構成§19

  • 業務システム・社内ツール(Rails構成)デプロイ:Kamal(オンプレVM・VPS)またはRender
  • 業務システム・社内ツール(TypeScript構成)デプロイ:Render(AWSならECS on Fargate、オンプレならコンテナでVM)
  • データ基盤・バッチ実行:RenderのCron Job(AWSならECSのスケジュールタスク)
監視Sentry

Sentry

公式サイト ↗

既定:エラー監視監視・可観測性・運用

既定:RUM(実ユーザーの表示速度)監視・可観測性・運用

乗り換える条件

既定:エラー時のユーザー問い合わせプロダクト分析・機能フラグ

採用の根拠§22-2

障害の検知と原因特定の時間を短縮できる。計装をOpenTelemetryにしておけば、監視サービスを後から変更できる

「費用がかかる」→ 無料枠・サンプリングで調整できる。障害の長期化による損失の方が大きい

費用の注意§25

主な課金の軸
エラー数、トレースのスパン数、セッションリプレイ数、ログ量
膨らみやすい要因
同じエラーの大量発生、トレースの全量送信
対策
トレースのサンプリング率を設定する。既知のノイズを除外する

ケース別の構成§19

  • EC(独自要件が多い)監視:Sentry+Grafana Cloud
  • 自社SaaS(B2B)監視:Sentry+OpenTelemetry+Grafana Cloud
  • AI/LLMプロダクト監視:Sentry+OpenTelemetry
  • データ基盤・バッチ監視:Sentry(Cron Monitoringで実行漏れを検知)
  • モバイルアプリ単体監視:Sentry

習熟度

CIGitHub Actions

GitHub Actions

公式サイト ↗

既定:CIでのplan/applyIaC

乗り換える条件

  • AtlantisPRコメント駆動の運用をしたいとき

既定:CI/CDCI/CD・リポジトリ運用

乗り換える条件

習熟度

リアルタイムCloudflare Durable Objects

Cloudflare Durable Objects

公式サイト ↗

ケース別の構成§19

  • リアルタイム系(チャット・通知・共同編集)TS・マネージド:Cloudflare Durable Objects
共同編集Yjs(マネージドならLiveblocks)

Yjs

公式サイト ↗

ケース別の構成§19

  • リアルタイム系(チャット・通知・共同編集)共同編集:Yjs(マネージドならLiveblocks)

Liveblocks

公式サイト ↗

ケース別の構成§19

  • リアルタイム系(チャット・通知・共同編集)共同編集:Yjs(マネージドならLiveblocks)
片方向の配信Server-Sent Events

Server-Sent Events

公式サイト ↗

ケース別の構成§19

  • リアルタイム系(チャット・通知・共同編集)片方向で足りる:Server-Sent Events

構成図 リアルタイム系(チャット・通知・共同編集)

flowchart TB
  C1["クライアント"] -- "WebSocket" --> PX["Phoenix Channels<br/>+Presence"]
  C2["クライアント"] -- "WebSocket" --> PX
  PX --> PS["Phoenix PubSub<br/>ノード間配信"]
  PX --> DB[("PostgreSQL")]

作り始める

共通の準備

# 言語・ツールのバージョン固定(使う言語だけ)
mise use node@lts pnpm@latest
mise use go@latest
mise use ruby@latest
mise use python@latest uv@latest

# Gitフックと依存更新
pnpm add -D lefthook && pnpm exec lefthook install
# renovate.json を置き、GitHubでRenovateアプリを有効化する

リアルタイム・Elixir(§19-9)

mix archive.install hex phx_new
mix phx.new app
cd app && mix ecto.create

次に読む