Supabase 自建:开源的 Firebase 替代品,带数据库的后端服务
Firebase 是 Google 的 BaaS(Backend as a Service),但数据在 Google 手里、免费额度有限、被 Google 服务锁定。Supabase 是完全开源的 Firebase 替代品:PostgreSQL 数据库、REST 和 GraphQL API、实时订阅、文件存储、用户认证,一站式解决后端需求。这篇文章讲如何自托管 Supabase。
Supabase 包含什么
- PostgreSQL:关系型数据库,比 Firebase 的 NoSQL 更强大
- PostgREST:自动把数据库表变成 REST API(增删改查无需写代码)
- GoTrue:用户认证服务(邮箱、GitHub、Google 等 OAuth)
- Realtime:实时数据订阅(WebSocket)
- Storage:文件存储(S3 兼容)
- Edge Functions:Deno 边缘函数(类似 Cloudflare Workers)
- Supabase Studio:Web 管理界面(类似 Airtable 的数据库 UI)
服务器配置
Supabase 组件较多,至少需要:
- 最低:4 核 8GB,50GB 硬盘
- 推荐:4 核 16GB,100GB 硬盘
我把 Supabase 部署在雨云服务器rainyun+com 的 4 核 16G 机型上,支撑几个小型项目没有问题。注册填优惠码 2026off 领 5 折优惠券,高内存机型价格实惠。
Docker Compose 部署
bash
git clone --depth 1 https://github.com/supabase/supabase ~/supabase
cd ~/supabase/docker
# 复制环境变量模板
cp .env.example .env
编辑 .env 关键配置:
env
############
# 必须修改的配置
############
# JWT Secret(用于生成 API 密钥,至少 32 字符)
JWT_SECRET=替换为随机字符串至少32位
ANON_KEY= # 用下面的命令生成
SERVICE_ROLE_KEY= # 用下面的命令生成
# 数据库密码
POSTGRES_PASSWORD=替换为强密码
# API 访问地址(你的服务器 URL)
API_EXTERNAL_URL=https://supabase.你的域名.com
SUPABASE_PUBLIC_URL=https://supabase.你的域名.com
STUDIO_DEFAULT_ORGANIZATION=我的组织
STUDIO_DEFAULT_PROJECT=my-project
# 邮件配置(用户注册验证)
SMTP_HOST=smtp.你的邮件服务商.com
SMTP_PORT=587
SMTP_USER=你的邮件账号
SMTP_PASS=你的邮件密码
SMTP_SENDER_NAME=Supabase
SMTP_ADMIN_EMAIL=admin@你的域名.com
生成 JWT 密钥:
bash
# 安装 jwt 工具
npm install -g jsonwebtoken
# 生成 ANON_KEY(匿名访问密钥)
node -e "
const jwt = require('jsonwebtoken');
const secret = '你的JWT_SECRET';
const anon = jwt.sign({role:'anon',iss:'supabase',iat:1668599400,exp:1825365800}, secret);
console.log('ANON_KEY:', anon);
const service = jwt.sign({role:'service_role',iss:'supabase',iat:1668599400,exp:1825365800}, secret);
console.log('SERVICE_ROLE_KEY:', service);
"
配置反向代理
yaml
# 在 docker/docker-compose.yml 里修改,或单独创建 Caddy 配置
# Caddyfile
supabase.你的域名.com {
# Studio 管理界面
handle /studio/* {
reverse_proxy studio:3000
}
# API
handle /rest/* {
reverse_proxy rest:3000
}
# Auth
handle /auth/* {
reverse_proxy auth:9999
}
# Storage
handle /storage/* {
reverse_proxy storage:5000
}
# 默认走 Kong 网关
handle {
reverse_proxy kong:8000
}
}
启动:
bash
docker compose up -d
# 查看状态(首次启动需要 2-3 分钟)
docker compose ps
访问 Studio
访问 https://supabase.你的域名.com,进入 Supabase Studio 管理界面:
- 左侧「Table Editor」:图形化管理数据库表
- 「SQL Editor」:直接写 SQL 查询
- 「Auth」:管理用户账号
- 「Storage」:管理文件
- 「API」:查看自动生成的 API 文档和密钥
在项目里接入
安装官方 SDK:
bash
npm install @supabase/supabase-js
javascript
import { createClient } from '@supabase/supabase-js'
const supabase = createClient(
'https://supabase.你的域名.com',
'你的ANON_KEY'
)
// 查询数据
const { data, error } = await supabase
.from('users')
.select('*')
.eq('status', 'active')
// 插入数据
const { data, error } = await supabase
.from('posts')
.insert([{ title: '标题', content: '内容', user_id: 1 }])
// 实时订阅
const channel = supabase
.channel('comments')
.on('postgres_changes', { event: 'INSERT', schema: 'public', table: 'comments' },
(payload) => console.log('新评论:', payload))
.subscribe()
// 用户认证
const { data, error } = await supabase.auth.signUp({
email: 'user@example.com',
password: 'password123'
})
行级安全策略(RLS)
Supabase 的核心安全机制是 PostgreSQL 的行级安全(Row Level Security),控制每个用户能看到哪些数据:
sql
-- 开启表的 RLS
ALTER TABLE posts ENABLE ROW LEVEL SECURITY;
-- 策略:用户只能看自己的帖子
CREATE POLICY "用户只能看自己的帖子"
ON posts FOR SELECT
USING (auth.uid() = user_id);
-- 策略:用户只能插入自己的帖子
CREATE POLICY "用户只能发自己的帖子"
ON posts FOR INSERT
WITH CHECK (auth.uid() = user_id);
备份
bash
cat > ~/supabase/backup.sh << 'EOF'
#!/bin/bash
DATE=$(date +%Y%m%d)
BACKUP_DIR=~/supabase-backups
mkdir -p "$BACKUP_DIR"
docker exec supabase-db pg_dumpall -U postgres | \
gzip > "$BACKUP_DIR/db-$DATE.sql.gz"
find "$BACKUP_DIR" -name "*.gz" -mtime +14 -delete
echo "[$(date)] 备份完成"
EOF
chmod +x ~/supabase/backup.sh
(crontab -l 2>/dev/null; echo "0 3 * * * ~/supabase/backup.sh") | crontab -
自建 Supabase 意味着你拥有一个完整的开源后端平台------数据完全自控、无额度限制、PostgreSQL 的强大查询能力。在雨云服务器rainyun+com 的 4 核 16G 机型上部署,支撑数个中小型应用的后端需求,注册填优惠码 2026off 领 5 折优惠券,彻底摆脱 Firebase 的价格和锁定问题。