Supabase 自部署完整指南
目录
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_KEY 和 SERVICE_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 访问
✅ 加固安全配置
✅ 优化生产性能
✅ 建立备份策略
关键要点:
- 始终修改默认密码和密钥
- 使用 HTTPS 保护所有通信
- 定期备份数据
- 监控系统健康状态
- 及时应用安全更新
参考资源:
祝您部署顺利!🚀
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐




所有评论(0)