「バックエンドをゼロから構築するのは大変だけど、Firebaseのベンダーロックインが怖い」——そんな個人開発者に今もっとも注目されているのが Supabase です。

2026年3月時点でGitHubスター数は99,000を突破し、「Firebase代替」の文脈で圧倒的な支持を集めるオープンソースBaaS(Backend as a Service)です。PostgreSQL・認証・リアルタイム・ストレージ・Edge Functionsを無料から使える太っ腹な構成で、個人開発からスタートアップまで幅広く採用されています。

この記事では、Supabaseの核心機能を実践的なコード例とともに解説します。「使ってみたいけど何から始めればいいかわからない」という人が、読み終えたらすぐ手を動かせるレベルを目指します。

Supabaseとは何か|Firebase代替の本命

Supabaseは2020年にローンチした、オープンソースのBaaSプラットフォームです。Googleが運営するFirebaseとよく対比されますが、最大の違いはPostgreSQLをデータベースの中核に据えている点です。

Firebaseが独自のNoSQLデータベース(Firestore)を使うのに対し、SupabaseはオープンスタンダードのSQLデータベースを採用しています。これは単なる技術的な差異ではなく、開発体験と長期的なリスク管理に大きな影響を与えます。

Supabaseが提供する主な機能

  • Database — PostgreSQL。フルSQLクエリ、Row Level Security(RLS)、リアルタイム変更通知に対応
  • Authentication — メール/パスワード、マジックリンク、Google・GitHub等のOAuth、電話番号認証に対応
  • Storage — 画像・動画・ファイルのアップロード。CDN配信と変換機能付き
  • Realtime — PostgreSQLの変更をWebSocketでリアルタイム配信。チャット・コラボ系アプリに最適
  • Edge Functions — Deno ベースのサーバーレス関数。カスタムロジックをサーバーで実行
  • Vector — pgvectorを使ったベクトル検索。RAGパイプライン構築に活用可能

これらがひとつのプラットフォームに統合されており、ダッシュボードから一元管理できます。個人開発者にとって「管理する場所が少ない」のは大きなメリットです。

2026年時点の無料枠|個人開発なら十分すぎる

Supabaseの無料プラン(Free Plan)は、個人開発の初期段階で十分以上のリソースを提供します。

機能 無料枠
データベース容量 500MB
月間アクティブユーザー(Auth) 50,000人
ストレージ 1GB
Edge Functions呼び出し数 月500,000回
帯域幅 5GB/月

注意点として、無料プロジェクトは7日間非アクティブな場合に一時停止されます(データは消えません)。運用中のプロジェクトは月$25のProプランへの移行が安心ですが、開発・検証フェーズなら無料で十分です。

Firebaseとの比較|どちらを選ぶべきか

「SupabaseとFirebase、どちらを使えばいいか」は個人開発者がよく直面する問いです。両者の特性を整理しておきましょう。

Supabaseが有利なシーン

  • 複雑なクエリが必要 — JOINや集計関数など、SQLの表現力がフルに使える
  • ベンダーロックインを避けたい — PostgreSQLは標準技術。Supabaseから自前のPostgreSQLサーバーへ移行も容易
  • 既存のSQLスキルを活かしたい — SQL経験者はSupabaseの学習コストが低い
  • オープンソースにこだわる — セルフホストも可能。依存先をコントロールしたい開発者に向く
  • AIアプリを作る — pgvectorによるベクトル検索がネイティブに使える

Firebaseが有利なシーン

  • Googleエコシステムとの深い連携 — Firebase Hosting、Cloud Functionsとの統合が必要な場合
  • モバイルアプリ(Android)が主戦場 — Google PlayとのFirebase Analytics連携など
  • NoSQLのドキュメント型が最適 — 非構造化・ネストの深いデータを扱う場合

2026年時点では、新規個人開発プロジェクトのバックエンドとしてSupabaseを選ぶ理由の方が多くなっています。特にAI機能を組み込む場合、pgvectorの存在は大きなアドバンテージです。

広告スペース

実践:Supabaseプロジェクトのセットアップ

ここからは実際に手を動かしてみましょう。フロントエンドはNext.js(React)を想定していますが、Supabaseのクライアントライブラリは主要フレームワーク(Vue、SvelteKit、Nuxt等)に対応しています。

ステップ1:プロジェクト作成

まず supabase.com でアカウントを作成し、新規プロジェクトを作成します。プロジェクトを作成したら、ダッシュボードの「Settings > API」からURLとanon keyをコピーしてください。

ステップ2:クライアントライブラリのインストール

npm install @supabase/supabase-js

Next.jsプロジェクトなら、さらにSSR対応のパッケージを追加します。

npm install @supabase/ssr

ステップ3:クライアントの初期化

// lib/supabase.ts
import { createClient } from '@supabase/supabase-js'

const supabaseUrl = process.env.NEXT_PUBLIC_SUPABASE_URL!
const supabaseAnonKey = process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!

export const supabase = createClient(supabaseUrl, supabaseAnonKey)

環境変数は .env.local に記載します。

NEXT_PUBLIC_SUPABASE_URL=https://xxxxxxxxxx.supabase.co
NEXT_PUBLIC_SUPABASE_ANON_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...

認証(Auth)を実装する

Supabaseの認証機能は、数行のコードでメール/パスワード認証とOAuthを実装できます。

メール/パスワード認証

// サインアップ
const { data, error } = await supabase.auth.signUp({
  email: 'user@example.com',
  password: 'securepassword123',
})

// サインイン
const { data, error } = await supabase.auth.signInWithPassword({
  email: 'user@example.com',
  password: 'securepassword123',
})

// サインアウト
await supabase.auth.signOut()

// 現在のユーザー取得
const { data: { user } } = await supabase.auth.getUser()

GitHub OAuth(ワンクリック認証)

// GitHubでサインイン
const { data, error } = await supabase.auth.signInWithOAuth({
  provider: 'github',
  options: {
    redirectTo: 'https://your-app.com/auth/callback'
  }
})

SupabaseダッシュボードでGitHub OAuth AppのClient IDとSecretを設定するだけで動きます。GoogleやDiscordも同様の手順で追加できます。

セッション管理の注意点

Next.js App Routerを使う場合、サーバーコンポーネントでのセッション管理には @supabase/ssr を使うことが推奨されています。Cookieベースのセッション管理で、セキュリティと使い勝手のバランスが取れます。

データベース操作|SQL+型安全なクライアント

SupabaseのデータベースはPostgreSQLなので、ダッシュボードのSQLエディタで直接テーブルを作成できます。

テーブル作成(SQL)

-- タスク管理アプリの例
CREATE TABLE tasks (
  id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
  user_id UUID REFERENCES auth.users(id) ON DELETE CASCADE,
  title TEXT NOT NULL,
  completed BOOLEAN DEFAULT FALSE,
  created_at TIMESTAMPTZ DEFAULT NOW()
);

-- Row Level Security(RLS)を有効化
ALTER TABLE tasks ENABLE ROW LEVEL SECURITY;

-- 自分のタスクだけ読み書きできるポリシー
CREATE POLICY "Users can manage their own tasks"
  ON tasks
  FOR ALL
  USING (auth.uid() = user_id)
  WITH CHECK (auth.uid() = user_id);

Row Level Security(RLS)は必ず有効化してください。 RLSなしでは、anon keyを知っている誰でも全データにアクセスできてしまいます。

JavaScriptからのCRUD操作

// データ取得
const { data: tasks, error } = await supabase
  .from('tasks')
  .select('*')
  .order('created_at', { ascending: false })

// データ追加
const { data, error } = await supabase
  .from('tasks')
  .insert({ title: '新しいタスク', user_id: user.id })
  .select()
  .single()

// データ更新
const { error } = await supabase
  .from('tasks')
  .update({ completed: true })
  .eq('id', taskId)

// データ削除
const { error } = await supabase
  .from('tasks')
  .delete()
  .eq('id', taskId)

型安全なクエリ:supabase-gen-types

SupabaseにはDBスキーマからTypeScript型を自動生成するCLIが用意されています。

npx supabase gen types typescript --project-id "your-project-id" > types/supabase.ts

生成された型をクライアントに渡すことで、テーブル名のタイポやカラムの型ミスをコンパイル時に検出できます。個人開発でも型安全なコードを維持しやすくなります。

広告スペース

リアルタイム機能|PostgreSQLの変更をライブ配信

Supabaseのリアルタイム機能は、PostgreSQLのChange Data Capture(CDC)をWebSocketで配信する仕組みです。他のユーザーの操作をリアルタイムに反映するコラボ系アプリや、モニタリングダッシュボードに最適です。

// タスクの変更をリアルタイム受信
const channel = supabase
  .channel('tasks-changes')
  .on(
    'postgres_changes',
    {
      event: '*', // INSERT, UPDATE, DELETE すべて
      schema: 'public',
      table: 'tasks',
      filter: `user_id=eq.${userId}`,
    },
    (payload) => {
      console.log('Change received!', payload)
      // UIを更新する処理
      refreshTasks()
    }
  )
  .subscribe()

// クリーンアップ
supabase.removeChannel(channel)

フィルタ条件を指定することで、関係するデータの変更だけを受信できます。全テーブルの変更をブロードキャストするとパフォーマンスに影響するため、できるだけ絞り込むのがポイントです。

Edge Functions|サーバーサイドロジックをDenoで

Edge Functionsは、Denoで書くサーバーレス関数です。Webhookのエンドポイント、決済処理、外部APIの呼び出しなど、クライアントに漏らしたくないロジックをここに集約します。

Edge Functionの作成

# Supabase CLIをインストール
npm install -g supabase

# ローカル初期化
supabase init

# Edge Functionを作成
supabase functions new send-welcome-email

作成された supabase/functions/send-welcome-email/index.ts を編集します。

import { serve } from 'https://deno.land/std@0.177.0/http/server.ts'
import { createClient } from 'https://esm.sh/@supabase/supabase-js@2'

serve(async (req) => {
  const { userId, email } = await req.json()

  // ResendやSendGridでウェルカムメール送信
  const res = await fetch('https://api.resend.com/emails', {
    method: 'POST',
    headers: {
      'Authorization': `Bearer ${Deno.env.get('RESEND_API_KEY')}`,
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({
      from: 'noreply@yourapp.com',
      to: email,
      subject: 'ご登録ありがとうございます!',
      html: `

ようこそ!アカウントの準備ができました。

`, }), }) return new Response(JSON.stringify({ success: true }), { headers: { 'Content-Type': 'application/json' }, }) })

AuthのWebhookと組み合わせる

SupabaseのAuth Webhookを使えば、ユーザー登録時に自動でEdge Functionを呼び出す設定が可能です。ダッシュボードの「Auth > Hooks」で、「After Sign Up」イベントにEdge FunctionのURLを登録するだけです。

ストレージ|ファイルアップロードとCDN配信

Supabaseのストレージは、S3互換のオブジェクトストレージです。画像・動画・PDFのアップロードとCDN配信が簡単に実装できます。

// 画像をアップロード
const file = event.target.files[0]
const { data, error } = await supabase.storage
  .from('avatars') // バケット名
  .upload(`${userId}/avatar.png`, file, {
    contentType: 'image/png',
    upsert: true, // 上書きを許可
  })

// 公開URLを取得
const { data: { publicUrl } } = supabase.storage
  .from('avatars')
  .getPublicUrl(`${userId}/avatar.png`)

画像変換(リサイズ・クロップ・フォーマット変換)も、URLパラメータで指定できます。

// 200x200にリサイズしたサムネイルURL
const { data: { publicUrl } } = supabase.storage
  .from('avatars')
  .getPublicUrl(`${userId}/avatar.png`, {
    transform: {
      width: 200,
      height: 200,
      resize: 'cover',
    }
  })

pgvector|AIアプリのベクトル検索

Supabaseは pgvector 拡張をネイティブサポートしており、PostgreSQL内でベクトル検索ができます。OpenAIのEmbedding APIやローカルLLMで生成したベクトルを保存し、類似検索でRAGパイプラインを構築するのに最適です。

-- pgvector拡張の有効化
CREATE EXTENSION IF NOT EXISTS vector;

-- ドキュメントテーブル(1536次元はtext-embedding-3-smallの場合)
CREATE TABLE documents (
  id BIGSERIAL PRIMARY KEY,
  content TEXT,
  embedding VECTOR(1536)
);

-- コサイン類似度で近い順に取得する関数
CREATE OR REPLACE FUNCTION match_documents (
  query_embedding VECTOR(1536),
  match_count INT DEFAULT 5
)
RETURNS TABLE (id BIGINT, content TEXT, similarity FLOAT)
LANGUAGE SQL STABLE
AS $$
  SELECT id, content, 1 - (embedding <=> query_embedding) AS similarity
  FROM documents
  ORDER BY embedding <=> query_embedding
  LIMIT match_count;
$$;

Webページの要約機能(例えば AI要約ツール)を作る場合、ページ内容のベクトル化→Supabaseに保存→類似ページの推薦という構成が数十行で実現できます。

個人開発での実践的な活用パターン

Supabaseを使った個人開発プロダクトのアーキテクチャ例を紹介します。

パターン1:Webサービス監視ダッシュボード

複数のWebサービスの死活監視を行うツールは、Supabaseと相性がよいユースケースです。

  • DB — サービスURL・チェック間隔・アラート設定をPostgreSQLで管理
  • Edge Functions — 定期的にURLにリクエストし、ステータスをDBに記録
  • Realtime — ダッシュボードの死活状態をリアルタイム更新
  • Auth — チームメンバーをプロジェクトに招待

Webサービスの監視という点では、PagePulse(Webページ変更監視ツール)のようなサービスと組み合わせることで、監視対象ページの変更検知も自動化できます。

パターン2:ステータスページの自動化

サービスのインシデント情報を公開するステータスページも、Supabaseで効率よく構築できます。SupabaseのRealtimeでインシデント情報の更新を即座にページへ反映し、Auth機能で運営チームだけが編集できる仕組みを作れます。ステータスページは StatusCraft(ステータスページ作成ツール)のような専用ツールと組み合わせるのも効果的です。

パターン3:AI要約・検索サービス

pgvectorを活用したセマンティック検索エンジンは、Supabaseの得意分野です。ユーザーがURLを入力すると内容を取得→OpenAI APIでベクトル化→Supabaseに保存→類似コンテンツを推薦する流れは、QuickSummary(AI要約Chrome拡張)のようなツールのバックエンドとしても応用できます。

セキュリティの注意事項

Supabaseを使う上で、特に重要なセキュリティポイントをまとめます。

必ずRow Level Security(RLS)を設定する

最重要事項です。テーブルを作成したら必ずRLSを有効化し、適切なポリシーを設定してください。RLSなしのテーブルは、anon keyさえあれば誰でもアクセスできます。

-- すべてのテーブルでRLSを有効化(習慣にする)
ALTER TABLE your_table ENABLE ROW LEVEL SECURITY;

Service Role Keyの扱いに注意

SupabaseにはRLSをバイパスできる service_role キーがあります。このキーは絶対にクライアントサイドに含めてはいけません。Edge FunctionsやサーバーサイドのAPIルートのみで使用し、環境変数に格納してください。

認証エンドポイントのレート制限

SupabaseのAuthにはデフォルトでレート制限が設けられていますが、ダッシュボードの「Auth > Rate Limits」で設定を確認・調整できます。ブルートフォース攻撃対策として、メールサインアップ・パスワードリセットの制限値を適切に設定しましょう。

🚀 個人開発の次のステップ

Supabaseでバックエンドを構築したら、サービスの信頼性を高める次の取り組みも考えてみてください。

  • 📊 PagePulse — Webサービスの変更をリアルタイム監視。Supabaseと組み合わせて死活監視を自動化
  • 🟢 StatusCraft — ユーザーへの信頼を高めるステータスページを自動生成。Supabaseのリアルタイム機能と相性抜群
  • QuickSummary — pgvectorと連携するAI要約機能をChrome拡張として提供

個人開発でも品質と信頼性を両立させることで、ユーザーの継続率が大きく変わります。

まとめ|Supabaseで個人開発のバックエンドを爆速構築

Supabaseは、個人開発者がバックエンドに費やす時間を大幅に削減しながら、プロダクションレベルの機能を提供します。

  • PostgreSQLベース — SQLの表現力で複雑なクエリも対応。ベンダーロックインなし
  • 認証・DB・ストレージが一体化 — 管理先を分散させずに開発に集中できる
  • リアルタイム対応 — コラボ系・モニタリング系アプリのリアルタイム機能が簡単に実装
  • pgvectorでAI対応 — ベクトル検索・RAGパイプラインをPostgreSQL内で完結
  • 充実した無料枠 — 月50,000アクティブユーザーまで無料。個人開発の初期フェーズは課金不要
  • 型安全なクライアント — スキーマから型を自動生成し、TypeScriptとの親和性が高い

Firebase代替として検討している方、PostgreSQLに移行したい方、AIアプリのバックエンドを探している方——どのシーンでもSupabaseは有力な選択肢です。まずは無料プロジェクトを作成して、ダッシュボードの使い心地を体験してみてください。

バックエンドを素早く立ち上げて、プロダクトの本質的な価値の構築に集中する。それが2026年の個人開発の正しいアプローチです。