Supabase実践ガイド2025 - PostgreSQL×認証×リアルタイム統合開発
Supabase完全活用術。PostgreSQLベースのBaaS、Row Level Security、Edge Functions、リアルタイム機能まで。Firebase代替として選ばれる理由と実装パターンを詳しく解説します。
Supabase 2025年版の完全ガイド。AI統合、データベース設計、リアルタイム機能、認証、ストレージ、エッジ関数、デプロイメント戦略を網羅。実際のプロジェクトでの活用方法を詳しく解説します。
Supabase は、2025 年現在において最も注目されるオープンソースの BaaS(Backend as a Service)プラットフォームです。PostgreSQL をベースとした強力なデータベース機能、リアルタイム機能、認証システム、ストレージ、そして最新の AI 機能まで、モダンな Web アプリケーション開発に必要な全ての機能を提供しています。
2025 年の Supabaseは、AI 機能の統合において大きな進歩を遂げています。
SQLクエリ生成とデータベース設計支援
ベクトル検索の簡単実装
AI ツールとの seamless な連携
機能 | 従来版 | 2025年版 | 改善点 |
---|---|---|---|
データベース接続 | PgBouncer | Dedicated Poolers | 2倍のパフォーマンス向上 |
スケーラビリティ | 単一DB | Multigres (Vitess) | 水平スケーリング対応 |
リード性能 | 単一エンドポイント | Nearest Read Replica | レイテンシ50%削減 |
AI処理 | 外部API | Automatic Embeddings | コスト80%削減 |
Next.js App Router 対応セットアップ
# プロジェクト作成
npx create-next-app@latest my-supabase-app --app --typescript --tailwind
cd my-supabase-app
# Supabase CLI インストール
npm install -g @supabase/cli
# Supabase プロジェクト初期化
supabase init
supabase start
# クライアントライブラリインストール
npm install @supabase/supabase-js
環境変数設定
// .env.local
NEXT_PUBLIC_SUPABASE_URL=your-supabase-url
NEXT_PUBLIC_SUPABASE_ANON_KEY=your-anon-key
SUPABASE_SERVICE_ROLE_KEY=your-service-role-key
Nuxt 3 対応セットアップ
# プロジェクト作成
npx nuxi@latest init my-supabase-app
cd my-supabase-app
# Supabase モジュールインストール
npm install @nuxtjs/supabase
# nuxt.config.ts に追加
export default defineNuxtConfig({
modules: ['@nuxtjs/supabase'],
supabase: {
redirectOptions: {
login: '/',
callback: '/confirm',
exclude: ['/register']
}
}
})
Flutter 対応セットアップ
// pubspec.yaml
dependencies:
flutter:
sdk: flutter
supabase_flutter: ^2.0.0
// main.dart
import 'package:supabase_flutter/supabase_flutter.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Supabase.initialize(
url: 'your-supabase-url',
anonKey: 'your-anon-key',
);
runApp(MyApp());
}
React Native Expo 対応セットアップ
# Expo プロジェクト作成
npx create-expo-app my-supabase-app
cd my-supabase-app
# Supabase 関連パッケージインストール
npm install @supabase/supabase-js
npm install react-native-url-polyfill
// App.js
import 'react-native-url-polyfill/auto';
import { createClient } from '@supabase/supabase-js';
const supabase = createClient(
'your-supabase-url',
'your-anon-key'
);
// 従来:直接的な設定
import { createClient } from '@supabase/supabase-js'
const supabase = createClient(
process.env.NEXT_PUBLIC_SUPABASE_URL,
process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY
)
// 2025年推奨:型安全な設定
import { createClient } from '@supabase/supabase-js'
import { Database } from '@/types/database'
const supabase = createClient<Database>(
process.env.NEXT_PUBLIC_SUPABASE_URL!,
process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!,
{
auth: {
persistSession: true,
autoRefreshToken: true,
},
db: {
schema: 'public',
},
realtime: {
params: {
eventsPerSecond: 10,
},
},
}
)
// 従来:直接的な設定
import { createClient } from '@supabase/supabase-js'
const supabase = createClient(
process.env.NEXT_PUBLIC_SUPABASE_URL,
process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY
)
// 2025年推奨:型安全な設定
import { createClient } from '@supabase/supabase-js'
import { Database } from '@/types/database'
const supabase = createClient<Database>(
process.env.NEXT_PUBLIC_SUPABASE_URL!,
process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!,
{
auth: {
persistSession: true,
autoRefreshToken: true,
},
db: {
schema: 'public',
},
realtime: {
params: {
eventsPerSecond: 10,
},
},
}
)
チャートを読み込み中...
2025 年の Supabaseでは、RLS の設定が必須となります。適切に設定されていない場合、データの漏洩リスクが高まります。
基本的なRLS設定
-- profiles テーブルのRLS
ALTER TABLE profiles ENABLE ROW LEVEL SECURITY;
-- 自分のプロファイルのみ表示
CREATE POLICY "Users can view own profile" ON profiles
FOR SELECT USING (auth.uid() = auth_id);
-- 自分のプロファイルのみ更新
CREATE POLICY "Users can update own profile" ON profiles
FOR UPDATE USING (auth.uid() = auth_id);
高度なRLS設定
-- 投稿の可視性制御
CREATE POLICY "Published posts are visible to everyone" ON posts
FOR SELECT USING (published = true);
-- 作成者は自分の投稿をすべて表示
CREATE POLICY "Authors can view own posts" ON posts
FOR SELECT USING (auth.uid() = author_id);
-- 動的権限チェック
CREATE POLICY "Team members can view team posts" ON posts
FOR SELECT USING (
EXISTS (
SELECT 1 FROM team_members
WHERE team_members.user_id = auth.uid()
AND team_members.team_id = posts.team_id
)
);
AI機能との統合
-- ベクトル検索のためのRLS
CREATE POLICY "AI search respects user permissions" ON documents
FOR SELECT USING (
published = true OR
author_id = auth.uid() OR
EXISTS (
SELECT 1 FROM document_permissions
WHERE document_id = documents.id
AND user_id = auth.uid()
)
);
-- 自動エンベディング生成の制御
CREATE POLICY "Auto-embedding generation" ON documents
FOR INSERT WITH CHECK (auth.uid() = author_id);
-- 基本的なインデックス
CREATE INDEX idx_posts_author_id ON posts(author_id);
CREATE INDEX idx_posts_created_at ON posts(created_at DESC);
CREATE INDEX idx_posts_published ON posts(published) WHERE published = true;
-- 複合インデックス
CREATE INDEX idx_posts_author_published_created
ON posts(author_id, published, created_at DESC);
-- 部分インデックス
CREATE INDEX idx_posts_published_recent
ON posts(created_at DESC)
WHERE published = true AND created_at > NOW() - INTERVAL '30 days';
-- GIN インデックス(配列・JSON用)
CREATE INDEX idx_posts_tags ON posts USING GIN(tags);
-- ベクトル検索用インデックス(AI機能)
CREATE INDEX idx_documents_embedding ON documents
USING ivfflat (embedding vector_cosine_ops)
WITH (lists = 100);
認証方法 | 実装難易度 | 2025年対応 | 推奨用途 |
---|---|---|---|
Email/Password | 低 | ✓ | B2B アプリケーション |
Magic Link | 低 | ✓ | B2C アプリケーション |
OAuth (Google, GitHub) | 中 | ✓ | ソーシャルログイン |
Phone (SMS) | 中 | ✓ | モバイルアプリ |
SAML/OIDC | 高 | ✓ | エンタープライズ |
Passkey/WebAuthn | 高 | ✓ | セキュリティ重視 |
// 基本的なログイン
const { data, error } = await supabase.auth.signInWithPassword({
email: 'user@example.com',
password: 'password123'
})
// MFA対応ログイン
const { data, error } = await supabase.auth.signInWithPassword({
email: 'user@example.com',
password: 'password123'
})
// MFA設定の確認
if (data.user && !error) {
const { data: factors } = await supabase.auth.mfa.listFactors()
if (factors?.length > 0) {
// MFA チャレンジ
const { data: challenge } = await supabase.auth.mfa.challenge({
factorId: factors[0].id
})
// TOTP コード検証
const { data: verify } = await supabase.auth.mfa.verify({
factorId: factors[0].id,
challengeId: challenge.id,
code: userInputCode
})
}
}
// 基本的なログイン
const { data, error } = await supabase.auth.signInWithPassword({
email: 'user@example.com',
password: 'password123'
})
// MFA対応ログイン
const { data, error } = await supabase.auth.signInWithPassword({
email: 'user@example.com',
password: 'password123'
})
// MFA設定の確認
if (data.user && !error) {
const { data: factors } = await supabase.auth.mfa.listFactors()
if (factors?.length > 0) {
// MFA チャレンジ
const { data: challenge } = await supabase.auth.mfa.challenge({
factorId: factors[0].id
})
// TOTP コード検証
const { data: verify } = await supabase.auth.mfa.verify({
factorId: factors[0].id,
challengeId: challenge.id,
code: userInputCode
})
}
}
Supabase 2025 の新機能により、これまで数週間かかっていた実装が数日で完了しました。特に AI 機能の統合とリアルタイム機能の強化により、ユーザー体験が大きく向上しています。
Supabase 2025 は、従来の BaaS プラットフォームを大きく超える機能を提供します。
Supabase 2025 により、より効率的で拡張性の高いアプリケーション開発が可能になります。この完全ガイドを参考に、次世代の Web アプリケーションを構築してください。