深度拆解Supabase 107K Star开源Postgres开发平台:从Firebase替代到AI Agent原生基础设施的全栈架构演进
从一个简单的开源Firebase替代品,到107K Star的完整Postgres开发平台,再到AI Agent的原生基础设施——Supabase如何用"Postgres + 开源 + 全栈"三位一体策略,在2026年成为独立开发者和AI团队的首选后端平台?
引言:为什么Supabase在2026年成为现象级项目?
2026年4月,Supabase宣布完成Series F融资,同时GitHub Star数突破100K大关。一个月后的7月,其GitHub Star已飙升至107K,Fork数达到13,452。这不仅仅是一个数字的增长——它代表了一种开发范式的根本转变。
在AI Agent爆发的元年,Supabase敏锐地捕捉到了两个关键趋势:
- AI Agent需要"有状态的后端":不同于传统的无状态API调用,AI Agent需要实时数据同步、向量存储、行级安全策略来管理多租户访问,以及Edge Functions来执行服务器端逻辑
- 开发者需要"零配置全栈":独立开发者和小团队不想在数据库、认证、存储、实时通信、函数计算之间来回切换——他们需要一个统一的平台
Supabase的核心哲学可以用一句话概括:用Postgres作为一切的基石。数据库是Postgres,认证通过RLS(行级安全策略)与数据库深度集成,实时通信基于Postgres的WAL(Write-Ahead Log),Edge Functions直接操作数据库,甚至向量搜索也是Postgres的pgvector扩展。这种"一切围绕Postgres"的架构选择,让Supabase在2026年获得了独特的优势。
本文将从架构设计、核心组件、代码实战、性能优化四个维度,深度拆解Supabase的技术内幕,帮助你理解为什么它正在从"Firebase的开源替代品"演变为"AI时代最重要的后端基础设施之一"。
一、架构总览:Postgres作为一切的基石
1.1 整体架构图
Supabase的架构可以分为三层:
┌─────────────────────────────────────────────────────────┐
│ 客户端层 (Client) │
│ React/Next.js/Vue/Svelte/Flutter/iOS/Android/Python │
│ @supabase/supabase-js / @supabase/server │
└────────────────────────┬────────────────────────────────┘
│
┌────────────────────────▼────────────────────────────────┐
│ API网关层 (Gateway) │
│ PostgREST (REST API) + GraphQL (pg_graphql) │
│ Realtime Server (WebSocket) + Edge Functions (Deno) │
└────────────────────────┬────────────────────────────────┘
│
┌────────────────────────▼────────────────────────────────┐
│ 数据层 (Database) │
│ PostgreSQL 15+ (核心) │
│ ├── Auth (GoTrue) ──── RLS策略集成 │
│ ├── Storage ────────── 文件元数据存储 │
│ ├── Realtime ───────── 基于WAL的CDC │
│ ├── pgvector ───────── 向量搜索 │
│ ├── pg_cron ────────── 定时任务 │
│ ├── pg_graphql ─────── GraphQL接口 │
│ └── 50+扩展 ────────── 全部基于Postgres │
└─────────────────────────────────────────────────────────┘
1.2 与Firebase的架构对比
| 维度 | Firebase | Supabase |
|---|---|---|
| 数据库 | Firestore (NoSQL文档型) | PostgreSQL (关系型) |
| 查询能力 | 受限的查询语法 | SQL全能力 |
| 实时同步 | Firestore内置 | 基于WAL的Realtime |
| 认证 | Firebase Auth | GoTrue + RLS深度集成 |
| 存储 | Firebase Storage | Supabase Storage (S3兼容) |
| 函数计算 | Cloud Functions | Edge Functions (Deno) |
| 数据迁移 | 锁定在Google Cloud | 可导出标准Postgres |
| 开源 | 部分开源 | 完全开源 |
| 自托管 | 不支持 | 完全支持 |
| 供应商锁定 | 严重 | 无(标准Postgres) |
Firebase的核心问题在于:它是Google的封闭生态系统。你的数据存储在Firestore中,无法直接用SQL查询,无法导出为标准格式,无法自托管。而Supabase的每一行数据都是标准的Postgres行,你可以随时用任何Postgres客户端连接、查询、导出。
二、核心组件深度分析
2.1 PostgREST:零代码REST API
Supabase最令人惊叹的特性之一是PostgREST——它能自动将Postgres数据库表暴露为RESTful API,无需编写任何后端代码。
-- 创建一个待办事项表
CREATE TABLE todos (
id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
title TEXT NOT NULL,
completed BOOLEAN DEFAULT FALSE,
user_id UUID REFERENCES auth.users(id) ON DELETE CASCADE,
created_at TIMESTAMPTZ DEFAULT NOW()
);
-- 启用行级安全策略
ALTER TABLE todos ENABLE ROW LEVEL SECURITY;
-- 用户只能读取自己的待办事项
CREATE POLICY "Users can read own todos" ON todos
FOR SELECT USING (auth.uid() = user_id);
-- 用户只能插入自己的待办事项
CREATE POLICY "Users can insert own todos" ON todos
FOR INSERT WITH CHECK (auth.uid() = user_id);
-- 用户只能更新自己的待办事项
CREATE POLICY "Users can update own todos" ON todos
FOR UPDATE USING (auth.uid() = user_id);
-- 用户只能删除自己的待办事项
CREATE POLICY "Users can delete own todos" ON todos
FOR DELETE USING (auth.uid() = user_id);
仅需这20行SQL,你就拥有了:
- 完整的CRUD REST API(
GET /rest/v1/todos) - 基于JWT的行级安全策略
- 自动的类型定义(通过PostgREST的OpenAPI规范)
- 实时订阅支持
前端代码:
import { createClient } from '@supabase/supabase-js'
const supabase = createClient(
'https://your-project.supabase.co',
'your-anon-key'
)
// 查询所有待办事项(自动应用RLS策略)
const { data: todos, error } = await supabase
.from('todos')
.select('*')
.order('created_at', { ascending: false })
// 插入新的待办事项
const { data: newTodo, error: insertError } = await supabase
.from('todos')
.insert({ title: '学习Supabase', user_id: user.id })
.select()
.single()
// 实时订阅变化
const channel = supabase
.channel('todos-changes')
.on('postgres_changes', {
event: '*',
schema: 'public',
table: 'todos',
filter: `user_id=eq.${user.id}`
}, (payload) => {
console.log('数据变化:', payload)
})
.subscribe()
性能亮点:PostgREST直接在数据库层面执行查询,没有中间ORM层。根据官方基准测试,单节点可处理超过10,000请求/秒,P99延迟低于50ms。
2.2 @supabase/server:2026年最值得关注的新包
2026年5月,Supabase发布了@supabase/server包(目前为Public Beta),这是其最重要的架构演进之一。
问题背景:Supabase团队分析了25,000个已部署的Edge Functions,发现了一个普遍模式——开发者在每个函数中都在重复编写相同的样板代码:
// 之前的样板代码(每个函数都要写)
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) => {
// 1. 创建Supabase客户端
const supabaseUrl = Deno.env.get('SUPABASE_URL')
const supabaseKey = Deno.env.get('SUPABASE_ANON_KEY')
const supabase = createClient(supabaseUrl, supabaseKey)
// 2. 创建Admin客户端
const serviceRoleKey = Deno.env.get('SUPABASE_SERVICE_ROLE_KEY')
const supabaseAdmin = createClient(supabaseUrl, serviceRoleKey)
// 3. 验证JWT
const authHeader = req.headers.get('Authorization')
const token = authHeader?.replace('Bearer ', '')
const { data: { user }, error: authError } = await supabase.auth.getUser(token)
if (authError) {
return new Response(JSON.stringify({ error: 'Unauthorized' }), {
status: 401,
headers: { 'Content-Type': 'application/json' }
})
}
// 4. 处理CORS
const corsHeaders = {
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Headers': 'authorization, x-client-info, apikey, content-type',
}
// 5. 业务逻辑...(这才是开发者真正想写的)
const { data, error } = await supabase.from('todos').select('*')
return new Response(JSON.stringify(data), {
headers: { ...corsHeaders, 'Content-Type': 'application/json' }
})
})
使用@supabase/server后:
import { withSupabase } from 'npm:@supabase/server'
export default {
fetch: withSupabase({ auth: 'user' }, async (req, ctx) => {
// 直接使用ctx.supabase(用户作用域,自动RLS)
const { data } = await ctx.supabase.from('todos').select()
return Response.json(data)
})
}
从50行样板代码缩减到5行。核心改进:
- 声明式访问控制:
auth: 'user'/auth: 'none'/auth: 'secret'——一行声明安全模型 - 自动JWT验证:不需要
jose库、不需要JWKS配置 - 预配置的Supabase客户端:
ctx.supabase(用户作用域)和ctx.supabaseAdmin(管理员) - 跨运行时兼容:Edge Functions、Vercel Functions、Cloudflare Workers、Hono、Bun——同一份代码
// Hono集成示例
import { Hono } from 'hono'
import { withSupabase } from '@supabase/server'
const app = new Hono()
app.use('/*', withSupabase({ auth: 'user' }))
app.get('/todos', async (c) => {
const ctx = c.get('supabaseContext')
const { data } = await ctx.supabase.from('todos').select()
return c.json(data)
})
export default app
2.3 Realtime:基于WAL的实时数据同步
Supabase的Realtime服务基于Postgres的WAL(Write-Ahead Log),实现了数据库级别的变更捕获(CDC)。
// 监听整个表的变化
const channel = supabase
.channel('all-changes')
.on('postgres_changes', {
event: '*', // INSERT, UPDATE, DELETE
schema: 'public',
table: 'orders'
}, (payload) => {
console.log('订单变化:', payload.eventType, payload.new)
})
.subscribe()
// 带过滤器的监听
const channel = supabase
.channel('high-value-orders')
.on('postgres_changes', {
event: 'INSERT',
schema: 'public',
table: 'orders',
filter: 'amount=gte.1000' // 只监听金额>=1000的订单
}, (payload) => {
alertTeam(payload.new) // 通知团队
})
.subscribe()
// Broadcast:同一频道的客户端间通信
const channel = supabase.channel('room-1')
channel.on('broadcast', { event: 'cursor-move' }, (payload) => {
updateCursorPosition(payload)
})
channel.track({
user_id: userId,
cursor: { x: 0, y: 0 }
})
// Presence:在线状态管理
const presenceChannel = supabase.channel('online-users')
presenceChannel.on('presence', { event: 'sync' }, () => {
const state = presenceChannel.presenceState()
updateOnlineUsers(state)
})
presenceChannel.track({
user_id: userId,
online_at: new Date().toISOString()
})
性能数据:根据Supabase官方基准,Realtime服务器在单节点上可以处理超过10,000个并发WebSocket连接,消息延迟低于100ms。
2.4 Edge Functions:Deno驱动的边缘计算
Supabase的Edge Functions基于Deno Runtime,部署在全球边缘节点,执行延迟最低。
// supabase/functions/process-payment/index.ts
import { withSupabase } from 'npm:@supabase/server'
interface PaymentRequest {
amount: number
currency: string
token: string
}
export default {
fetch: withSupabase({ auth: 'user' }, async (req, ctx) => {
const { amount, currency, token }: PaymentRequest = await req.json()
// 1. 验证用户余额(使用RLS自动过滤)
const { data: wallet } = await ctx.supabase
.from('wallets')
.select('balance')
.single()
if (wallet.balance < amount) {
return Response.json({ error: 'Insufficient balance' }, { status: 400 })
}
// 2. 处理支付(调用外部API)
const paymentResult = await fetch('https://api.stripe.com/v1/charges', {
method: 'POST',
headers: {
'Authorization': `Bearer ${Deno.env.get('STRIPE_SECRET_KEY')}`,
'Content-Type': 'application/x-www-form-urlencoded'
},
body: new URLSearchParams({
amount: String(amount * 100),
currency,
source: token
})
})
// 3. 使用Admin客户端更新余额(绕过RLS)
const { error: updateError } = await ctx.supabaseAdmin
.from('wallets')
.update({ balance: wallet.balance - amount })
.eq('user_id', ctx.userClaims.sub)
// 4. 记录交易日志
await ctx.supabase.from('transactions').insert({
user_id: ctx.userClaims.sub,
amount,
currency,
status: paymentResult.ok ? 'completed' : 'failed',
created_at: new Date().toISOString()
})
return Response.json({
success: paymentResult.ok,
transaction_id: crypto.randomUUID()
})
})
}
部署命令:
# 部署单个函数
supabase functions deploy process-payment
# 设置环境变量
supabase secrets set STRIPE_SECRET_KEY=sk_live_xxx
# 本地开发
supabase functions serve process-payment
2.5 Vector:AI原生的向量搜索
Supabase集成了pgvector扩展,让Postgres原生支持向量存储和相似性搜索——这是AI应用的核心需求。
-- 启用pgvector扩展
CREATE EXTENSION IF NOT EXISTS vector;
-- 创建文档嵌入表
CREATE TABLE documents (
id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
content TEXT NOT NULL,
embedding VECTOR(1536), -- OpenAI embedding维度
metadata JSONB,
created_at TIMESTAMPTZ DEFAULT NOW()
);
-- 创建HNSW索引(加速向量搜索)
CREATE INDEX ON documents USING hnsw (embedding vector_cosine_ops);
-- 启用RLS
ALTER TABLE documents ENABLE ROW LEVEL SECURITY;
-- 用户只能访问自己的文档
CREATE POLICY "Users can access own documents" ON documents
FOR ALL USING (auth.uid() = (metadata->>'user_id')::uuid);
import { createClient } from '@supabase/supabase-js'
import OpenAI from 'openai'
const openai = new OpenAI()
const supabase = createClient(SUPABASE_URL, SUPABASE_KEY)
// 1. 生成文档嵌入
async function embedDocument(content: string, userId: string) {
const response = await openai.embeddings.create({
model: 'text-embedding-3-small',
input: content
})
const embedding = response.data[0].embedding
const { data, error } = await supabase
.from('documents')
.insert({
content,
embedding,
metadata: { user_id: userId }
})
.select()
.single()
return data
}
// 2. 语义搜索
async function searchDocuments(query: string, userId: string, matchCount = 5) {
// 生成查询嵌入
const response = await openai.embeddings.create({
model: 'text-embedding-3-small',
input: query
})
const queryEmbedding = response.data[0].embedding
// 使用PostgreSQL函数进行向量搜索
const { data, error } = await supabase.rpc('match_documents', {
query_embedding: queryEmbedding,
match_count: matchCount,
user_id: userId // RLS自动过滤
})
return data
}
// 3. 创建PostgreSQL搜索函数
/*
CREATE OR REPLACE FUNCTION match_documents(
query_embedding VECTOR(1536),
match_count INT DEFAULT 5,
user_id UUID DEFAULT NULL
)
RETURNS TABLE (
id UUID,
content TEXT,
similarity FLOAT,
metadata JSONB
)
LANGUAGE plpgsql
AS $$
BEGIN
RETURN QUERY
SELECT
d.id,
d.content,
1 - (d.embedding <=> query_embedding) AS similarity,
d.metadata
FROM documents d
WHERE (user_id IS NULL OR d.metadata->>'user_id' = user_id::text)
ORDER BY d.embedding <=> query_embedding
LIMIT match_count;
END;
$$;
*/
性能对比:pgvector在100万条1536维向量上的HNSW索引搜索延迟约5ms,召回率@10达到0.95+。对于大多数AI应用,这已经足够。
2.6 Auth:与RLS深度集成的认证系统
Supabase Auth(基于GoTrue)与Postgres RLS的深度集成是其最大差异化优势:
-- 1. 创建多租户SaaS的认证策略
CREATE TABLE organizations (
id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
name TEXT NOT NULL,
plan TEXT DEFAULT 'free'
);
CREATE TABLE org_members (
org_id UUID REFERENCES organizations(id) ON DELETE CASCADE,
user_id UUID REFERENCES auth.users(id) ON DELETE CASCADE,
role TEXT DEFAULT 'member',
PRIMARY KEY (org_id, user_id)
);
CREATE TABLE projects (
id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
org_id UUID REFERENCES organizations(id) ON DELETE CASCADE,
name TEXT NOT NULL,
created_at TIMESTAMPTZ DEFAULT NOW()
);
-- 2. RLS策略:用户只能访问其组织的项目
ALTER TABLE projects ENABLE ROW LEVEL SECURITY;
CREATE POLICY "Org members can view projects" ON projects
FOR SELECT USING (
EXISTS (
SELECT 1 FROM org_members
WHERE org_members.org_id = projects.org_id
AND org_members.user_id = auth.uid()
)
);
CREATE POLICY "Org admins can create projects" ON projects
FOR INSERT WITH CHECK (
EXISTS (
SELECT 1 FROM org_members
WHERE org_members.org_id = org_id
AND org_members.user_id = auth.uid()
AND org_members.role = 'admin'
)
);
// 2026年新增:Sign in with ChatGPT(公测中)
const { data, error } = await supabase.auth.signInWithOAuth({
provider: 'chatgpt',
options: {
redirectTo: 'https://your-app.com/callback'
}
})
// 2026年新增:自定义OIDC提供商
const { data, error } = await supabase.auth.signInWithOAuth({
provider: 'oidc',
options: {
redirectTo: 'https://your-app.com/callback',
oidcConfig: {
issuer: 'https://your-identity-provider.com',
clientId: 'your-client-id',
clientSecret: 'your-client-secret'
}
}
})
三、AI Agent原生基础设施:Supabase的新定位
3.1 为什么AI Agent需要Supabase?
2026年是AI Agent的爆发元年。一个典型的AI Agent架构需要:
- 长期记忆存储:向量数据库存储对话历史、用户偏好、任务状态
- 实时状态同步:多个Agent之间、Agent与用户之间的实时通信
- 多租户安全:不同用户的Agent数据严格隔离
- 边缘执行:Agent的工具调用需要低延迟执行
- 定时任务:Agent的后台任务、定时检查
Supabase完美覆盖了所有需求:
┌─────────────────────────────────────────────┐
│ AI Agent 架构 │
├─────────────────────────────────────────────┤
│ 用户界面 (React/Next.js) │
│ │ │
│ ▼ │
│ Edge Functions (Agent逻辑) │
│ ├── @supabase/server (认证+客户端) │
│ ├── Agent Loop (推理+决策) │
│ └── Tool Execution (工具调用) │
│ │ │
│ ▼ │
│ Supabase (数据层) │
│ ├── pgvector (向量记忆) │
│ ├── Realtime (实时状态) │
│ ├── RLS (多租户安全) │
│ ├── pg_cron (定时任务) │
│ └── Storage (文件存储) │
└─────────────────────────────────────────────┘
3.2 实战:构建一个带记忆的AI Agent
// supabase/functions/ai-agent/index.ts
import { withSupabase } from 'npm:@supabase/server'
import OpenAI from 'openai'
const openai = new OpenAI()
interface AgentMessage {
role: 'user' | 'assistant'
content: string
timestamp: string
}
export default {
fetch: withSupabase({ auth: 'user' }, async (req, ctx) => {
const { message, conversation_id } = await req.json()
const userId = ctx.userClaims.sub
// 1. 从pgvector检索相关记忆
const queryEmbedding = await getEmbedding(message)
const { data: memories } = await ctx.supabase.rpc('match_memories', {
query_embedding: queryEmbedding,
user_id: userId,
match_count: 5,
match_threshold: 0.7
})
// 2. 从数据库加载对话历史
const { data: history } = await ctx.supabase
.from('conversations')
.select('messages')
.eq('id', conversation_id)
.single()
// 3. 构建Prompt
const systemPrompt = `你是一个有帮助的AI助手。
用户的相关记忆:
${memories?.map(m => `- ${m.content} (相关度: ${m.similarity.toFixed(2)})`).join('\n') || '暂无相关记忆'}`
const messages = [
{ role: 'system', content: systemPrompt },
...(history?.messages || []),
{ role: 'user', content: message }
]
// 4. 调用LLM
const completion = await openai.chat.completions.create({
model: 'gpt-4o',
messages,
tools: [
{
type: 'function',
function: {
name: 'search_knowledge',
description: '搜索知识库中的信息',
parameters: {
type: 'object',
properties: {
query: { type: 'string', description: '搜索关键词' }
},
required: ['query']
}
}
}
]
})
const assistantMessage = completion.choices[0].message
// 5. 保存新记忆到pgvector
const assistantEmbedding = await getEmbedding(assistantMessage.content)
await ctx.supabase.from('memories').insert({
content: assistantMessage.content,
embedding: assistantEmbedding,
metadata: {
user_id: userId,
conversation_id,
role: 'assistant'
}
})
// 6. 更新对话历史
const newMessages = [
...(history?.messages || []),
{ role: 'user', content: message, timestamp: new Date().toISOString() },
{ role: 'assistant', content: assistantMessage.content, timestamp: new Date().toISOString() }
]
await ctx.supabase
.from('conversations')
.upsert({
id: conversation_id,
user_id: userId,
messages: newMessages,
updated_at: new Date().toISOString()
})
// 7. 通过Realtime广播新消息
await ctx.supabase.channel(`conversation:${conversation_id}`)
.send({
type: 'broadcast',
event: 'new-message',
payload: {
role: 'assistant',
content: assistantMessage.content
}
})
return Response.json({
message: assistantMessage.content,
memories_used: memories?.length || 0
})
})
}
async function getEmbedding(text: string): Promise<number[]> {
const response = await openai.embeddings.create({
model: 'text-embedding-3-small',
input: text
})
return response.data[0].embedding
}
四、性能优化实战
4.1 查询优化
-- 1. 为常用查询创建索引
CREATE INDEX idx_todos_user_created ON todos(user_id, created_at DESC);
-- 2. 使用数据库函数替代多次查询
CREATE OR REPLACE FUNCTION get_user_dashboard(user UUID)
RETURNS JSON AS $$
SELECT json_build_object(
'total_todos', (SELECT COUNT(*) FROM todos WHERE user_id = $1),
'completed_todos', (SELECT COUNT(*) FROM todos WHERE user_id = $1 AND completed = true),
'recent_todos', (
SELECT json_agg(row_to_json(t))
FROM (SELECT id, title, completed, created_at
FROM todos WHERE user_id = $1
ORDER BY created_at DESC LIMIT 5) t
)
)
$$ LANGUAGE sql;
-- 3. 使用物化视图缓存复杂查询
CREATE MATERIALIZED VIEW user_stats AS
SELECT
user_id,
COUNT(*) as total_todos,
COUNT(*) FILTER (WHERE completed) as completed_todos,
AVG(EXTRACT(EPOCH FROM (completed_at - created_at))) as avg_completion_time
FROM todos
GROUP BY user_id;
-- 定时刷新物化视图
SELECT cron.schedule('refresh-user-stats', '*/5 * * * *', 'REFRESH MATERIALIZED VIEW CONCURRENTLY user_stats');
4.2 Edge Functions优化
// 1. 连接池复用
import { createClient } from 'npm:@supabase/supabase-js'
// 在函数外部创建客户端(跨请求复用)
const supabase = createClient(
Deno.env.get('SUPABASE_URL'),
Deno.env.get('SUPABASE_SERVICE_ROLE_KEY')
)
// 2. 批量操作替代循环
// ❌ 错误:循环插入
for (const item of items) {
await supabase.from('logs').insert(item)
}
// ✅ 正确:批量插入
await supabase.from('logs').insert(items)
// 3. 使用RPC替代复杂查询
// ❌ 错误:前端多次查询
const { data: todos } = await supabase.from('todos').select('*')
const { data: user } = await supabase.from('users').select('*').eq('id', todos[0].user_id)
// ✅ 正确:后端函数一次查询
const { data } = await supabase.rpc('get_todos_with_users')
4.3 Realtime优化
// 1. 精确过滤,减少带宽
channel.on('postgres_changes', {
event: 'UPDATE',
schema: 'public',
table: 'orders',
filter: `status=eq.pending AND region=eq.us-east` // 精确过滤
})
// 2. 使用Broadcast替代数据库轮询
// 对于高频低延迟的场景(如光标位置、游戏状态)
channel.send({
type: 'broadcast',
event: 'cursor-move',
payload: { x, y }
})
// 3. 批量更新合并
// ❌ 错误:每个更新都触发Realtime
for (const item of items) {
await supabase.from('metrics').update({ value: item.value }).eq('id', item.id)
}
// ✅ 正确:批量更新
await supabase.from('metrics').upsert(items)
五、自托管部署:Supabase的开源承诺
Supabase完全开源,支持自托管部署:
# 克隆仓库
git clone --depth 1 https://github.com/supabase/supabase
# 进入docker目录
cd supabase/docker
# 复制环境变量模板
cp .env.example .env
# 启动所有服务
docker compose up -d
# 查看状态
docker compose ps
自托管架构包含以下服务:
| 服务 | 端口 | 功能 |
|---|---|---|
| Kong | 8000 | API网关 |
| GoTrue | 9999 | 认证服务 |
| PostgREST | 3000 | REST API |
| Realtime | 4000 | WebSocket服务 |
| Storage | 5000 | 文件存储 |
| Edge Functions | 9000 | Deno函数运行时 |
| Studio | 3000 | 管理面板 |
| PostgreSQL | 5432 | 数据库 |
适合场景:
- 企业内部部署(数据合规要求)
- 本地开发测试
- 离线环境
- 完全控制数据主权
六、与其他平台的对比选型
6.1 Supabase vs Firebase vs Appwrite vs PocketBase
| 特性 | Supabase | Firebase | Appwrite | PocketBase |
|---|---|---|---|---|
| 数据库 | PostgreSQL | Firestore | MariaDB | SQLite |
| 开源 | ✅ 完全 | ❌ 部分 | ✅ 完全 | ✅ 完全 |
| 自托管 | ✅ Docker | ❌ | ✅ Docker | ✅ 单二进制 |
| 实时同步 | ✅ WAL | ✅ 内置 | ✅ 内置 | ✅ 内置 |
| 向量搜索 | ✅ pgvector | ❌ | ❌ | ❌ |
| Edge Functions | ✅ Deno | ✅ Node.js | ✅ Dart | ❌ |
| RLS | ✅ 原生 | ❌ | ❌ | ❌ |
| GraphQL | ✅ pg_graphql | ❌ | ❌ | ❌ |
| 适合规模 | 中大型 | 任意 | 小中型 | 小型 |
| AI Agent适配 | ⭐⭐⭐ | ⭐⭐ | ⭐ | ⭐ |
6.2 选型建议
- 选Supabase:需要关系型数据库、RLS、向量搜索、AI应用、不想被供应商锁定
- 选Firebase:需要Google生态集成、简单的NoSQL数据模型、全球CDN
- 选Appwrite:需要完全自主可控、轻量级后端、Dart生态
- 选PocketBase:需要极致轻量、单文件部署、SQLite够用的场景
七、总结与展望
Supabase的技术哲学
Supabase的成功验证了一个重要的技术哲学:不要重新发明轮子。
- 不自研数据库 → 用Postgres
- 不自研认证 → 用GoTrue + RLS
- 不自研实时通信 → 用WAL
- 不自研向量搜索 → 用pgvector
- 不自研函数计算 → 用Deno
在Postgres这个"世界上最好的数据库"之上,Supabase构建了一个完整的开发平台。这种"站在巨人肩膀上"的策略,让它在2026年成为了AI Agent时代最重要的后端基础设施之一。
2026年的关键趋势
- AI Agent原生化:Supabase正在从"通用后端"演变为"AI Agent基础设施",pgvector + Realtime + Edge Functions的组合为Agent提供了完美的运行环境
- @supabase/server标准化:统一了边缘函数的认证和客户端管理,大幅降低了开发门槛
- Multigres生态:Supabase推出的Multigres(Postgres操作系统)正在构建一个更大的Postgres生态系统
- 安全合规:ISO 27001认证、SOC2 Type 2、HIPAA——企业级安全已就绪
个人建议
如果你是独立开发者或小团队,正在构建AI应用,Supabase几乎是2026年的最优选择:
- 10分钟搭建完整后端
- 无需管理服务器
- 标准Postgres,无供应商锁定
- 开源可自托管
- AI原生的向量搜索
- 实时同步内置
- 行级安全策略开箱即用
从一个简单的Firebase替代品,到107K Star的完整Postgres开发平台,再到AI Agent的原生基础设施——Supabase正在重新定义"后端即服务"的边界。在AI Agent爆发的2026年,这个"Postgres全栈"平台值得每个开发者关注。
本文所有代码示例基于Supabase最新版本(2026年8月),部分功能可能需要调整参数。完整文档请参考:https://supabase.com/docs
GitHub仓库:https://github.com/supabase/supabase(107K+ Stars)