The golden gate bridge spans a bay.

完整指南⚡️ Supabase 自托管 ➕ 集成腾讯云COS ➕ Authelia身份验证

内容纲要

在supabase官方提供的自托管方案中,所有服务都是通过同一端口(8000)暴露出来的,例如访问 Supabase Studio:http://:8000,这样部署在 生产环境 下是不安全的。为了提升安全性,本教材将介绍如何在生产环境下 使用 反向代理层 + 身份验证层(Authelia)来增强安全性,并且集成腾讯云 COS 作为对象存储。

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:部分:
file

2.2 不要将 Supabase Studio(仪表板)暴露在 API Gateway (Kong) 上

转到docker/volumes/api/kong.yml并向下滚动到显示"Protected Dashboard"的位置。删除整个- name: dashboard部分。
file
此前,Kong 负责代理 http://<your-ip>:8000/ http://studio:3000/ ,但我们并不希望通过 http://:8000/ 就能直接访问 Supabase Studio。

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服务安全。

  1. 修改 POSTGRES_PASSWORD=some-very-complicated-database-password ,设置 Postgres 数据库的密码

  2. 生成并配置随机JWT_SECRET=...,执行命令 node -e "console.log(require('crypto').randomBytes(32).toString('hex'))"

  3. 使用supabase.com上的自托管指南(https://supabase.com/docs/guides/self-hosting/docker#generate-api-keys )来生成ANON_KEY= 和 SERVICE_ROLE_KEY= ,通过填入 上一步的JWT_SECRET 获取。

  4. 配置 LOGFLARE_LOGGER_BACKEND_API_KEY=LOGFLARE_API_KEY=(用同一个key填入即可)

4.2 配置 Studio 和 API地址:

  1. 设置API_EXTERNAL_URL=your-api.yourdomain.com,主要用于服务端内部通讯,指定 Supabase API 的外部可访问地址。

  2. 设置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 。如果某容器显示类似 Restarted X Seconds ago 信息,则很可能发生了故障。

如果你的服务器 性能较低,可以 按顺序分批启动,避免系统崩溃:

# 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