Supapool:用于并行编码代理的临时 Supabase 实例

快速部署隔离的 Supabase 堆栈

Supapool 提供真实的 Supabase 环境——包括 Postgres、Auth 和兼容 S3 的存储——并与代理执行工作的地点紧密共置。不同于标准的数据库分支,需要数分钟才能初始化并产生生产级计费,Supapool 实例是临时的,旨在实现高速获取。

关键技术优势包括:

  • 零冲突: 并行代理在完全独立的实例中运行,防止它们在运行过程中相互清除数据。
  • 无 Mock: 测试在真实堆栈上进行,确保迁移和数据库操作在实际 Supabase 基础设施上得到验证。
  • 共置: 实例在靠近代理执行环境的地方启动,以最小化延迟。
  • 以代理为先的设计: 平台仅提供 CLI,没有仪表盘,允许账户、使用情况和费用直接通过 API 输送到自动化系统中。

CLI 集成与工作流

Supapool 主要通过 @supapool/cli 包进行管理。核心工作流涉及包装现有命令以注入临时环境。

命令执行

使用 run 命令,Supapool 租用一个实例,并将必要的凭证注入到包装命令的环境变量中:

npx @supapool/cli run -- npm run dev

当执行 run 时,CLI 按以下顺序操作:

  1. 获取一个干净的实例。
  2. 按文件名顺序应用 supabase/migrations 中找到的所有 .sql 文件。
  3. 使用实例凭证启动命令并将其置于环境中。
  4. 在命令保持活跃期间续租。
  5. 命令退出时释放实例。

环境变量注入

包装的命令会收到标准的 Supabase 变量,包括 SUPABASE_URLSUPABASE_ANON_KEYSUPABASE_SERVICE_ROLE_KEYDATABASE_URL。为确保与各种框架的兼容性,这些值会映射到 Next.js、Vite、Astro、Svelte、Expo、Create React App、Gatsby、Nuxt 以及 Prisma 和 Postgres URL 别名常用的公共前缀。

租约管理与生命周期

每个 Supapool 实例都是一个租约,默认的生存时间(TTL)为 30 分钟。CLI 会在进程活跃时每 5 分钟自动续租。如果进程终止或续租心跳停止,租约将到期,实例会被清除并返回到池中。

由于实例是一次性的,租约释放后不会保留任何数据。

CI/CD 与编程访问

Supapool 通过 SUPAPOOL_API_KEY 环境变量支持自动化环境。在 CI 环境中,用户可以从 ~/.config/supapool/config.json 复制其 API 密钥,并将其设为密钥,以绕过基于浏览器的 GitHub 登录。

SUPAPOOL_API_KEY=sp_live_... npx @supapool/cli run -- pnpm test

对于需要更深度集成的开发者,可以将 @supapool/cli npm 包作为库使用。withInstance 函数会自动管理租约生命周期:

import { withInstance } from '@supapool/cli'

await withInstance(async (instance) => {
  const { SUPABASE_URL, SUPABASE_ANON_KEY, DATABASE_URL } = instance.env
  // execute tests or seed data
})

高级用户可以使用导出的生命周期原语 acquirerenewreleasestartRenewer 来进行自定义租约边界管理。

Sources