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 按以下顺序操作:
- 获取一个干净的实例。
- 按文件名顺序应用
supabase/migrations中找到的所有.sql文件。 - 使用实例凭证启动命令并将其置于环境中。
- 在命令保持活跃期间续租。
- 命令退出时释放实例。
环境变量注入
包装的命令会收到标准的 Supabase 变量,包括 SUPABASE_URL、SUPABASE_ANON_KEY、SUPABASE_SERVICE_ROLE_KEY 和 DATABASE_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
})
高级用户可以使用导出的生命周期原语 acquire、renew、release 和 startRenewer 来进行自定义租约边界管理。