logo
1
2
WeChat Login

Supabase Docker 自托管

使用 Docker 快速启动完整的 Supabase 服务栈。一键启动,自动配置,开箱即用!

🚀 快速开始

一键启动

Linux/Mac:

chmod +x start.sh
./start.sh

Windows:

start.bat

首次运行会自动:

  • ✅ 创建 .env 配置文件
  • ✅ 生成安全的密码和密钥
  • ✅ 检查端口是否可用
  • ✅ 启动所有服务

访问服务

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

服务地址说明
Studiohttp://localhost:3000Web 管理控制台
APIhttp://localhost:8000REST API 端点
Databaselocalhost:5432PostgreSQL 数据库
Analyticshttp://localhost:4000日志分析服务

默认登录信息(查看 .env 文件):

  • 用户名:supabase
  • 密码:.env 中的 DASHBOARD_PASSWORD

📝 管理命令

Linux/Mac

./start.sh start    # 启动服务(默认)
./start.sh stop     # 停止服务
./start.sh restart  # 重启服务
./start.sh down     # 停止并删除所有容器
./start.sh reset    # 完全重置(删除所有数据和容器)
./start.sh logs     # 查看日志(可指定服务名)
./start.sh status   # 查看服务状态
./start.sh config   # 打开配置文件
./start.sh help     # 显示帮助信息

示例:

./start.sh logs db        # 查看数据库日志
./start.sh logs auth      # 查看认证服务日志
./start.sh logs kong      # 查看 API 网关日志

Windows

start.bat start    # 启动服务(默认)
start.bat stop     # 停止服务
start.bat restart  # 重启服务
start.bat down     # 停止并删除所有容器
start.bat reset    # 完全重置(删除所有数据和容器)
start.bat logs     # 查看日志
start.bat status   # 查看服务状态
start.bat config   # 打开配置文件
start.bat help     # 显示帮助信息

⚙️ 配置说明

查看和修改配置

Linux/Mac:

./start.sh config
# 或直接编辑
nano .env

Windows:

start.bat config
# 或直接编辑
notepad .env

修改配置后需要重启服务:

./start.sh restart  # Linux/Mac
start.bat restart   # Windows

重要配置项

🔐 安全配置(必改)

# PostgreSQL 数据库密码
POSTGRES_PASSWORD=your-super-secret-and-long-postgres-password

# JWT 密钥(用于身份验证,至少 32 字符)
JWT_SECRET=your-super-secret-jwt-token-with-at-least-32-characters-long

# API 密钥
ANON_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
SERVICE_ROLE_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...

# Dashboard 登录信息
DASHBOARD_USERNAME=supabase
DASHBOARD_PASSWORD=your-dashboard-password

生成安全密钥的方法:

# 生成 JWT 密钥
openssl rand -base64 50

# 或
cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 64 | head -n 1

🌍 访问地址配置

# API 外部访问地址
API_EXTERNAL_URL=http://localhost:8000

# Supabase 公开地址
SUPABASE_PUBLIC_URL=http://localhost:8000

# 站点地址(用于邮件验证链接等)
SITE_URL=http://localhost:3000

# 额外的重定向 URL(多个用逗号分隔)
ADDITIONAL_REDIRECT_URLS=http://localhost:3001,http://example.com

生产环境示例:

API_EXTERNAL_URL=https://api.yourdomain.com
SUPABASE_PUBLIC_URL=https://api.yourdomain.com
SITE_URL=https://yourdomain.com
ADDITIONAL_REDIRECT_URLS=https://app.yourdomain.com

🗄️ 数据库配置

POSTGRES_DB=postgres
POSTGRES_HOST=db
POSTGRES_PORT=5432

# 连接池配置
POOLER_DEFAULT_POOL_SIZE=20
POOLER_MAX_CLIENT_CONN=100
POOLER_DB_POOL_SIZE=5

👤 认证配置

# 是否禁止新用户注册
DISABLE_SIGNUP=false

# 是否启用邮箱注册
ENABLE_EMAIL_SIGNUP=true

# 是否启用匿名用户
ENABLE_ANONYMOUS_USERS=false

# 是否自动确认邮箱
ENABLE_EMAIL_AUTOCONFIRM=false

# JWT 过期时间(秒)
JWT_EXPIRY=3600

场景配置示例:

公开注册(社交应用):

DISABLE_SIGNUP=false
ENABLE_EMAIL_SIGNUP=true
ENABLE_ANONYMOUS_USERS=true
ENABLE_EMAIL_AUTOCONFIRM=true

需邮箱验证(企业应用):

DISABLE_SIGNUP=false
ENABLE_EMAIL_SIGNUP=true
ENABLE_ANONYMOUS_USERS=false
ENABLE_EMAIL_AUTOCONFIRM=false

仅管理员添加用户(内部系统):

DISABLE_SIGNUP=true
ENABLE_EMAIL_SIGNUP=false
ENABLE_ANONYMOUS_USERS=false

📧 邮件配置

使用真实 SMTP 服务器:

# 管理员邮箱
SMTP_ADMIN_EMAIL=admin@yourdomain.com

# SMTP 服务器
SMTP_HOST=smtp.gmail.com
SMTP_PORT=587

# SMTP 认证
SMTP_USER=your-email@gmail.com
SMTP_PASS=your-app-password

# 发件人名称
SMTP_SENDER_NAME=Your App Name

常用 SMTP 配置:

Gmail:

SMTP_HOST=smtp.gmail.com
SMTP_PORT=587
SMTP_USER=your-email@gmail.com
SMTP_PASS=your-app-password  # 需要在 Google 账户生成应用专用密码

Outlook:

SMTP_HOST=smtp.office365.com
SMTP_PORT=587
SMTP_USER=your-email@outlook.com
SMTP_PASS=your-password

腾讯企业邮箱:

SMTP_HOST=smtp.exmail.qq.com
SMTP_PORT=465
SMTP_USER=your-email@company.com
SMTP_PASS=your-password

阿里云邮件推送:

SMTP_HOST=smtpdm.aliyun.com
SMTP_PORT=80
SMTP_USER=your-username
SMTP_PASS=your-password

🎬 Studio 配置

# 默认组织名称
STUDIO_DEFAULT_ORGANIZATION=My Company

# 默认项目名称
STUDIO_DEFAULT_PROJECT=My Project

🤖 AI 功能配置(可选)

用于 Studio SQL Editor 的 AI 助手:

OPENAI_API_KEY=sk-...

获取方式:

  1. 访问 https://platform.openai.com/
  2. 注册/登录
  3. 生成 API Key
  4. 复制到配置文件

修改端口配置

如果默认端口被占用,可以在 .env 中修改:

# 修改 API 端口
KONG_HTTP_PORT=8000
KONG_HTTPS_PORT=8443

# 修改数据库端口
POSTGRES_PORT=5432
POOLER_PROXY_PORT_TRANSACTION=6543

注意:修改端口后需要重启服务。

🏗️ 服务架构

核心服务

  • Studio - Web 管理界面,可视化管理数据库
  • Kong - API 网关,统一管理 API 路由
  • Auth - 用户认证服务 (GoTrue)
  • REST - 数据库 API (PostgREST)
  • Realtime - 实时数据订阅服务
  • Storage - 文件存储服务
  • Meta - 数据库元数据 API
  • PostgreSQL - 主数据库 (15.8)
  • Functions - Edge Functions(云函数)
  • Analytics - 日志分析服务 (Logflare)
  • Vector - 日志收集服务
  • Supavisor - 数据库连接池
  • ImgProxy - 图片处理服务

数据持久化

数据存储在 volumes/ 目录:

volumes/
├── db/data/         # PostgreSQL 数据
├── storage/         # 文件存储
├── api/             # Kong 配置
├── functions/       # Edge Functions
├── logs/            # Vector 日志配置
└── pooler/          # Supavisor 配置

🔒 安全建议

⚠️ 生产环境必须做以下配置

  1. ✅ 修改所有默认密码和密钥(最重要!)
  2. ✅ 生成新的 JWT 密钥
  3. ✅ 配置反向代理(Nginx/Traefik)
  4. ✅ 启用 HTTPS
  5. ✅ 限制网络访问,配置防火墙
  6. ✅ 设置定期备份策略
  7. ✅ 配置真实的 SMTP 邮件服务
  8. ✅ 禁用匿名用户(如果不需要)
  9. ✅ 更新安全规则和策略

❓ 常见问题

1. 服务无法启动

检查端口占用:

# Linux/Mac
lsof -i :3000
lsof -i :8000

# Windows
netstat -ano | findstr ":3000"
netstat -ano | findstr ":8000"

解决方案: 停止占用端口的程序,或修改 .env 中的端口配置。

2. 数据库连接失败

检查数据库容器是否健康:

./start.sh status
./start.sh logs db

3. 完全重置所有数据

./start.sh reset
# 或
docker compose down -v --remove-orphans
rm -rf volumes/db/data/*
rm -rf volumes/storage/*

⚠️ 警告:此操作会删除所有数据,不可恢复!

4. 如何备份数据?

备份数据库:

# 导出数据库
docker compose exec -T db pg_dump -U postgres postgres > backup.sql

# 导入数据库
docker compose exec -T db psql -U postgres postgres < backup.sql

备份文件存储:

# 复制整个 storage 目录
cp -r volumes/storage backup_storage/

5. 如何更新到最新版本?

# 拉取最新镜像
docker compose pull

# 重启服务
docker compose down
docker compose up -d

6. Studio 无法访问(连接被拒绝)

确保 Studio 容器的端口已映射:

docker compose ps studio
# 应该显示: 0.0.0.0:3000->3000/tcp

如果没有端口映射,检查 docker-compose.yml 中的 studio 服务是否包含:

ports:
  - 3000:3000/tcp

📊 性能调优

数据库性能

编辑 docker-compose.yml 中的 db 服务:

db:
  environment:
    # 共享缓冲区(默认 128MB,可增加到内存的 25%)
    shared_buffers: 256MB
    
    # 有效缓存大小(默认 4GB)
    effective_cache_size: 4GB
    
    # 最大工作进程数(默认 CPU 核心数)
    max_worker_processes: 4
    
    # 工作内存(默认 4MB)
    work_mem: 16MB

连接池调优

# 并发连接数
POOLER_DEFAULT_POOL_SIZE=20

# 最大客户端数
POOLER_MAX_CLIENT_CONN=200

调整建议:

  • 小型项目:默认配置即可
  • 中型项目:POOLER_DEFAULT_POOL_SIZE=30, POOLER_MAX_CLIENT_CONN=200
  • 大型项目:POOLER_DEFAULT_POOL_SIZE=50, POOLER_MAX_CLIENT_CONN=500

🔧 高级配置

自定义数据库初始化

将 SQL 脚本放在 volumes/db/init/ 目录:

volumes/db/init/
├── 01_create_tables.sql
├── 02_insert_data.sql
└── 03_create_functions.sql

添加自定义 Kong 配置

编辑 volumes/api/kong.yml 文件,添加自定义路由和插件。

部署 Edge Functions

将函数文件放在 volumes/functions/ 目录:

volumes/functions/
└── my-function/
    └── index.ts

🌍 域名和 SSL 配置(生产环境)

使用 Nginx 反向代理

创建 nginx.conf

server {
    listen 80;
    server_name api.yourdomain.com;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl;
    server_name api.yourdomain.com;

    ssl_certificate /path/to/cert.pem;
    ssl_certificate_key /path/to/key.pem;

    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;
    }
}

更新 Supabase 配置

API_EXTERNAL_URL=https://api.yourdomain.com
SUPABASE_PUBLIC_URL=https://api.yourdomain.com
SITE_URL=https://yourdomain.com

🌐 生产环境部署

推荐部署方式

1. 单机部署(Docker Compose)

# 克隆项目
git clone <your-repo>
cd supabase-docker

# 配置环境变量
cp .env.example .env
nano .env  # 修改密码和密钥

# 启动服务
./start.sh

# 或使用 docker compose
docker compose up -d

2. 云服务器部署

腾讯云轻量应用服务器:

# 安装 Docker
curl -fsSL https://get.docker.com | sh

# 安装 Docker Compose
curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

# 上传项目文件
scp -r supabase-docker root@your-server:/opt/

# 连接服务器
ssh root@your-server

# 启动服务
cd /opt/supabase-docker
./start.sh

阿里云 ECS:

# 安装 Docker
yum install -y docker
systemctl start docker

# 启动服务
cd /path/to/supabase-docker
./start.sh

3. 使用 Nginx 反向代理

安装 Nginx:

# Ubuntu/Debian
apt install -y nginx

# CentOS/RHEL
yum install -y nginx

配置 Nginx (/etc/nginx/sites-available/supabase):

# Studio
server {
    listen 80;
    server_name studio.yourdomain.com;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    server_name studio.yourdomain.com;

    ssl_certificate /etc/ssl/certs/studio.crt;
    ssl_certificate_key /etc/ssl/private/studio.key;

    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;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}

# API
server {
    listen 80;
    server_name api.yourdomain.com;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    server_name api.yourdomain.com;

    ssl_certificate /etc/ssl/certs/api.crt;
    ssl_certificate_key /etc/ssl/private/api.key;

    client_max_body_size 50M;

    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;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}

启用配置:

ln -s /etc/nginx/sites-available/supabase /etc/nginx/sites-enabled/
nginx -t
systemctl reload nginx

更新 Supabase 配置 (.env):

API_EXTERNAL_URL=https://api.yourdomain.com
SUPABASE_PUBLIC_URL=https://api.yourdomain.com
SITE_URL=https://studio.yourdomain.com

重启服务:

./start.sh restart

4. 使用 SSL 证书

使用 Let's Encrypt 免费证书:

# 安装 Certbot
apt install -y certbot python3-certbot-nginx

# 获取证书
certbot --nginx -d api.yourdomain.com -d studio.yourdomain.com

# 证书自动续期
certbot renew --dry-run

证书位置:

  • 证书:/etc/letsencrypt/live/yourdomain.com/fullchain.pem
  • 私钥:/etc/letsencrypt/live/yourdomain.com/privkey.pem

更新 Nginx 配置使用这些证书。

5. 防火墙配置

使用 UFW (Ubuntu):

# 启用防火墙
ufw enable

# 允许 SSH
ufw allow 22/tcp

# 允许 HTTP/HTTPS
ufw allow 80/tcp
ufw allow 443/tcp

# 查看状态
ufw status

使用 firewalld (CentOS):

# 启用防火墙
systemctl start firewalld
systemctl enable firewalld

# 允许服务
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
firewall-cmd --permanent --add-service=ssh

# 重载配置
firewall-cmd --reload

6. 定期备份

创建备份脚本 /opt/backup-supabase.sh

#!/bin/bash

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

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

# 备份数据库
docker compose exec -T db pg_dump -U postgres postgres > $BACKUP_DIR/db_$DATE.sql

# 备份存储
tar -czf $BACKUP_DIR/storage_$DATE.tar.gz volumes/storage/

# 删除旧备份
find $BACKUP_DIR -type f -mtime +$RETENTION_DAYS -delete

# 上传到云存储(可选)
# aws s3 sync $BACKUP_DIR s3://your-backup-bucket/supabase/

添加定时任务:

# 编辑 crontab
crontab -e

# 每天凌晨 2 点备份
0 2 * * * /opt/backup-supabase.sh

📚 更多资源

🚀 CODING 平台部署

本项目配置了 cnb.yaml,支持在腾讯云 CODING 等支持 Cloud Native Buildpacks 的平台上部署。

快速部署步骤

  1. 在 CODING 平台创建项目
  2. 导入此仓库或关联 Git 仓库
  3. 配置持续集成/部署流水线
  4. 平台会自动识别 cnb.yaml 配置
  5. 设置环境变量(参考 .env.example
  6. 启动部署

环境变量配置

在 CODING 部署配置中设置以下变量:

变量名说明
POSTGRES_PASSWORD数据库密码
JWT_SECRETJWT 密钥
ANON_KEY匿名访问密钥
SERVICE_ROLE_KEY服务端密钥
DASHBOARD_PASSWORDDashboard 密码
API_EXTERNAL_URLAPI 外部地址
SUPABASE_PUBLIC_URL公开访问地址
SITE_URL站点地址

📄 许可证

Apache-2.0


🎯 快速参考

端口说明

端口服务说明
3000StudioWeb 管理界面
8000Kong HTTPAPI 网关
8443Kong HTTPSAPI 网关(SSL)
5432PostgreSQL数据库
4000Analytics日志分析

常用命令速查

# 启动服务
./start.sh

# 查看状态
./start.sh status

# 查看日志
./start.sh logs [服务名]

# 重启服务
./start.sh restart

# 停止服务
./start.sh stop

# 编辑配置
./start.sh config

# 完全重置
./start.sh reset

配置文件位置

配置位置
环境变量.env
Docker Composedocker-compose.yml
Kong 配置volumes/api/kong.yml
数据库数据volumes/db/data/
文件存储volumes/storage/
Edge Functionsvolumes/functions/

About

这是把superbase移植到cnb的仓库

Language
TypeScript70.2%
Shell19.1%
Dockerfile0.9%
Others9.8%