目录

  1. Supabase 简介
  2. 系统要求
  3. 使用 Docker 部署(推荐)
  4. 配置域名和 API 访问
  5. 安全加固
  6. 生产环境优化
  7. 备份与恢复
  8. 常见问题

Supabase 简介

Supabase 是一个开源的 Firebase 替代品,提供:

  • PostgreSQL 数据库:强大的关系型数据库
  • 实时订阅:WebSocket 实时数据更新
  • 用户认证:完整的 JWT 身份验证系统
  • 对象存储:S3 兼容的文件存储
  • REST API:自动生成的数据库 REST API
  • Edge Functions:serverless 函数

为什么自部署?

  • 完全控制数据和基础设施
  • 避免厂商锁定
  • 满足数据合规要求
  • 成本优化(大规模使用时)

系统要求

硬件配置

最低配置(开发/测试)

  • CPU: 2 核
  • 内存: 4GB RAM
  • 存储: 20GB SSD

推荐配置(生产环境)

  • CPU: 4-8 核
  • 内存: 8-16GB RAM
  • 存储: 50-100GB SSD

软件要求

  • 操作系统: Linux (Ubuntu 20.04+, Debian 11+, CentOS 8+)
  • Docker: 20.10 或更高版本
  • Docker Compose: v2.0 或更高版本
  • Git: 用于克隆仓库

使用 Docker 部署(推荐)

根据 Supabase 官方文档,使用 Docker 是最简单快速的部署方式。

步骤 1: 克隆官方仓库

# 克隆 Supabase 仓库(浅克隆以加快速度)
git clone --depth 1 https://github.com/supabase/supabase

# 创建项目目录
mkdir supabase-project

# 目录结构应该是这样的:
# .
# ├── supabase
# └── supabase-project

# 复制 Docker Compose 文件到项目目录
cp -rf supabase/docker/* supabase-project/

# 复制环境变量模板
cp supabase/docker/.env.example supabase-project/.env

# 进入项目目录
cd supabase-project

步骤 2: 配置环境变量

编辑 .env 文件,配置以下关键参数:

# 数据库配置
POSTGRES_PASSWORD=your-super-secret-and-long-postgres-password
POSTGRES_DB=postgres

# JWT 密钥(至少 32 个字符)
JWT_SECRET=your-super-secret-jwt-token-with-at-least-32-characters-long

# API 密钥(使用官方工具生成)
ANON_KEY=your-anon-key
SERVICE_ROLE_KEY=your-service-role-key

# 站点 URL(重要!用于认证回调)
SITE_URL=http://localhost:3000

# 公开访问 URL(Dashboard 访问地址)
SUPABASE_PUBLIC_URL=http://your-domain.com:8000

# Dashboard 认证
DASHBOARD_USERNAME=supabase
DASHBOARD_PASSWORD=this_password_is_insecure_and_should_be_updated

# Supavisor 连接池配置
POOLER_TENANT_ID=your-tenant-id

# SMTP 邮件配置(用于发送认证邮件)
SMTP_ADMIN_EMAIL=admin@example.com
SMTP_HOST=smtp.gmail.com
SMTP_PORT=587
SMTP_USER=your-email@gmail.com
SMTP_PASS=your-email-password
SMTP_SENDER_NAME=Supabase

# 存储配置(可选:使用 S3)
STORAGE_BACKEND=file
# 如果使用 S3,设置以下配置:
# STORAGE_BACKEND=s3
# GLOBAL_S3_BUCKET=your-bucket-name
# REGION=us-east-1

步骤 3: 生成安全密钥

生成 JWT Secret

# 方法 1: 使用 OpenSSL
openssl rand -base64 32

# 方法 2: 使用 Python
python3 -c "import secrets; print(secrets.token_urlsafe(32))"

生成 API 密钥

访问 Supabase 官方的 JWT 生成器:https://supabase.com/docs/guides/self-hosting/docker

或者使用 Supabase CLI:

# 安装 Supabase CLI
npm install -g @supabase/cli

# 生成 anon key
supabase gen keys --anon

# 生成 service_role key  
supabase gen keys --service_role

将生成的密钥填入 .env 文件的 ANON_KEYSERVICE_ROLE_KEY

步骤 4: 启动服务

# 拉取最新的 Docker 镜像
docker compose pull

# 启动所有服务(后台运行)
docker compose up -d

# 查看服务状态
docker compose ps

# 查看日志(可选)
docker compose logs -f

所有服务应该显示 running (healthy) 状态。

步骤 5: 访问服务

启动成功后,可以通过以下地址访问:

  • Supabase Studio(管理界面): http://localhost:8000
  • REST API: http://localhost:8000/rest/v1/
  • 认证 API: http://localhost:8000/auth/v1/
  • 存储 API: http://localhost:8000/storage/v1/
  • 实时 API: http://localhost:8000/realtime/v1/
  • Edge Functions: http://localhost:8000/functions/v1/

默认登录凭据:

  • 用户名: supabase
  • 密码: this_password_is_insecure_and_should_be_updated

⚠️ 重要:立即修改默认密码!


配置域名和 API 访问

这是生产部署的关键步骤,让您的应用能够通过域名访问 Supabase 后端。

方式一:使用 Nginx 反向代理(推荐)

1. 安装 Nginx
# Ubuntu/Debian
sudo apt update
sudo apt install nginx

# CentOS/RHEL
sudo yum install nginx
2. 配置 SSL 证书(使用 Let’s Encrypt)
# 安装 Certbot
sudo apt install certbot python3-certbot-nginx

# 停止 Nginx(如果正在运行)
sudo systemctl stop nginx

# 获取 SSL 证书
sudo certbot certonly --standalone \
  --email your-email@example.com \
  --agree-tos \
  --no-eff-email \
  -d api.yourdomain.com \
  -d studio.yourdomain.com

# 证书将保存在:
# /etc/letsencrypt/live/api.yourdomain.com/
3. 创建 Nginx 配置文件

创建 API 网关配置:

sudo nano /etc/nginx/sites-available/supabase-api

添加以下内容:

# HTTP 到 HTTPS 重定向
server {
    listen 80;
    server_name auth.example.com;
    return 301 https://$server_name$request_uri;
}

# HTTPS API 网关
server {
    listen 443 ssl http2;
    server_name auth.example.com;

    # SSL 证书配置
    ssl_certificate /etc/letsencrypt/live/auth.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/auth.example.com/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;

    # 安全头部
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
    add_header X-Frame-Options "SAMEORIGIN" always;
    add_header X-Content-Type-Options "nosniff" always;

    # 代理到 Kong API 网关
    location / {
        proxy_pass http://localhost:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        
        # WebSocket 支持(用于 Realtime)
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        
        # 超时设置
        proxy_connect_timeout 60s;
        proxy_send_timeout 60s;
        proxy_read_timeout 60s;
    }
}

创建 Studio Dashboard 配置:

sudo nano /etc/nginx/sites-available/supabase-studio

添加以下内容:

# HTTP 到 HTTPS 重定向
server {
    listen 80;
    server_name studio.example.com;
    return 301 https://$server_name$request_uri;
}

# HTTPS Studio Dashboard
server {
    listen 443 ssl http2;
    server_name studio.example.com;

    # SSL 证书配置
    ssl_certificate /etc/letsencrypt/live/studio.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/studio.example.com/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;

    # 代理到 Studio
    location / {
        proxy_pass http://localhost:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}
4. 启用配置并重启 Nginx
# 创建符号链接
sudo ln -s /etc/nginx/sites-available/supabase-api /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/supabase-studio /etc/nginx/sites-enabled/

# 测试配置
sudo nginx -t

# 启动 Nginx
sudo systemctl start nginx
sudo systemctl enable nginx

# 重新加载配置
sudo systemctl reload nginx
5. 配置 DNS 记录

在您的域名服务商(如 Cloudflare、Namecheap、阿里云等)添加 A 记录:

类型    名称     值                    TTL
A      api      your-server-ip       自动
A      studio   your-server-ip       自动
6. 更新 Supabase 配置

编辑 .env 文件,更新以下配置:

# 更新为您的域名
SITE_URL=https://your-frontend-app.com
SUPABASE_PUBLIC_URL=https://api.yourdomain.com
API_EXTERNAL_URL=https://api.yourdomain.com

# 认证相关配置
GOTRUE_SITE_URL=https://your-frontend-app.com
GOTRUE_EXTERNAL_URL=https://api.yourdomain.com/auth/v1

重启 Supabase 服务:

cd supabase-project
docker compose down
docker compose up -d
7. 在前端应用中配置

在您的前端应用中,使用新的 API URL:

JavaScript/TypeScript 示例

import { createClient } from '@supabase/supabase-js'

const supabaseUrl = 'https://auth.example.com'
const supabaseAnonKey = 'your-anon-key-from-env-file'

export const supabase = createClient(supabaseUrl, supabaseAnonKey)

React Native 示例

import { createClient } from '@supabase/supabase-js'
import AsyncStorage from '@react-native-async-storage/async-storage'

const supabaseUrl = 'https://auth.example.com'
const supabaseAnonKey = 'your-anon-key'

export const supabase = createClient(supabaseUrl, supabaseAnonKey, {
  auth: {
    storage: AsyncStorage,
    autoRefreshToken: true,
    persistSession: true,
    detectSessionInUrl: false,
  },
})

Flutter 示例

import 'package:supabase_flutter/supabase_flutter.dart';

void main() async {
  await Supabase.initialize(
    url: 'https://auth.example.com',
    anonKey: 'your-anon-key',
  );
  runApp(MyApp());
}

方式二:使用 Nginx Proxy Manager(简化方式)

如果您不熟悉 Nginx 配置,可以使用 Nginx Proxy Manager 的 Web 界面。

1. 添加到 docker-compose.yml
services:
  # ... 其他 Supabase 服务 ...
  
  nginx-proxy-manager:
    image: 'jc21/nginx-proxy-manager:latest'
    restart: unless-stopped
    ports:
      - '80:80'
      - '443:443'
      - '81:81'  # 管理界面端口
    volumes:
      - ./nginx-data:/data
      - ./nginx-letsencrypt:/etc/letsencrypt
    environment:
      TZ: 'Asia/Shanghai'
2. 启动并配置
docker compose up -d nginx-proxy-manager

# 访问管理界面
# http://your-server-ip:81
# 默认登录:
# Email: admin@example.com
# Password: changeme

在界面中添加代理:

API 代理配置

  • Domain: auth.example.com
  • Scheme: http
  • Forward Hostname/IP: kong
  • Forward Port: 8000
  • 启用 WebSocket 支持
  • 在 SSL 标签页申请 Let’s Encrypt 证书

Studio 代理配置

  • Domain: studio.example.com
  • Scheme: http
  • Forward Hostname/IP: studio
  • Forward Port: 3000
  • 在 SSL 标签页申请 Let’s Encrypt 证书

方式三:使用 Cloudflare Tunnel(无需公网 IP)

适合没有固定公网 IP 的场景。

1. 安装 Cloudflared
# Ubuntu/Debian
wget https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb
sudo dpkg -i cloudflared-linux-amd64.deb

# 登录 Cloudflare
cloudflared tunnel login
2. 创建隧道
# 创建隧道
cloudflared tunnel create supabase

# 配置隧道
nano ~/.cloudflared/config.yml

添加配置:

tunnel: <tunnel-id>
credentials-file: /root/.cloudflared/<tunnel-id>.json

ingress:
  - hostname: auth.example.com
    service: http://localhost:8000
  - hostname: studio.example.com
    service: http://localhost:3000
  - service: http_status:404
3. 启动隧道
# 运行隧道
cloudflared tunnel run supabase

# 或作为服务运行
sudo cloudflared service install
sudo systemctl start cloudflared
sudo systemctl enable cloudflared

安全加固

1. 修改默认密码

Dashboard 密码

编辑 .env:

DASHBOARD_USERNAME=your-admin-username
DASHBOARD_PASSWORD=your-strong-password

或在 ./volumes/api/kong.yml 添加多个用户:

basicauth_credentials:
  - consumer: DASHBOARD
    username: admin
    password: strong-password-1
  - consumer: DASHBOARD
    username: developer
    password: strong-password-2

数据库密码

POSTGRES_PASSWORD=your-very-strong-database-password

2. 配置防火墙

# 使用 ufw(Ubuntu/Debian)
sudo ufw allow 22/tcp    # SSH
sudo ufw allow 80/tcp    # HTTP
sudo ufw allow 443/tcp   # HTTPS
sudo ufw enable

# 禁止直接访问 Docker 端口
sudo ufw deny 8000/tcp
sudo ufw deny 3000/tcp
sudo ufw deny 5432/tcp

3. 限制数据库访问

默认情况下,PostgreSQL 不对外暴露。如需直接访问,编辑 docker-compose.yml:

db:
  # 仅在必要时取消注释
  # ports:
  #   - "${POSTGRES_PORT}:${POSTGRES_PORT}"

4. 配置 CORS

.env 中配置允许的源:

# 允许的来源(多个用逗号分隔)
GOTRUE_EXTERNAL_URL=https://api.yourdomain.com
GOTRUE_SITE_URL=https://your-app.com
GOTRUE_ADDITIONAL_REDIRECT_URLS=https://your-app.com,https://admin.your-app.com

5. 启用 Rate Limiting

Kong 网关支持速率限制,编辑 volumes/api/kong.yml:

plugins:
  - name: rate-limiting
    config:
      minute: 60
      hour: 1000
      policy: local

生产环境优化

1. 数据库性能优化

创建 volumes/db/postgresql.conf:

# 连接设置
max_connections = 200
shared_buffers = 2GB
effective_cache_size = 6GB
maintenance_work_mem = 512MB
checkpoint_completion_target = 0.9
wal_buffers = 16MB
default_statistics_target = 100
random_page_cost = 1.1
effective_io_concurrency = 200
work_mem = 10MB
min_wal_size = 1GB
max_wal_size = 4GB

# 日志设置
log_destination = 'stderr'
logging_collector = on
log_directory = 'log'
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
log_min_messages = warning
log_min_error_statement = error

2. 使用外部 S3 存储

编辑 .env:

# 存储后端配置
STORAGE_BACKEND=s3
GLOBAL_S3_BUCKET=your-bucket-name
REGION=us-east-1
AWS_ACCESS_KEY_ID=your-access-key
AWS_SECRET_ACCESS_KEY=your-secret-key

# 或使用 MinIO(自托管 S3)
GLOBAL_S3_ENDPOINT=https://minio.yourdomain.com
GLOBAL_S3_PROTOCOL=https

3. 配置 Redis 缓存(可选)

添加到 docker-compose.yml:

redis:
  image: redis:alpine
  restart: unless-stopped
  volumes:
    - ./volumes/redis:/data
  command: redis-server --appendonly yes

4. 启用监控

添加 Prometheus 和 Grafana

创建 docker-compose.monitoring.yml:

version: '3.8'

services:
  prometheus:
    image: prom/prometheus:latest
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
      - prometheus-data:/prometheus
    ports:
      - "9090:9090"
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
      - '--storage.tsdb.path=/prometheus'

  grafana:
    image: grafana/grafana:latest
    volumes:
      - grafana-data:/var/lib/grafana
    ports:
      - "3001:3000"
    environment:
      - GF_SECURITY_ADMIN_PASSWORD=admin
      - GF_USERS_ALLOW_SIGN_UP=false

volumes:
  prometheus-data:
  grafana-data:

启动监控服务:

docker compose -f docker-compose.yml -f docker-compose.monitoring.yml up -d

备份与恢复

自动备份脚本

创建 backup.sh:

#!/bin/bash

# 配置
BACKUP_DIR="/backups/supabase"
DATE=$(date +%Y%m%d_%H%M%S)
RETENTION_DAYS=7

# 创建备份目录
mkdir -p $BACKUP_DIR

# 备份数据库
echo "正在备份数据库..."
docker exec supabase-db pg_dumpall -U postgres > \
  $BACKUP_DIR/db_backup_$DATE.sql

# 压缩备份
gzip $BACKUP_DIR/db_backup_$DATE.sql

# 备份存储文件
echo "正在备份存储文件..."
tar -czf $BACKUP_DIR/storage_backup_$DATE.tar.gz \
  -C volumes/storage .

# 备份配置文件
echo "正在备份配置..."
tar -czf $BACKUP_DIR/config_backup_$DATE.tar.gz \
  .env volumes/api/kong.yml

# 删除旧备份
echo "清理旧备份..."
find $BACKUP_DIR -name "*.sql.gz" -mtime +$RETENTION_DAYS -delete
find $BACKUP_DIR -name "*.tar.gz" -mtime +$RETENTION_DAYS -delete

echo "备份完成: $BACKUP_DIR"

设置定时任务:

# 使文件可执行
chmod +x backup.sh

# 添加到 crontab
crontab -e

# 每天凌晨 2 点执行备份
0 2 * * * /path/to/backup.sh >> /var/log/supabase-backup.log 2>&1

恢复数据

# 停止服务
docker compose down

# 恢复数据库
gunzip -c /backups/supabase/db_backup_20241025_020000.sql.gz | \
  docker exec -i supabase-db psql -U postgres

# 恢复存储文件
tar -xzf /backups/supabase/storage_backup_20241025_020000.tar.gz \
  -C volumes/storage

# 启动服务
docker compose up -d

常见问题

1. 服务无法启动

查看日志

docker compose logs -f [service-name]

# 查看所有服务
docker compose ps

# 查看特定服务
docker compose logs kong
docker compose logs db

常见原因

  • 端口冲突:检查 8000, 3000, 5432 端口是否被占用
  • 内存不足:至少需要 4GB RAM
  • 权限问题:检查 volumes 目录权限

2. 数据库连接错误

# 测试数据库连接
docker exec -it supabase-db psql -U postgres

# 如果提示密码错误,检查 .env 中的 POSTGRES_PASSWORD

3. 认证回调失败

确保 .env 中的配置正确:

SITE_URL=https://your-frontend-app.com
GOTRUE_SITE_URL=https://your-frontend-app.com
GOTRUE_EXTERNAL_URL=https://auth.example.com/auth/v1

4. SMTP 邮件发送失败

Gmail 配置示例

SMTP_HOST=smtp.gmail.com
SMTP_PORT=587
SMTP_USER=your-email@gmail.com
SMTP_PASS=your-app-password  # 使用应用专用密码,不是账户密码
SMTP_SENDER_NAME=Your App Name
SMTP_ADMIN_EMAIL=your-email@gmail.com

测试 SMTP 连接

telnet smtp.gmail.com 587

5. SSL 证书续期

Let’s Encrypt 证书每 90 天过期,设置自动续期:

# 测试续期
sudo certbot renew --dry-run

# 添加到 crontab
0 3 * * * certbot renew --quiet && systemctl reload nginx

6. 更新 Supabase 版本

# 停止服务
docker compose down

# 备份数据
./backup.sh

# 拉取最新代码
cd supabase
git pull origin master

# 复制最新文件
cp -rf docker/* ../supabase-project/

# 更新镜像
cd ../supabase-project
docker compose pull

# 启动服务
docker compose up -d

7. 性能问题

检查资源使用

# 查看容器资源
docker stats

# 增加数据库连接池
# 编辑 .env
POOLER_MAX_CLIENT_CONN=100

8. WebSocket 连接失败

确保 Nginx 配置支持 WebSocket:

proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";

维护建议

日常维护清单

  • ✅ 每周检查磁盘空间使用情况
  • ✅ 每周查看日志文件
  • ✅ 每月审查安全更新
  • ✅ 每月测试备份恢复
  • ✅ 每季度审查用户权限
  • ✅ 每季度性能调优

监控指标

  • CPU 使用率 < 70%
  • 内存使用率 < 80%
  • 磁盘使用率 < 85%
  • 数据库连接数 < max_connections 的 80%
  • API 响应时间 < 200ms (P95)

总结

通过本指南,您应该能够成功部署一个生产就绪的 Supabase 实例,包括:

✅ 使用 Docker 快速部署
✅ 配置自定义域名和 SSL
✅ 实现应用程序 API 访问
✅ 加固安全配置
✅ 优化生产性能
✅ 建立备份策略

关键要点:

  1. 始终修改默认密码和密钥
  2. 使用 HTTPS 保护所有通信
  3. 定期备份数据
  4. 监控系统健康状态
  5. 及时应用安全更新

参考资源:

祝您部署顺利!🚀

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐