콘텐츠로 건너뛰기
supastack
문서 둘러보기
웹Next.js

For AI agents: fetch the complete documentation index at /llms.txt, the full documentation corpus at /llms-full.txt, the agent skill at /skill.md, or this page as Markdown at /ko/docs/web/provider-keys.md (or send Accept: text/markdown).

나머지 공급자 키 수집

남은 서비스를 위한 짧은 연습: AI 공급자, Trigger.dev, S3 스토리지, Sentry 또는 PostHog, Turnstile, 그리고 자체 도메인.

이 가이드에 대해 질문하기
다음에서 열기

이 페이지 사용법

아래 각 섹션은 하나의 완전한 설정 연습입니다: 계정을 만들고, 키를 찾고, env 이름을 설정하고, 확인합니다. 제품이 출시하는 서비스의 섹션만 가져가세요—AI 기능이 없는 사이트는 첫 번째가 필요 없으며 여기의 모든 섹션을 건너뛰어도 킷은 계속 실행됩니다.

어디서나 동일한 시크릿 규칙입니다: API 키와 webhook 시크릿은 서버 전용이고 NEXT_PUBLIC_/EXPO_PUBLIC_ 접두사가 붙은 값만 클라이언트에 도달할 수 있으며 프로덕션 시크릿은 호스트의 시크릿 저장소에 두고 개발 서버는 재시작 시에만 env를 다시 읽습니다.

AI 공급자 키

킷의 AI_PROVIDER는 openai, anthropic, openai-compatible, openrouter를 허용합니다—기본 로컬 대체인 fake도 포함합니다. 하나를 선택하세요. 공급자 키가 필요한 유일한 계정입니다. 모델 ID와 가격은 env 변수가 아닌 킷의 데이터베이스 카탈로그에서 오기 때문입니다.

OpenAI: platform.openai.com → API keys → Create new secret key → sk-… 복사 → OPENAI_API_KEY. Anthropic: console.anthropic.com → API Keys → Create Key → sk-ant-… → ANTHROPIC_API_KEY. 둘 다 토큰당 과금입니다—몇 달러의 크레딧이면 개발을 커버합니다.

OpenRouter는 모든 카탈로그 모델을 하나의 키로 라우팅합니다: openrouter.ai → Keys → Create Key → sk-or-… → AI_PROVIDER=openrouter와 OPENROUTER_API_KEY; 선택적 OPENROUTER_APP_NAME/OPENROUTER_SITE_URL은 어트리뷰션 헤더를 보냅니다. openai-compatible은 모든 OpenAI 형태의 엔드포인트를 커버합니다: OPENAI_COMPATIBLE_API_KEY와 OPENAI_COMPATIBLE_BASE_URL.

확인: 재시작하고 AI 작업을 하나 실행하여 결정론적 가짜 대신 실제 모델 응답을 기대합니다. 키를 지명하는 시작 오류는 키 없이 공급자 플래그가 켜져 있음을 의미합니다. 실제 응답에는 아래 Trigger.dev 섹션의 JOB_PROVIDER=trigger와 킷 카탈로그에서 활성화된 모델 하나도 필요합니다—AI 설정이 그 설정을 다룹니다.

# apps/web/.env.local — pick ONE provider
AI_PROVIDER=openai
OPENAI_API_KEY=sk-…

# or AI_PROVIDER=anthropic
# ANTHROPIC_API_KEY=sk-ant-…

# or AI_PROVIDER=openrouter
# OPENROUTER_API_KEY=sk-or-…

# or AI_PROVIDER=openai-compatible
# OPENAI_COMPATIBLE_API_KEY=…
# OPENAI_COMPATIBLE_BASE_URL=https://your-endpoint/v1

Trigger.dev

제품에 실제 백그라운드 작업 실행이 필요하지 않으면 건너뛰세요—JOB_PROVIDER=local은 작업을 실행하지 않고 메모리에 큐잉하여 개발에 적합합니다.

1. app.trigger.dev → 가입 → 프로젝트를 만듭니다.

2. 두 값을 복사합니다: 프로젝트 settings 또는 대시보드 URL의 프로젝트 ref proj_… → TRIGGER_PROJECT_REF, 프로젝트의 API keys 페이지의 시크릿 키(개발 환경은 tr_dev_…, 프로덕션은 tr_prod_…) → TRIGGER_SECRET_KEY. 둘 다 서버 전용입니다.

3. 킷의 작업은 이미 apps/web/trigger에 있고 apps/web/trigger.config.ts가 TRIGGER_PROJECT_REF를 읽습니다. apps/web에서 npx trigger.dev@latest dev를 실행합니다—작업을 프로젝트에 등록하고 개발 키로 로컬에서 실행합니다.

확인: dev 명령이 등록된 작업을 기록합니다. 앱에서 하나를 큐잉하고 대시보드의 Runs 목록에서 실행을 지켜보세요. 배포된 환경은 corepack pnpm --filter @supastack/web trigger:deploy를 실행하여 작업 세트를 게시합니다.

# apps/web/.env.local
JOB_PROVIDER=trigger
TRIGGER_PROJECT_REF=proj_…
TRIGGER_SECRET_KEY=tr_dev_…   # tr_prod_… in production

# run the worker alongside the app, from apps/web:
cd apps/web
npx trigger.dev@latest dev

S3 호환 스토리지(Cloudflare R2)

제품이 파일을 저장하지 않으면 건너뛰세요—STORAGE_PROVIDER=memory는 업로드를 개발용으로 프로세스 내에 유지합니다.

모든 S3 호환 버킷이 작동합니다. Cloudflare R2는 무료 등급에 적합한 선택입니다. 1. dash.cloudflare.com → R2 Object Storage → Create bucket을 열고 이름을 지정하고 기본 위치 힌트를 유지합니다.

2. R2 개요로 돌아가 Manage R2 API Tokens → Create API token → 권한 Object Read & Write, 해당 버킷으로 범위 지정 → Create. Access Key ID, Secret Access Key, 표시된 S3 엔드포인트—https://<account-id>.r2.cloudflarestorage.com—를 복사합니다.

3. 아래 env 이름을 설정합니다. STORAGE_REGION=auto는 R2 관례입니다—킷은 us-east-1을 기본값으로 하며 R2도 이를 허용합니다. STORAGE_FORCE_PATH_STYLE은 커스텀 엔드포인트에 이미 기본으로 켜져 있고 R2가 이를 원합니다. 공개 파일 제공에는 추가로 STORAGE_PUBLIC_BASE_URL 또는 CDN 연결이 필요하고 비공개 파일은 더 필요하지 않습니다.

확인: 재시작하고 앱을 통해 업로드합니다—R2 버킷 브라우저에 객체가 나타납니다. 서명 또는 403 오류는 해당 버킷에 대한 객체 읽기/쓰기가 없음을 의미합니다. 올바르게 범위가 지정된 새 토큰을 만드세요.

# apps/web/.env.local
STORAGE_PROVIDER=s3
STORAGE_ENDPOINT=https://<account-id>.r2.cloudflarestorage.com
STORAGE_REGION=auto
STORAGE_BUCKET=your-bucket
STORAGE_ACCESS_KEY_ID=…          # server-only
STORAGE_SECRET_ACCESS_KEY=…      # server-only
# STORAGE_PUBLIC_BASE_URL=       # optional public-URL base

Sentry 또는 PostHog(선택 사항)

전적으로 선택 사항입니다: 모든 옵저버빌리티 값은 기본으로 설정 해제되어 있고 킷은 없어도 잘 실행됩니다—프로덕션에서 오류 보고와 분석을 원할 때 추가하세요.

오류용 Sentry: sentry.io → 프로젝트 만들기 → Next.js 플랫폼 선택 → 설정 화면에 DSN https://…@….ingest.sentry.io/… 표시 → SENTRY_DSN. 그러면 예외가 상관관계 ID 태그와 함께 Sentry에 도달합니다. 무료 등급이면 시작하기에 충분합니다.

대신 제품 분석용 PostHog: posthog.com → 프로젝트 만들기 → 프로젝트 API 키 phc_… 복사 → NEXT_PUBLIC_POSTHOG_KEY와 NEXT_PUBLIC_POSTHOG_HOST(https://us.i.posthog.com 또는 EU 호스트). 이 두 개는 의도적으로 공개된 브라우저 값입니다. SENTRY_DSN은 서버 측에 둡니다. ALERT_WEBHOOK_URL은 선택적으로 실패 알림을 Slack 호환 엔드포인트에 게시합니다.

확인: 재시작하고 테스트 예외를 발생시키거나(Sentry의 샘플 이벤트 재생) 프로젝트의 Issues 목록에 도착하는지 확인합니다.

# apps/web/.env.local — all optional
SENTRY_DSN=https://…@….ingest.sentry.io/…

NEXT_PUBLIC_POSTHOG_KEY=phc_…
NEXT_PUBLIC_POSTHOG_HOST=https://us.i.posthog.com

# ALERT_WEBHOOK_URL=https://hooks.slack.com/services/…

Cloudflare Turnstile

공개 폼과 자격 증명 엔드포인트의 봇 보호—기본은 CAPTCHA_PROVIDER=off이므로 가입을 낯선 사람에게 열기 전에 추가하세요. 무료입니다.

1. dash.cloudflare.com → Turnstile → Add widget → 이름을 지정하고 호스트명을 나열합니다: 개발용 localhost와 실제 도메인 → Create.

2. 두 값을 모두 복사합니다: Site Key—의도적으로 공개되어 위젯 안에 렌더링됩니다 → NEXT_PUBLIC_TURNSTILE_SITE_KEY—와 서버가 확인에 사용하는 Secret Key → TURNSTILE_SECRET_KEY.

3. CAPTCHA_PROVIDER=turnstile이 켭니다. 어느 키가 누락되었든 지명하며 시작이 실패합니다. 캡차 가이드가 위젯이 보호하는 표면을 정확히 나열합니다.

확인: /auth 또는 문의 양식을 엽니다—위젯이 렌더링됩니다. 해결되지 않은 챌린지의 제출은 거부됩니다. 위젯이 전혀 로드되지 않으면 탐색 중인 호스트명이 위젯 목록에 없는 것입니다.

# apps/web/.env.local
CAPTCHA_PROVIDER=turnstile
NEXT_PUBLIC_TURNSTILE_SITE_KEY=0x…   # public by design
TURNSTILE_SECRET_KEY=0x…             # server-only

자체 도메인

모든 등록 기관에서 한 번 구매하면 됩니다—Cloudflare Registrar, Porkbun, Namecheap 모두 작동합니다. 여기서 env로 복사할 것은 없습니다. 도메인은 지금까지 구성한 Services ID, Resend DNS, Turnstile 호스트명, OAuth 리턴 URL에 나타납니다.

앱을 가리키는 두 가지 방법: Cloud Run의 경우 배포 가이드의 도메인 매핑을 사용합니다—몇 번의 콘솔 클릭과 Google이 나열하는 DNS 레코드입니다. 또는 DNS를 Cloudflare 네임서버로 옮깁니다(등록 기관이 두 레코드를 교체합니다)—선택 사항이지만 R2 공개 버킷과 Turnstile 호스트명을 한 곳에서 관리하는 깔끔한 방법이기도 합니다.

설정을 계속하려면 데이터베이스 설정 가이드를 읽어보세요.

자주 묻는 질문

질문 14개

supastack이란 무엇인가요?

supastack은 AI SaaS 제품을 구축하기 위한 모듈식 기반입니다. 공통 인프라를 모아두어 제품 고유의 기능에 집중할 수 있습니다.

웹과 모바일을 지원하나요?

네. supastack에는 웹과 모바일 경험의 출발점으로 Next.js 앱과 Expo 앱이 포함되어 있습니다.

어떤 인증이 포함되어 있나요?

Better Auth가 이메일/비밀번호, OTP, 소셜 로그인을 커버합니다. 개인 워크스페이스는 계정과 함께 프로비저닝되어 첫날부터 레코드가 경계 안에 유지됩니다.

AI는 어떻게 지원되나요?

supastack에는 구성 가능한 멀티 프로바이더 AI, 사용량 추적, 예산, 암호화된 자체 키(BYOK) 지원이 포함되어 있습니다.

구독은 어떻게 관리되나요?

이 키트 위에 구축된 제품에서는 Stripe 결제, 구독, 권한이 유료 액세스의 기반을 형성합니다. 프로바이더 시크릿은 서버 측에 유지됩니다.

제품 고유 코드는 어디에 두나요?

제품 고유 기능은 별도의 코드베이스에 두고, 제품이 supastack 기본 모듈을 구성하고 통합합니다.

supastack 가격은 어떻게 되나요?

키트는 평생 업데이트가 포함된 일회성 구매입니다: 단일 프레임워크 $249(기간 한정 출시 가격 — 정가 $349에서 $100 할인) 또는 모든 프레임워크(Next.js, iOS, Android) $499(기간 한정 출시 가격 — 정가 $599에서 $100 할인), 추가 개발자 시트당 $75. 키트 구독은 없습니다. 이 사이트의 체크아웃은 라이선스 키를 이메일로 전달하고 GitHub 초대로 리포지토리 액세스를 제공합니다.

워크스페이스는 내 데이터를 어떻게 경계 짓나요?

사용자 레코드는 workspaceId로 범위가 지정됩니다. 신원, 권한, AI 사용량, 결제 이벤트, 감사 항목은 개인 워크스페이스 경계 안에 유지됩니다.

백그라운드 작업은 어떻게 작동하나요?

Trigger.dev가 명시적인 작업 런타임입니다. JobRunner 계약은 enqueue, status, cancel만 약속하며 — 워크플로 의미는 Trigger.dev 고유이고 명시적입니다.

이메일과 아웃리치는 어떻게 다른가요?

트랜잭션 이메일은 작업 완료 알림 같은 제품 워크플로를 커버합니다. 콜드 아웃리치와 캠페인은 제품 자체에 속하며 이 키트의 이메일 모듈 밖입니다.

모바일 구매는 어떻게 작동하나요?

모바일은 RevenueCat 네이티브 구매와 복원을 지원하며 서버에서 접근 권한을 검증합니다. 출시 전에 스토어 계정을 설정하고 기기 테스트를 완료하세요. 웹 결제는 별도로 관리합니다.

AI 프로바이더 키는 어디에 있나요?

BYOK 자격 증명은 암호화되어 서버 측에 유지됩니다. 키는 로그에서 삭제되며, 사용량과 예산은 워크스페이스 수준에서 확인할 수 있습니다.

체크아웃에서 어떤 결제 수단을 지원하나요?

Stripe 호스팅 체크아웃은 카드를 받으며, Stripe 계정에서 지갑을 활성화하면 Alipay와 WeChat Pay도 제공할 수 있습니다 — 중국 구매자에게 유용합니다. 지갑 승인은 비동기로 확정되므로 결제가 완료되는 즉시 라이선스 페이지가 갱신됩니다.

환불을 받을 수 있나요?

저장소 접근 권한을 얻은 후에는 supastack이 영구적으로 귀하의 소유가 되므로 환불이 불가능합니다. 하지만 안심하세요. 평생 업데이트가 포함된 전체 소스 코드를 받아 자신이나 고객을 위한 제품을 무제한으로 구축하고 출시할 수 있습니다. 단, 코드를 재판매하거나 저장소를 스타터 키트 또는 템플릿으로 재배포할 수는 없습니다.

KO
테마