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名称镜像仓库简介
1supabase-vectortimberio/vector第三方用于使用 Postgres 和 pgvector 开发 AI 应用程序。使用 Supabase 客户端库可大规模地存储、索引和查询向量嵌入。
2supabase-imgproxydarthsim/imgproxy第三方图片代理服务。supabase官方有仓库,但看本地镜像应该是使用imgproxy的官方镜像。
3supabase-dbsupabase/postgressupabase/postgres基于Postgres增加了部分插件
4supabase-analyticssupabase/logflareunknown为supabase本地部署时提供的日志、统计服务。基于supabase收购后的logflare实现。没有找到相关仓库。
5supabase-edge-functionssupabase/edge-runtimesupabase/edge-runtimesupabase提供的边缘函数服务
6supabase-restpostgrest/postgrest第三方使用postgrest提供基于PG的基础CRUD web服务。
7supabase-metasupabase-metasupabase/postgres-metaPostgres数据库管理相关服务,包括表结构管理、添加用户角色和执行查询等
8supabase-studiosupabase/studiosupabase/studiosupabase管理台。
9supabase-kongkong:2.8.1第三方kong的官方镜像即可。
10realtime-dev.supabase-realtimesupabase/realtime:v2.25.35supabase/realtimesupabase提供的websocket服务,支持广播推送、数据共享以及Postgres数据变更监听能力
11supabase-authsupabase/gotrue:v2.125.1supabase/gotruesupabase的身份认证和用户管理服务
12supabase-storagsupabase/storage-apisupabase/storage后台基于S3的存储服务

supabase-kong

各服务(包括管理台)的接入网关,唯一的对外入口。

  • 镜像: kong
Loading...
  • 通过kong的网关路由配置,可以看到各service的具体配置。后续可以考虑把kongka安装上,更方便kong的配置管理。

supabase-db

Postgres数据库,supabase在postgres DB上做了一些扩展,为各服务提供存储。

  • 仓库地址。只是在Postgres数据库增加了一些插件。而非修改Postgres,仅提供一键式安装的最常用扩展。
Loading...

注意数据有通过volumn映射到本地。

supabase-storage

为supabase提供存储服务。使用s3作为后端存储provider、使用Postgres存储元数据。

  • 服务架构和实现见 https://github.com/supabase/storage。
  • 注意docker-compose中默认使用了 file 作为后端存储。如果要使用S3、Minio参考官方配置,使用environment覆盖即可。不知国内的兼容s3的产品是否可以替代(如阿里云的OSS)
Loading...

supabase-auth

一个go版本的身份认证和用户管理服务,主要用来提供各类账号(Mail、phone、Google, Apple, Facebook, Discor等)的登录以及 jwt token校验能力。

定位应该类似于dexide/dex等OIDC产品。

  • 仓库地址,采用纯go实现。docker中监听端口9999.
Loading...

还有大量Auth Provider、mail、captcha、phone相关配置详见auth仓库中的说明。

supabase-realtime

一个使用Elixir语言框架构建的ws服务器,支持广播(向客户端推送消息)、数据共享(如终端协同场景)以及Postgres数据变更监听能力。

Loading...

supabase-rest

使用PostREST提供基于PG的基础CRUD web服务。

  • 直接使用了PostREST的镜像,同时也被storage依赖。PostREST默认监听端口为3000。
  • 同时提供了Restful和GraphQL的接口给到外部。详见kong相关配置
Loading...

supabase-meta

采用Typescript实现的Postgres数据库管理相关服务,包括表结构管理、添加用户角色和执行查询等。

  • https://github.com/supabase/postgres-meta: 该服务器是一个轻量级的连接池器,可将Postgres系统目录规范化成更易读的格式。该服务器支持多租户,因此可以从单个服务器上支持多个Postgres数据库。服务不提供任何安全措施。请勿将其用作独立服务器。应在受信任的环境中将其用作代理服务器,或仅在本地机器上使用,或仅在无外部访问权限的情况下内部使用。
  • 默认监听端口8080。
  • 仅依赖Postgres DB,且被supabase管理台依赖(需要操作表接口,执行sql等)。
Loading...

supabase-studio

管理系统,基于Next、Tailwind、supabase UI实现。

  • 依赖supabase-meta(读取表结构等)和Postgres。
  • 外网使用部署需要替换 SUPABASE_PUBLIC_URL 地址
Loading...

supabase-edge-functions

supabase提供的边缘函数服务。

  • 基于Deno runtime,支持运行js、ts以及wasm。
  • 本地默认监听端口9000
Loading...

supabase-analytics:

为supabase本地部署时提供的日志、统计服务。基于supabase收购后的logflare实现。本地部署时使用Postgres作为后端存储。

  • Auth、PostREST、Storage等服务通过analytics将相关操作日志记录到db,供管理台查询等使用。
  • 默认监听端口4000,相关文档地址
Loading...

supabase-imgproxy

图片代理服务。反代真正的图片地址,当请求图片的时候,请求的是imgproxy的图片地址,然后imgproxy再去请求原始图片,将其转换为要求的尺寸和格式以后,再发送给用户。除了这些以外,imgproxy还可以对原始图片进行模糊化、旋转、亮度调节、加水印等很多功能,具体可以去看官方的文档说明。

Loading...

supabase-vector

用于使用 Postgres 和 pgvector 开发 AI 应用程序。使用 Supabase 客户端库可大规模地存储、索引和查询向量嵌入。

  • 本地部署时貌似还没有使用?
Loading...

部署

docker部署方式,详见官方文档

Loading...

env配置文件

各配置项的具体定义要结合docker-compose具体来看,涉及项目比较多,就不一一看了。

Loading...
See all postsSee all posts