supabase私有化部署

January 3, 2025

Supabase 私有化部署官方文档中存在一些小的问题,包括:

  • 一些细节的说明。比如如何增加Provider等,需要了解 supabase/auth 项目的细节才能知道如何去修改配置。
  • Supbase 模块太多,一些不太常用的模块都集成在了 docker-compose.yml 中。

之前在项目中有使用官方提供的supbase托管,但是外网等原因使用起来不太方便,于是决定自己部署。自部署的版本在多租户、容灾能力上等与官方版本有所差异,但是Auth、Rest等基础能力基本上并没有差异,对于小型项目来说足够使用了。

整体部署流程大致如下:

  1. 编辑 docker-compose.yml ,去掉部分不需要的模块。
  2. 配置 env file:
    1. Auth:根据项目需要,配置基础地址、callback地址以及Provider等。
    2. Email:邮件服务相关配置,用于邮箱认证等。
  3. 运行docker: docker compose up -d ,本地测试管理台、DB、API可用性。
  4. Release环境部署。包括域名、证书、服务器等。

项目代码已经存放在此:

模块选择

Supabase当前官方docker file中包括以下模块:

ModulePortContainerImage简介Routes
studio3000supabase-studiosupabase/studio管理台/* -> http://studio:3000/*
kong - ${KONG_HTTP_PORT}:8000/tcp - ${KONG_HTTPS_PORT}:8443/tcpsupabase-kongkong:2.8.1反向代理 
authGOTRUE_API_PORT: 9999supabase-authsupabase/gotrue认证及用户管理http://auth:9999/verify http://auth:9999/callback http://auth:9999/authorize /auth/v1/* -> http://auth:9999/*
restPostREST默认监听端口为3000supabase-restpostgrest/postgrestrest/graphQL API/rest/v1/* -> http://rest:3000/* /graphql/v1/* -> http://rest:3000/rpc/graphql
realtimePORT: 4000 supabase/realtimeRealTime服务/realtime/v1/* -> ws://realtime:4000/socket/* /realtime/v1/* -> ws://realtime:4000/socket/
storage5000? supabase/storage-apiStorage服务,可用minio代替/storage/v1/* -> http://storage:5000/*
imgproxy5001 darthsim/imgproxy图片处理 
meta8080supabase-metasupabase/postgres-metapg的meta服务,管理台使用/pg/* -> http://pg-meta:8080/*
functions9000 supabase/edge-runtimeFunction服务/functions/v1/* -> http://functions:9000/
analytics4000  PG/analytics/v1/* -> http://logflare:4000/*
db5432 supabase/postgresDB 
vector timberio/vector向量服务,同时也用于日志处理 
supavisor  supabase/supavisorPG的连接池 

个人在项目中去掉了以下几个模块:

  • Realtime:websocket服务,暂时没有需要。而且ws对端口的资源消耗比较大,在大业务场景应该和API隔离。
  • Storage:更加倾向于使用外部CDN。包括imageProxy应该使用专用的图片处理服务。
  • Functions:函数服务。暂无使用场景。

保留的模块:

  • kong:反向代理,必须。
  • studio:管理台,用于管理各模块,包括DB interface、日志等。
  • auth:Supabase的用于认证模块
  • db:postgres,必须。
  • meta:为管理台提供db的meta信息。
  • log(analyze):日志服务,用于定位服务、接口访问异常。
  • vector:向量服务,同时也服务supabase各模块的日志处理。如果无日志要求可以去掉。
  • supavisor:Supabase提供的pg向量池服务。是否可以去掉待确定。

Auth

URL Configuration

对应supabase官网项目中的URL配置:

SiteURL

使用supabase认证的应用地址,具有唯一性。配置方式:

Loading...

可见supabase/auth更推荐的方式是作为公共服务,而非为单个应用部署。此配置有两个作用:

  1. 认证邮件拼接supabase/auth signup、invite等邮件模板中有使用siteurl作为变量,引导用户点击确认。
Loading...
  1. authorize后的默认callback地址:可以被callback参数覆盖。
Loading...

Redirect URLs

URI为supabase/auth服务端的地址白名单,支持多个白名单地址,格式为 https://foo.example.com,https://*.foo.example.com,https://bar.example.com

此地址的目的与OAuth流程中的auth.callback参数类似,具体原理参考我之前的文章

配置格式:

Loading...

Provider

self-hosting时,studio上没有放开provider的配置入口,只能通过后台配置。在 docker-compose.yml 的auth服务中增加对应的provider配置:

Loading...

Github

以github为例,增加github对应的provider:

Loading...

配置完毕后可以通过API进行验证对应的配置是否准确。

Loading...

Email Settings

Recovery Temlate

supabase/auth 默认的邮件模板不论是功能还是样式上都不太满足需求,所以此处修改对应的邮件模板。此功能与官网上的Email Template配置相同。

以 reset password 场景为例,介绍如何修改默认邮件模板。

默认模板:

Loading...

修改方法:将模板内容放到外部链接,并修改auth对应的环境变量指向外部链接即可。

Loading...

模板内容参考

Loading...

注意:与官方模板不同的是跳转地址的配置,业务关系使用了个人nextjs项目的一个通用callback action来实现code to session的转换及cookie的下发。具体代码可以参考这里

SMTP Setting

配置邮件服务器信息,主要用于邮件相关的认证,包括邮箱注册、密码找回登。

主要参数包括:

Loading...

个人使用的腾讯云的邮件推送服务。有一定的免费额度。

其他

SSL

参考项目中的配置。推荐使用 acme.sh 生成免费证书,并自动续期。生成及自动续期大致代码如下:

Loading...

总结

个人在腾讯云的一台轻量服务器上部署了一次,整体流程还是比较简单的。建议服务器选择海外机房,因为docker国内镜像下载太麻烦了。

See all postsSee all posts