supabase 架构分析
December 28, 2023
Firebase是一家典型的BaaS公司,它可以帮助手机以及网页应用的开发者轻松构建App。通过Firebase的框架就可以简单地开发一个App,无需服务器以及基础设施,简单来说,它就是一整套的解决方案。
Supabase 是一个开源的 Firebase 替代方案。官方表示,其正在使用企业级开源工具构建 Firebase 的功能。Supabase 可以:
- 监听数据库的变化。
- 查询你的表,包括过滤、分页和深度嵌套关系(如GraphQL)。
- 创建、更新和删除行。
- 管理你的用户和他们的权限。
- 使用一个简单的用户界面与你的数据库进行交互
本文通过从本地部署方案大致分析其整体架构。
简介
Supabase的定位为Firebase的开源替代,围绕 PostgreSQL 组合了一系列的开源工具,用以实现 BaaS 所需的用户认证、实时数据库、对象存储、RESTAPI 接口等功能。在整合这些工具的同时,为开发者封装了统一的 SDK,方便开发者以统一的方式调用这些能力。官方提供了 JavaScript 和 Flutter 的 SDK,社区贡献了 Python、C#、Swift、Kotlin 的 SDK,开发者在开发移动端和 web 应用时,可以很方便的调用 Supabase 提供的后端能力。
整体架构图:
Supabase 的几个核心服务
- Postgrest:直接使用了开源服务,可以直接通过 HTTP 接口操作Postgres数据库,同时支持Restful和GraphpQL两种协议。
- Storage API:提供对象存储功能,解决开发者需要上传、下载文件的需求。后端将数据存储在 S3 存储上,也支持minio(兼容S3)以及本地文件。
- gotrue:用户登录认证模块,帮助用户简化其应用的用户管理。允许开发者使用邮箱、手机号进行注册、登录模块的开发,也可以通过 OAuth 协议接入 github、google、apple 等平台的账号。
- realtime:realtime 利用 postgresql 的 listen/notify 机制,实现了 postgres 数据库实时数据变更通知能力。
- studio:管理台面板,为gotrue、DB、anaylist提供管理入口。
架构分析
Supabase支持本地容器化部署,docker-compose中共有12个容器,从中可以分析出大致的架构。
Seq | 名称 | 镜像 | 仓库 | 简介 |
1 | supabase-vector | timberio/vector | 第三方 | 用于使用 Postgres 和 pgvector 开发 AI 应用程序。使用 Supabase 客户端库可大规模地存储、索引和查询向量嵌入。 |
2 | supabase-imgproxy | darthsim/imgproxy | 第三方 | 图片代理服务。supabase官方有仓库,但看本地镜像应该是使用imgproxy的官方镜像。 |
3 | supabase-db | supabase/postgres | supabase/postgres | 基于Postgres增加了部分插件 |
4 | supabase-analytics | supabase/logflare | unknown | 为supabase本地部署时提供的日志、统计服务。基于supabase收购后的logflare实现。没有找到相关仓库。 |
5 | supabase-edge-functions | supabase/edge-runtime | supabase/edge-runtime | supabase提供的边缘函数服务 |
6 | supabase-rest | postgrest/postgrest | 第三方 | 使用postgrest提供基于PG的基础CRUD web服务。 |
7 | supabase-meta | supabase-meta | supabase/postgres-meta | Postgres数据库管理相关服务,包括表结构管理、添加用户角色和执行查询等 |
8 | supabase-studio | supabase/studio | supabase/studio | supabase管理台。 |
9 | supabase-kong | kong:2.8.1 | 第三方 | kong的官方镜像即可。 |
10 | realtime-dev.supabase-realtime | supabase/realtime:v2.25.35 | supabase/realtime | supabase提供的websocket服务,支持广播推送、数据共享以及Postgres数据变更监听能力 |
11 | supabase-auth | supabase/gotrue:v2.125.1 | supabase/gotrue | supabase的身份认证和用户管理服务 |
12 | supabase-storag | supabase/storage-api | supabase/storage | 后台基于S3的存储服务 |
supabase-kong
各服务(包括管理台)的接入网关,唯一的对外入口。
- 镜像: kong
- 通过kong的网关路由配置,可以看到各service的具体配置。后续可以考虑把kongka安装上,更方便kong的配置管理。
supabase-db
Postgres数据库,supabase在postgres DB上做了一些扩展,为各服务提供存储。
- 仓库地址。只是在Postgres数据库增加了一些插件。而非修改Postgres,仅提供一键式安装的最常用扩展。
注意数据有通过volumn映射到本地。
supabase-storage
为supabase提供存储服务。使用s3作为后端存储provider、使用Postgres存储元数据。
- 服务架构和实现见 https://github.com/supabase/storage。
- 注意docker-compose中默认使用了 file 作为后端存储。如果要使用S3、Minio参考官方配置,使用environment覆盖即可。不知国内的兼容s3的产品是否可以替代(如阿里云的OSS)
supabase-auth
一个go版本的身份认证和用户管理服务,主要用来提供各类账号(Mail、phone、Google, Apple, Facebook, Discor等)的登录以及 jwt token校验能力。
定位应该类似于dexide/dex等OIDC产品。
- 仓库地址,采用纯go实现。docker中监听端口9999.
还有大量Auth Provider、mail、captcha、phone相关配置详见auth仓库中的说明。
supabase-realtime
一个使用Elixir语言框架构建的ws服务器,支持广播(向客户端推送消息)、数据共享(如终端协同场景)以及Postgres数据变更监听能力。
supabase-rest
使用PostREST提供基于PG的基础CRUD web服务。
- 直接使用了PostREST的镜像,同时也被storage依赖。PostREST默认监听端口为3000。
- 同时提供了Restful和GraphQL的接口给到外部。详见kong相关配置
supabase-meta
采用Typescript实现的Postgres数据库管理相关服务,包括表结构管理、添加用户角色和执行查询等。
- https://github.com/supabase/postgres-meta: 该服务器是一个轻量级的连接池器,可将Postgres系统目录规范化成更易读的格式。该服务器支持多租户,因此可以从单个服务器上支持多个Postgres数据库。服务不提供任何安全措施。请勿将其用作独立服务器。应在受信任的环境中将其用作代理服务器,或仅在本地机器上使用,或仅在无外部访问权限的情况下内部使用。
- 默认监听端口8080。
- 仅依赖Postgres DB,且被supabase管理台依赖(需要操作表接口,执行sql等)。
supabase-studio
管理系统,基于Next、Tailwind、supabase UI实现。
- 依赖supabase-meta(读取表结构等)和Postgres。
- 外网使用部署需要替换 SUPABASE_PUBLIC_URL 地址
supabase-edge-functions
supabase提供的边缘函数服务。
- 基于Deno runtime,支持运行js、ts以及wasm。
- 本地默认监听端口9000
supabase-analytics:
为supabase本地部署时提供的日志、统计服务。基于supabase收购后的logflare实现。本地部署时使用Postgres作为后端存储。
- Auth、PostREST、Storage等服务通过analytics将相关操作日志记录到db,供管理台查询等使用。
- 默认监听端口4000,相关文档地址。
supabase-imgproxy
图片代理服务。反代真正的图片地址,当请求图片的时候,请求的是imgproxy的图片地址,然后imgproxy再去请求原始图片,将其转换为要求的尺寸和格式以后,再发送给用户。除了这些以外,imgproxy还可以对原始图片进行模糊化、旋转、亮度调节、加水印等很多功能,具体可以去看官方的文档说明。
- supabase官方有仓库 https://github.com/supabase/imgproxy,但看本地镜像应该是使用imgproxy的官方镜像。
- kong中没有暴露外部接口,仅storage有依赖。应该是storage用来处理图片
supabase-vector
用于使用 Postgres 和 pgvector 开发 AI 应用程序。使用 Supabase 客户端库可大规模地存储、索引和查询向量嵌入。
- 本地部署时貌似还没有使用?
部署
docker部署方式,详见官方文档。
env配置文件
各配置项的具体定义要结合docker-compose具体来看,涉及项目比较多,就不一一看了。