> ## Documentation Index
> Fetch the complete documentation index at: https://supastack.dev/llms.txt
> Use this file to discover all available pages before exploring further.
> For the full documentation corpus in one file, fetch: https://supastack.dev/llms-full.txt

# 나머지 공급자 키 수집

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

## 이 페이지 사용법

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

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

[계정 체크리스트로 돌아가기](https://supastack.dev/ko/docs/web/external-accounts.md)


## AI 공급자 키

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

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

OpenRouter는 모든 카탈로그 모델을 하나의 키로 라우팅합니다: [openrouter.ai](https://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 설정](https://supastack.dev/ko/docs/web/setup-ai.md)이 그 설정을 다룹니다.

```
# 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](https://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](https://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](https://sentry.io) → 프로젝트 만들기 → Next.js 플랫폼 선택 → 설정 화면에 DSN `https://…@….ingest.sentry.io/…` 표시 → `SENTRY_DSN`. 그러면 예외가 상관관계 ID 태그와 함께 Sentry에 도달합니다. 무료 등급이면 시작하기에 충분합니다.

대신 제품 분석용 PostHog: [posthog.com](https://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](https://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` 또는 문의 양식을 엽니다—위젯이 렌더링됩니다. 해결되지 않은 챌린지의 제출은 거부됩니다. 위젯이 전혀 로드되지 않으면 탐색 중인 호스트명이 위젯 목록에 없는 것입니다.

[Turnstile이 보호하는 폼 보기](https://supastack.dev/ko/docs/web/captcha.md)

```
# 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 호스트명을 한 곳에서 관리하는 깔끔한 방법이기도 합니다.

[Cloud Run에서 도메인 매핑](https://supastack.dev/ko/docs/web/deploy-google-cloud.md)

[다음으로 데이터베이스 설정](https://supastack.dev/ko/docs/web/setup-database.md)


설정을 계속하려면 [데이터베이스 설정](https://supastack.dev/ko/docs/web/setup-database.md) 가이드를 읽어보세요.


## 다음

[데이터베이스 설정](https://supastack.dev/ko/docs/web/setup-database.md)
