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

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 的价格和锁定问题。

相关推荐
2301_803934611 小时前
html标签怎样划分页面区域_section与div的区别【介绍】
jvm·数据库·python
stereohomology1 小时前
DeepSeek对我首个Github开源项目mcp的点评
开源·github·mcp
埃伊蟹黄面1 小时前
MySQL 库的操作
数据库·mysql
stereohomology1 小时前
Qwen36plus对我首个开源在Github的mcp的点评和建议
开源·github
埃伊蟹黄面1 小时前
数据库基础认识
数据库
看我干嘛!1 小时前
Redis安装
数据库·redis·缓存
2401_824697662 小时前
如何管理Oracle服务器的内核共享内存_shmmax与shmall计算
jvm·数据库·python
2301_783848652 小时前
mysql数据迁移过程如何降低性能影响_采用增量备份与多线程同步
jvm·数据库·python
【心态好不摆烂】2 小时前
MySQL——表的约束(上)
数据库·mysql