Supabase 自建:开源的 Firebase 替代品,带数据库的后端服务

📅 2026/7/7 7:39:23 👁️ 阅读次数 📝 编程学习
Supabase 自建:开源的 Firebase 替代品,带数据库的后端服务

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 部署

gitclone--depth1https://github.com/supabase/supabase ~/supabasecd~/supabase/docker# 复制环境变量模板cp.env.example .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 密钥:

# 安装 jwt 工具npminstall-gjsonwebtoken# 生成 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); "

配置反向代理

# 在 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 } }

启动:

dockercompose up-d# 查看状态(首次启动需要 2-3 分钟)dockercomposeps

访问 Studio

访问https://supabase.你的域名.com,进入 Supabase Studio 管理界面:

  • 左侧「Table Editor」:图形化管理数据库表
  • 「SQL Editor」:直接写 SQL 查询
  • 「Auth」:管理用户账号
  • 「Storage」:管理文件
  • 「API」:查看自动生成的 API 文档和密钥

在项目里接入

安装官方 SDK:

npminstall@supabase/supabase-js
import{createClient}from'@supabase/supabase-js'constsupabase=createClient('https://supabase.你的域名.com','你的ANON_KEY')// 查询数据const{data,error}=awaitsupabase.from('users').select('*').eq('status','active')// 插入数据const{data,error}=awaitsupabase.from('posts').insert([{title:'标题',content:'内容',user_id:1}])// 实时订阅constchannel=supabase.channel('comments').on('postgres_changes',{event:'INSERT',schema:'public',table:'comments'},(payload)=>console.log('新评论:',payload)).subscribe()// 用户认证const{data,error}=awaitsupabase.auth.signUp({email:'user@example.com',password:'password123'})

行级安全策略(RLS)

Supabase 的核心安全机制是 PostgreSQL 的行级安全(Row Level Security),控制每个用户能看到哪些数据:

-- 开启表的 RLSALTERTABLEpostsENABLEROWLEVELSECURITY;-- 策略:用户只能看自己的帖子CREATEPOLICY"用户只能看自己的帖子"ONpostsFORSELECTUSING(auth.uid()=user_id);-- 策略:用户只能插入自己的帖子CREATEPOLICY"用户只能发自己的帖子"ONpostsFORINSERTWITHCHECK(auth.uid()=user_id);

备份

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)] 备份完成" EOFchmod+x ~/supabase/backup.sh(crontab-l2>/dev/null;echo"0 3 * * * ~/supabase/backup.sh")|crontab-

自建 Supabase 意味着你拥有一个完整的开源后端平台——数据完全自控、无额度限制、PostgreSQL 的强大查询能力。在雨云服务器rainyun+com的 4 核 16G 机型上部署,支撑数个中小型应用的后端需求,注册填优惠码2026off领 5 折优惠券,彻底摆脱 Firebase 的价格和锁定问题。