🔥

小規模プロジェクトのフルスタックな開発はFirebaseがオススメ!

に公開

はじめに

フルスタックWebアプリケーションの開発において、ソースコードの設計やインフラ管理の複雑さはしばしば開発の障壁となります。
しかし、Firebaseを活用することで、これらの課題を大幅に軽減できます。今回は、実際の開発経験を基に、最近のFirebaseのオススメポイントをご紹介します。

プロジェクト概要

今回紹介するシステムは以下の技術スタックで構築されています:

  • フロントエンド: Next.js 15.0.0 (React 18)
  • バックエンド: Firebase Functions (Node.js 22)
  • ホスティング: Firebase App Hosting
  • AI統合: Genkit + Vertex AI (Gemini 2.0 Flash)
  • データベース: BigQuery
  • 認証: Firebase Auth

Firebaseのオススメポイント

1. App Hosting: GitHub統合による圧倒的な開発体験

GitHubとの高度な統合

Firebase App Hostingの最大の魅力は、GitHubリポジトリとの完全統合です。git pushするだけで自動デプロイが実行される仕組みが最初から備わっています。

# apphosting.yaml
runConfig:
  minInstances: 0
  # maxInstances: 100
  # concurrency: 80

env:
  # Firebase設定を環境変数として自動注入
  - variable: NEXT_PUBLIC_FIREBASE_API_KEY
    secret: NEXT_PUBLIC_FIREBASE_API_KEY
    availability:
      - BUILD
      - RUNTIME

  # Genkit設定
  - variable: GENKIT_ENV
    value: dev
    
  - variable: GCLOUD_PROJECT
    value: facility-analyze

Secret Managerとも簡単統合

上記のようにapphosting.yamlを使用することで、Google Cloud Secret Managerと簡単にセキュアな環境構築ができます。APIキーや機密情報を安全に管理しつつ、ビルド時とランタイム時の両方で利用可能なのは非常にポイントが高いです。

2. Functions: TypeScriptで手軽なバックエンド開発

TypeScriptでのサーバーレス開発

Firebase FunctionsはTypeScriptネイティブサポートにより、型安全なバックエンド開発が可能です。

Cloud Runとの統合でのインフラ管理が楽

Firebase FunctionsはCloud Run上で動作するため、スケーリング、負荷分散、リージョン配置などのインフラ管理が自動化されています。
最大インスタンス数やリージョン、利用するサービスアカウントの設定などもコード内で完結していくので良きですね。

// functions/src/utils/firebase-config.ts
export const getCommonFunctionConfig = (
  region: string = "asia-northeast1",
  options: Record<string, unknown> = {},
) => {
  return {
    region,
    enforceAppCheck: false,
    serviceAccount: process.env.VERTEX_AI_SERVICE_ACCOUNT,
    ...options,
  };
};

GenkitによるLLM統合の簡単さ

Genkitを使えば、GeminiをはじめとしたLLMの呼び出しがさらに簡単になります。例えば...こんな感じのコードが使えちゃいます。

// Web検索概要のAI生成
const webInfoInputSchema = z.object({
  name: z.string().describe("検索名"),
});
const webInfoOutputSchema = z.object({
  searchResults: z.array(z.string()),
  processingTime: z.number(),
  summary: z.string(),
});

const facilityWebInfoFlow = ai.defineFlow({
  name: "webInfoFlow",
  inputSchema: webInfoInputSchema,
  outputSchema: webInfoOutputSchema,
  streamSchema: z.string(),
}, async (input, { sendChunk }) => {
  sendChunk(`🔍 ${input.name}の情報収集を開始します...\n\n`);
  
  const response = await ai.generate({
    model: gemini20FlashLite.withConfig({
      googleSearchRetrieval: {
        dynamicRetrievalConfig: {},
      },
    }),
    prompt: `以下の介護施設について詳細な概要を作成してください...`,
  });
  
  return response.text;
});

3. 一つのリポジトリによるAI開発の効率化

モノレポ構成の利点

App HostingとFunctionsが一つのリポジトリにまとまることで、Claude CodeなどのAIを使った開発時のコンテキスト共有が非常に楽になっている実感があります。

.
├── src/                    # フロントエンド(Next.js)
│   ├── app/
│   ├── hooks/             # カスタムフック
│   ├── lib/firebase.ts    # Firebase設定
│   └── types/             # 型定義
├── functions/             # バックエンド(Firebase Functions)
│   ├── src/
│   │   ├── domain/        # DDDアーキテクチャ(などお好みの設計)
│   │   ├── use-case/
│   │   ├── infrastructure/
│   │   └── utils/
│   └── package.json
├── apphosting.yaml        # App Hosting設定
└── firebase.json          # Firebase設定

まとめ

Firebase を活用することで主に以下のメリットが得られると感じました。

  1. 開発効率の向上: GitHub統合によるフロントエンドの自動デプロイと環境変数管理
  2. インフラ管理の簡素化: サーバーレスアーキテクチャとマネージドサービスの利用によるインフラ管理の簡素化
  3. AI統合の簡単さ: GenkitによるLLM統合

特に小規模チームやPoCフェーズの開発において、Firebase は開発速度とコード品質のバランスを取るのに適した選択肢と言えそうに思います。
久々に触って、開発がかなりやりやすくなったことに本当に驚きました。
何かを小さく始める、という時に選択肢の一つとしてみても良いと思います!

最後に - 持続可能な介護の仕組みを、共に創りませんか?

ドクターメイトは、「すべての人生を右肩上がり」にするというビジョンを掲げ、医療介護の課題解決に取り組んでいます。
このビジョンに共感し、共に挑戦してくれる仲間を募集しています!
AI/LLMやプロダクト開発、またはドクターメイトの文化に興味がある方、ぜひ一度カジュアルにお話しましょう!
Entrance Bookでは開発組織のことなどをご紹介しています。
よろしければご覧ください!https://recruit.doctormate.co.jp/a785dcd553224d70b7b7daae12bb02f5

ドクターメイト

Discussion