logo
1
2
WeChat Login
feat: Supabase Docker 一键启动方案

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/