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/v1Trigger.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 devS3 호환 스토리지(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 baseSentry 또는 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 호스트명을 한 곳에서 관리하는 깔끔한 방법이기도 합니다.
설정을 계속하려면 데이터베이스 설정 가이드를 읽어보세요.