Supapool: 병렬 코딩 에이전트를 위한 일시적인 Supabase 인스턴스
Supapool은 개발자와 AI 에이전트가 약 400ms 안에 깨끗하고 격리된 Supabase 인스턴스를 임대할 수 있게 합니다. 이를 통해 목업이나 느린 데이터베이스 브랜칭이 필요 없으며, 병렬 코딩 에이전트가 실제 Supabase 스택에 대해 마이그레이션을 실행하고 데이터베이스 작업을 수행하면서 서로 간섭하지 않도록 보장합니다.
격리된 Supabase 스택의 빠른 배포
Supapool은 Postgres, Auth, S3 호환 스토리지를 포함한 실제 Supabase 환경을 제공하며, 에이전트가 작업을 실행하는 위치와 가깝게 배치됩니다. 초기화에 몇 분이 걸리고 프로덕션 수준의 비용이 발생할 수 있는 일반적인 데이터베이스 브랜칭과 달리, Supapool 인스턴스는 일시적이며 고속 획득을 위해 설계되었습니다.
Key technical advantages include:
- Zero Collision: 병렬 에이전트가 완전히 별개의 인스턴스에서 동작하여 실행 중에 서로의 데이터를 삭제하는 것을 방지합니다.
- No Mocks: 실제 스택을 대상으로 테스트가 진행되어 마이그레이션 및 데이터베이스 작업이 실제 Supabase 인프라에 대해 검증됩니다.
- Colocation: 인스턴스가 에이전트 실행 환경 근처에서 생성되어 지연 시간을 최소화합니다.
- Agent-First Design: 이 플랫폼은 대시보드 없이 CLI 전용이며, 계정, 사용량 및 비용을 API를 통해 자동화 시스템에 직접 파이프할 수 있습니다.
CLI 통합 및 워크플로우
Supapool은 주로 @supapool/cli 패키지를 통해 관리됩니다. 핵심 워크플로우는 기존 명령을 래핑하여 임시 환경을 주입하는 것입니다.
명령 실행
run 명령을 사용하면 Supapool이 인스턴스를 임대하고 래핑된 명령의 환경 변수에 필요한 자격 증명을 주입합니다:
npx @supapool/cli run -- npm run dev
run이 실행될 때, CLI는 다음 순서를 수행합니다:
- 깨끗한 인스턴스를 획득합니다.
supabase/migrations에서 찾은 모든.sql파일을 파일명 순서대로 적용합니다.- 인스턴스 자격 증명을 환경에 포함시켜 명령을 시작합니다.
- 명령이 활성 상태인 동안 임대를 갱신합니다.
- 명령이 종료되면 인스턴스를 해제합니다.
환경 변수 주입
래핑된 명령은 SUPABASE_URL, SUPABASE_ANON_KEY, SUPABASE_SERVICE_ROLE_KEY, DATABASE_URL 등 표준 Supabase 변수를 받습니다. 다양한 프레임워크와의 호환성을 보장하기 위해, 이러한 값들은 Next.js, Vite, Astro, Svelte, Expo, Create React App, Gatsby, Nuxt에서 사용되는 일반적인 공개 접두사와 Prisma 및 Postgres URL 별칭에도 동일하게 매핑됩니다.
임대 관리 및 수명 주기
모든 Supapool 인스턴스는 기본 TTL(Time-to-Live)이 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를 활용하여 맞춤형 임대 경계 관리를 할 수 있습니다.