在supabase官方提供的自托管方案中,所有服务都是通过同一端口(8000)暴露出来的,例如访问 Supabase Studio:http://
1️⃣ Supabase自托管环境准备
1.1 服务器要求
- CPU: 2 核以上
- 内存: 至少 4GB(推荐 8GB)
- 确保已安装 Docker & Docker Compose
# 安装 Docker
curl -fsSL https://get.docker.com | bash
# 安装 Docker Compose
sudo apt install docker-compose -y
1.2 获取 Supabase 自托管代码
git clone --depth 1 https://github.com/supabase/supabase
cd supabase/docker
1.3 创建 .env 配置文件
cp .env.example .env
1.4 备份docker-compose.yml(这样就有了一个备份文件可以参考)
cp docker-compose.yml docker-compose.yml.bkp
2️⃣ Supabase生产环境安全配置方案
2.1 保护 Kong API 网关
在 docker-compose.yml
中搜索 kong:
并删除其中的ports:
部分:
2.2 不要将 Supabase Studio(仪表板)暴露在 API Gateway (Kong) 上
转到docker/volumes/api/kong.yml
并向下滚动到显示"Protected Dashboard"的位置。删除整个- name: dashboard
部分。
此前,Kong 负责代理 http://<your-ip>:8000/
到 http://studio:3000/
,但我们并不希望通过 http://
2.3 将 nginx 和 authelia 添加到 Supabase 编排清单
由于我在服务器上已经安装了 1Panel 面板,该面板下已经集成了OpenResty(基于 NGINX 和 LuaJIT 的 Web 平台),所以这一步会演示如何加入nginx到supabase的docker-compose.yml,后续步骤我将使用OpenResty作为反向代理,这与使用nginx配置方式基本一致。
在 docker-compose.yml
文件中定位到顶部的 services:
部分,添加 2 个新服务:authelia 和 nginx-proxy-manager。
PS:
如果只需通过 HTTPS + Basic Auth(完全足够)保护 Supabase 仪表盘,则无需添加 Authelia,后续所有 Authelia 配置步骤均可跳过(直接在 反向代理 中启用 Basic Auth 即可)。但如果需要更灵活的身份验证(如多因素认证),则 Authelia 是更好的选择!
以下是为 docker-compose.yml
添加这两个服务的配置示例:
authelia:
container_name: authelia
image: authelia/authelia
restart: unless-stopped
expose:
- 9091
volumes:
- ./authelia/config:/config
environment:
TZ: 'Europe/Berlin'
nginx:
image: 'jc21/nginx-proxy-manager:latest'
restart: unless-stopped
ports:
# These ports are in format <host-port>:<container-port>
- '80:80' # Public HTTP Port
- '443:443' # Public HTTPS Port
- '81:81' # Admin Web Port
volumes:
- ./nginx-data:/data
- ./nginx-letsencrypt:/etc/letsencrypt
- ./nginx-snippets:/snippets:ro
environment:
TZ: 'Europe/Berlin'
接下来我们继续完成 Supabase 配置,稍后将配置 authelia。
3️⃣ 自定义S3:配置腾讯云COS对象存储
继续编辑docker-compose.yml
,定位到storage下的environment部分。
storage:
environment:
# ...other definitions
STORAGE_BACKEND: s3 # 存储服务类型(保持 S3 协议)
TENANT_ID: stub
REGION: <region> # 替换为腾讯云 COS 的区域
GLOBAL_S3_BUCKET: <your-bucket-name> # 替换为你的 COS 桶名称
GLOBAL_S3_ENDPOINT: cos.<region>.myqcloud.com # 替换为腾讯云 COS 的 Endpoint
# GLOBAL_S3_PROTOCOL: https
# AWS_DEFAULT_REGION: stub
GLOBAL_S3_FORCE_PATH_STYLE: true # 腾讯云 COS 需要启用路径风格
AWS_ACCESS_KEY_ID: <your-secret-id> # 替换为腾讯云的 SecretId
AWS_SECRET_ACCESS_KEY: <your-secret-key> # 替换为腾讯云的 SecretKey
更详细教程请移步:自托管的Supabase如何集成腾讯云COS对象存储?
4️⃣ 配置.env
4.1 配置安全密钥
虽然supabase配置文件.env
中提供了一些示例密钥,但绝不能使用这些默认配置来部署 Supabase 。因此需照下面的所有步骤确保supabase服务安全。
-
修改
POSTGRES_PASSWORD=some-very-complicated-database-password
,设置 Postgres 数据库的密码 -
生成并配置随机JWT_SECRET=...,执行命令
node -e "console.log(require('crypto').randomBytes(32).toString('hex'))"
-
使用supabase.com上的自托管指南(https://supabase.com/docs/guides/self-hosting/docker#generate-api-keys )来生成ANON_KEY= 和 SERVICE_ROLE_KEY= ,通过填入 上一步的JWT_SECRET 获取。
-
配置
LOGFLARE_LOGGER_BACKEND_API_KEY=
和LOGFLARE_API_KEY=
(用同一个key填入即可)
4.2 配置 Studio 和 API地址:
-
设置
API_EXTERNAL_URL=your-api.yourdomain.com
,主要用于服务端内部通讯,指定 Supabase API 的外部可访问地址。 -
设置
SUPABASE_PUBLIC_URL=your-api.yourdomain.com
,这是客户端(如浏览器或移动应用)访问 Supabase 服务的主要公共 URL。
4.3 配置前端地址
SITE_URL
通常用于 指定前端应用的根地址,尤其是在涉及用户身份验证(如密码重置、邮件确认)和生成面向用户的链接时。它与 SUPABASE_PUBLIC_URL 有部分重叠,但场景更聚焦于 用户交互和重定向。
SITE_URL=https://app.yourdomain.com
# use whatever additional urls you need
ADDITIONAL_REDIRECT_URLS=http://localhost:3000,http://localhost:6000
配置邮件SMTP服务:
# 邮件认证配置
ENABLE_EMAIL_SIGNUP=true # 启用邮件注册
ENABLE_EMAIL_AUTOCONFIRM=false # 禁用自动确认邮件
SMTP_ADMIN_EMAIL= # 管理员邮箱
SMTP_HOST=smtp.feishu.cn # SMTP 服务器地址
SMTP_PORT=465 # SMTP 端口
SMTP_USER= # SMTP 用户名
SMTP_PASS= # SMTP 密码
SMTP_SENDER_NAME= # 发件人名称
5️⃣ 启动 Supabase
上面步骤完成了整个Supabase的配置部分,并且我们删除了 Supabases 默认的安全漏洞,所以我们现在可以启动所有容器:
# 使用自动初始化脚本(首次运行)
docker compose -f docker-compose.yml up
# 或手动初始化(推荐生产环境)
docker compose pull
docker compose up -d
注意: 第一次运行时,可能需要等待一会儿,确保所有服务启动成功。
所有服务启动后,通过docker compose ps
查看这些服务在后台的运行状态,所有服务都应有状态running (healthy)。如果您看到的状态为created但不是running,请尝试使用 手动启动该服务docker compose start
如果你的服务器 性能较低,可以 按顺序分批启动,避免系统崩溃:
# 1️⃣ 启动数据库(核心依赖)
docker compose up -d db supavisor
sleep 5
# 2️⃣ 启动 API 服务(身份认证 & API 访问)
docker compose up -d auth rest meta
sleep 5
# 3️⃣ 启动代理 & 网关
docker compose up -d kong functions
sleep 5
# 4️⃣ 启动业务功能
docker compose up -d storage realtime analytics
sleep 5
# 5️⃣ 启动日志收集 & 其他
docker compose up -d vector imgproxy studio
如果服务器资源不足 → 增加 Swap 或者限制 analytics 容器内存,可以先运行 dmesg | grep -i "killed process"
看看是不是 OOM(内存溢出)
增加 Swap(如果服务器内存小于 4GB,建议增加 Swap):
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
6️⃣ 通过反向代理拆分不同服务
以上容器都启动后,此时还无法访问Supabase服务。我们可以通过(Nginx/OpenResty)将 Supabase 的不同服务映射到不同的子域,确保数据库、存储、认证等服务不会直接暴露。
6.1 推荐的子域划分
服务 | 作用 | 端口 | 推荐子域 |
---|---|---|---|
Supabase Studio | 可视化Supabase管理后台 | studio:3000 | studio.example.com |
API Gateway | GraphQL & REST API | kong:8000 | api.example.com |
Postgres 数据库 | 数据存储 | 5432 | 仅内网访问 |
6.3 Basic Auth
烂尾了:https://blog.activeno.de/the-ultimate-supabase-self-hosting-guide