Supabase:开源Firebase替代完全指南:后端即服务的完整教程

Supabase:开源Firebase替代完全指南:后端即服务的完整教程

背景

在移动应用和 Web 应用开发中,构建完整的后端服务是一项复杂且耗时的任务。Firebase 作为 Google 提供的后端即服务(BaaS)平台,提供了数据库、认证、存储、推送等一站式服务,但其闭源特性和数据隐私顾虑让一些开发者望而却步。

Supabase 正是为解决这一需求而生的开源 Firebase 替代方案。它基于 PostgreSQL 数据库,提供了完整的后端服务,包括数据库、实时订阅、身份认证、文件存储、Edge Functions 等,同时支持完全私有化部署。

本文将提供一份保姆级教程,详细讲解 Supabase 的部署与配置,帮助开发者快速搭建完整的后端服务平台。

一、项目概述

1.1 Supabase 简介

Supabase 是开源的 Firebase 替代方案,GitHub Star 数超过 65K。它建立在 PostgreSQL 之上,提供了现代化、可扩展的后端服务。

Supabase 的核心特点:

  • 开源自由:基于 Apache 2.0 协议,完全开源
  • PostgreSQL 核心:强大的关系型数据库
  • 实时订阅:WebSocket 实时数据推送
  • 身份认证:完整的用户认证系统
  • 文件存储:大文件存储和管理
  • Edge Functions:边缘计算函数
  • API 自动生成:自动生成 RESTful 和 GraphQL API

1.2 核心功能

1.2.1 数据库

基于 PostgreSQL 的数据库服务:

  • PostgreSQL 完整功能:支持所有 PostgreSQL 特性
  • 表编辑器:可视化数据管理
  • SQL 编辑器:在线执行 SQL
  • 数据库分支:创建数据库副本进行测试
  • 自动备份:数据自动备份
1.2.2 实时订阅

强大的实时数据订阅:

  • WebSocket 订阅:监听数据变更
  • 过滤订阅:按条件订阅
  • 广播:向所有客户端广播消息
  • Presence:在线状态同步
1.2.3 身份认证

完整的用户认证系统:

  • 邮箱密码:传统的邮箱注册登录
  • 社交登录:Google、GitHub、微信等
  • Magic Link:无密码登录
  • JWT 管理:安全的 Token 管理
  • RLS 策略:行级安全策略
1.2.4 存储服务

文件存储和管理:

  • bucket 管理:创建存储桶
  • 文件上传:上传文件和图片
  • 图片转换:图片缩放、裁剪
  • 访问控制:基于策略的访问控制

1.3 技术架构

Supabase 采用现代化的技术栈:

  • 数据库:PostgreSQL 15+
  • 实时引擎:Go + WebSocket
  • 认证:Go + JWT
  • 存储:S3 兼容存储
  • Edge Functions:Deno 运行时
  • API 网关:PostgREST
  • 容器化:Docker Compose

二、Docker Compose 部署

2.1 环境准备

确保服务器已安装:

  • Docker 20.10+
  • Docker Compose 2.0+
  • 内存:最低 4GB,推荐 8GB+
  • 磁盘:至少 20GB

2.2 系统要求

Supabase 是一个完整的自托管方案,需要较多资源:

组件 最低内存 推荐内存
Kong 256MB 512MB
GoTrue 256MB 512MB
PostgREST 256MB 512MB
PostgreSQL 2GB 4GB
Redis 256MB 512MB
Storage 512MB 1GB
Total 4GB 8GB+

2.3 下载部署配置

bash 复制代码
# 下载 Supabase Docker 配置
git clone https://github.com/supabase/supabase
cd supabase/docker

# 复制环境变量模板
cp .env.example .env

2.4 配置环境变量

编辑 .env 文件,配置必要的参数:

env 复制代码
# 基础配置
POSTGRES_PASSWORD=your-super-secret-and-long-postgres-password
JWT_SECRET=your-super-secret-jwt-token-with-at-least-32-characters

# 域名配置
SITE_URL=http://your-domain.com
ADDITIONAL_REDIRECT_URLS=http://localhost:3000

# 功能开关
ENABLE_EMAIL_SIGNUP=true
ENABLE_ANON_KEY=true

2.5 配置 DNS

在 DNS 中添加以下记录:

记录类型 主机名 指向
A api.your-domain.com 服务器 IP
A your-domain.com 服务器 IP
CNAME supabase your-domain.com

2.6 启动服务

bash 复制代码
# 启动所有服务
docker compose up -d

# 查看服务状态
docker compose ps

# 查看特定服务日志
docker compose logs -f kong
docker compose logs -f postgres

2.7 访问服务

服务启动后,访问以下地址:

服务 地址
Studio http://your-domain.com
API http://api.your-domain.com
Health http://your-domain.com/health

2.8 Nginx 反向代理配置

如果需要更复杂的配置,可以添加 Nginx 反向代理:

bash 复制代码
cat > /etc/nginx/sites-available/supabase << 'EOF'
server {
    listen 80;
    server_name your-domain.com api.your-domain.com;

    client_max_body_size 500M;

    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }

    location /rest/ {
        proxy_pass http://127.0.0.1:3000;
        proxy_set_header Host $host;
    }

    location /auth/ {
        proxy_pass http://127.0.0.1:3000;
        proxy_set_header Host $host;
    }

    location /storage/ {
        proxy_pass http://127.0.0.1:3000;
        proxy_set_header Host $host;
    }
}
EOF

三、数据库使用

3.1 Supabase Studio

Supabase Studio 提供可视化的数据库管理界面:

  1. 访问 http://your-domain.com
  2. 登录使用配置的邮箱密码
  3. 进入数据库管理

3.2 创建表

3.2.1 使用 Table Editor
  1. 点击"New Table"
  2. 填写表名和列信息
  3. 设置主键和默认值
  4. 点击"Save"
3.2.2 使用 SQL Editor
sql 复制代码
-- 创建用户表
CREATE TABLE profiles (
    id UUID REFERENCES auth.users PRIMARY KEY,
    email TEXT,
    display_name TEXT,
    avatar_url TEXT,
    created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
    updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);

-- 启用行级安全
ALTER TABLE profiles ENABLE ROW LEVEL SECURITY;

-- 创建默认 RLS 策略
CREATE POLICY "Users can view own profile"
    ON profiles FOR SELECT
    USING (auth.uid() = id);

CREATE POLICY "Users can update own profile"
    ON profiles FOR UPDATE
    USING (auth.uid() = id);

3.3 行级安全(RLS)

RLS 是 Supabase 安全的核心:

sql 复制代码
-- 创建 RLS 策略
CREATE POLICY "Enable read for authenticated users"
    ON posts FOR SELECT
    TO authenticated
    USING (true);

CREATE POLICY "Enable insert for authenticated users"
    ON posts FOR INSERT
    TO authenticated
    WITH CHECK (auth.uid() = author_id);

CREATE POLICY "Enable update for post authors"
    ON posts FOR UPDATE
    TO authenticated
    USING (auth.uid() = author_id);

四、客户端集成

4.1 JavaScript/TypeScript SDK

4.1.1 安装
bash 复制代码
npm install @supabase/supabase-js
4.1.2 初始化
javascript 复制代码
import { createClient } from '@supabase/supabase-js'

const supabaseUrl = 'https://your-project.supabase.co'
const supabaseKey = 'your-anon-key'

const supabase = createClient(supabaseUrl, supabaseKey)
4.1.3 数据操作
javascript 复制代码
// 获取数据
const { data: posts, error } = await supabase
    .from('posts')
    .select('*')

// 插入数据
const { data, error } = await supabase
    .from('posts')
    .insert([
        { title: 'Hello', content: 'World', author_id: user.id }
    ])

// 更新数据
const { data, error } = await supabase
    .from('posts')
    .update({ title: 'Updated' })
    .eq('id', postId)

// 删除数据
const { error } = await supabase
    .from('posts')
    .delete()
    .eq('id', postId)

4.2 Flutter SDK

4.2.1 安装
bash 复制代码
flutter pub add supabase_flutter
4.2.2 初始化
dart 复制代码
import 'package:supabase_flutter/supabase_flutter.dart';

void main() async {
    await Supabase.initialize(
        url: 'https://xxx.supabase.co',
        anonKey: 'your-anon-key',
    );
    runApp(MyApp());
}
4.2.3 使用
dart 复制代码
// 获取数据
final posts = await Supabase.instance.client
    .from('posts')
    .select();

// 插入数据
await Supabase.instance.client
    .from('posts')
    .insert({'title': 'Hello'});

4.3 Swift/iOS SDK

swift 复制代码
import Supabase

// 初始化
try await Supabase.initialize(
    url: URL(string: "https://xxx.supabase.co")!,
    anonKey: "your-anon-key"
)

// 查询数据
let posts = try await Supabase.instance.client
    .from("posts")
    .select()
    .execute()

五、实时订阅

5.1 开启实时订阅

在数据库中启用逻辑复制:

sql 复制代码
-- 启用 REPLICA IDENTITY
ALTER TABLE posts REPLICA IDENTITY DEFAULT;

-- 开启表级别的实时
ALTER PUBLICATION supabase_realtime ADD TABLE posts;

5.2 客户端订阅

javascript 复制代码
// 订阅所有变更
const subscription = supabase
    .channel('posts')
    .on('postgres_changes', { event: '*', schema: 'public', table: 'posts' }, 
        (payload) => {
            console.log('Change received!', payload)
        })
    .subscribe()

// 订阅插入事件
const insertSubscription = supabase
    .channel('new-posts')
    .on('postgres_changes', 
        { event: 'INSERT', schema: 'public', table: 'posts' },
        (payload) => {
            console.log('New post added!', payload.new)
        })
    .subscribe()

5.3 Presence(在线状态)

javascript 复制代码
// 同步在线状态
const channel = supabase.channel('room-1')

channel.on('presence', { event: 'sync' }, () => {
    const state = channel.presenceState()
    console.log('Online users:', state)
})

// 加入 Presence
channel.track({
    user_id: '1',
    user_name: 'John'
})

// 离开
channel.untrack()

六、身份认证

6.1 邮箱密码认证

javascript 复制代码
// 注册
const { data, error } = await supabase.auth.signUp({
    email: 'user@example.com',
    password: 'password123'
})

// 登录
const { data, error } = await supabase.auth.signInWithPassword({
    email: 'user@example.com',
    password: 'password123'
})

// 登出
const { error } = await supabase.auth.signOut()

// 获取当前用户
const { data: { user } } = supabase.auth.getUser()

6.2 Magic Link(无密码登录)

javascript 复制代码
const { error } = await supabase.auth.signInWithOtp({
    email: 'user@example.com',
    options: {
        emailRedirectTo: 'https://your-app.com/callback'
    }
})

6.3 社交登录

6.3.1 配置 Provider

在 Supabase 后台配置 OAuth Provider:

  1. 访问 Authentication → Providers
  2. 启用需要的 Provider
  3. 配置 Client ID 和 Secret
6.3.2 使用社交登录
javascript 复制代码
const { data, error } = await supabase.auth.signInWithOAuth({
    provider: 'github',
    options: {
        redirectTo: 'https://your-app.com/callback'
    }
})

七、存储服务

7.1 创建 Bucket

7.1.1 使用 Studio
  1. 访问 Storage
  2. 点击"New Bucket"
  3. 输入名称和权限设置
7.1.2 使用 SQL
sql 复制代码
INSERT INTO storage.buckets (id, name, public)
VALUES ('avatars', 'avatars', true);

7.2 上传文件

javascript 复制代码
const { data, error } = await supabase.storage
    .from('avatars')
    .upload('public/avatar1.jpg', file)

7.3 下载文件

javascript 复制代码
const { data, error } = await supabase.storage
    .from('avatars')
    .download('public/avatar1.jpg')

7.4 获取公开 URL

javascript 复制代码
const { data } = supabase.storage
    .from('avatars')
    .getPublicUrl('public/avatar1.jpg')

八、Edge Functions

8.1 创建 Function

bash 复制代码
# 创建 Function
mkdir -p ./functions/hello-world
cd ./functions/hello-world

# 创建 index.ts
cat > index.ts << 'EOF'
Deno.serve(async (req) => {
    const { name } = await req.json()
    return new Response(
        JSON.stringify({ message: `Hello ${name || 'World'}!` }),
        { headers: { 'Content-Type': 'application/json' } }
    )
})
EOF

8.2 部署 Function

bash 复制代码
supabase functions deploy hello-world

8.3 调用 Function

bash 复制代码
curl -X POST https://your-project.supabase.co/functions/v1/hello-world \
  -H "Authorization: Bearer ANON_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Supabase"}'

九、常见问题

9.1 部署问题

Q:服务启动失败

A:检查资源是否足够(内存至少 4GB):

bash 复制代码
docker compose logs

Q:Kong 网关 502 错误

A:检查各个服务启动状态:

bash 复制代码
docker compose ps

9.2 使用问题

Q:RLS 策略不生效

A:检查是否在表上启用了 RLS:

sql 复制代码
SELECT tablename, rowsecurity
FROM pg_tables
WHERE schemaname = 'public';

Q:实时订阅不工作

A:确保表已添加到实时出版物:

sql 复制代码
ALTER PUBLICATION supabase_realtime ADD TABLE your_table;

十、总结

Supabase 作为开源的 Firebase 替代方案,以其 PostgreSQL 核心、实时订阅、完整的认证系统等强大功能,为开发者提供了一个完整的应用后端解决方案。

通过本文的保姆级教程,读者应该已经掌握了:

  1. Docker 部署:使用 Docker Compose 部署完整的 Supabase
  2. 数据库使用:创建表、配置 RLS
  3. 客户端集成:JavaScript、Flutter 等 SDK
  4. 实时订阅:WebSocket 数据订阅
  5. 身份认证:邮箱登录、社交登录
  6. 存储服务:文件上传和下载
  7. Edge Functions:边缘计算函数

对于需要构建现代应用的开发者,Supabase 是一个值得信赖的开源选择。


本文由无边界科技技术团队分享,专注软件开发与技术解决方案。

官网:wubianj.com

© 版权归无边界科技所有,版权所有。

相关推荐
汪海游龙2 小时前
03.29 AI 精选:面向 PR 的多智能体 AI 代码审查
github
第一程序员2 小时前
如何在GitHub上找到适合初学者的Python项目
python·github
MadPrinter2 小时前
GitHub Trending 每日精选 - 2026-03-28
ai·自动化·github·openclaw
huwuhang3 小时前
纯粹直播:一款聚合全网直播的全平台看直播APP,专为大屏而生的开源神器
开源
NocoBase3 小时前
【2.0 教程】第 7 章:仪表盘,一眼看全局
人工智能·低代码·开源·无代码
第一程序员3 小时前
非专业转码心路历程与Rust学习规划
python·github
散峰而望3 小时前
【数据结构】单调栈与单调队列深度解析:从模板到实战,一网打尽
开发语言·数据结构·c++·后端·算法·github·推荐算法
研究点啥好呢3 小时前
3月28日Github热榜推荐 | 你还没有为AI接一个数据库吗
数据库·人工智能·驱动开发·github