배포
Cloudflare Workers(api) · Pages(web/docs) 배포와 시크릿 관리
Neul 은 전부 Cloudflare 위에서 동작합니다. API 는 Workers, 웹과 이 문서 사이트는 Pages 로 배포합니다.
apps/api — Cloudflare Workers (wrangler)
API 는 wrangler 로 배포합니다(apps/api/package.json 의 deploy 스크립트).
pnpm --filter @neul/api run deploy # = wrangler deploy
pnpm --filter @neul/api exec wrangler deploy --env dev
pnpm --filter @neul/api exec wrangler deploy --env prodapps/api/wrangler.jsonc 에 3-tier 환경(top-level local + env.dev + env.prod)이
정의되어 있습니다.
compatibility_flags: ["nodejs_compat"]—postgres-js동작에 필요.placement.mode: "smart"(dev/prod) — Worker 를 Supabase(서울) 근처로 배치해 DB 왕복 지연을 줄입니다.- KV(
RATE_LIMIT) 와 cron(6시간마다 Supabase 휴면 방지 ping)도 환경별로 설정됩니다.
named env(dev/prod)는 top-level 바인딩을 상속하지 않습니다. 각 환경의 KV
id 와 시크릿은 별도로 채워야 합니다:
wrangler kv namespace create RATE_LIMIT --env dev
wrangler secret put DATABASE_URL --env dev
wrangler secret put JWT_SECRET --env dev
# GEMINI 키 등도 동일하게 --env <name> 으로 주입apps/web — Cloudflare Pages
웹은 Vite 빌드 산출물(dist)을 Cloudflare Pages 로 배포합니다(프로젝트
neul-web 의 dev/prod).
pnpm --filter @neul/web build
pnpm --filter @neul/web exec wrangler pages deploy dist --project-name neul-webapps/docs — Cloudflare Pages (정적 export)
이 문서 사이트는 fumadocs(Next.js App Router)이며, 정적 export(output: "export")
로 빌드해 웹과 동일한 Pages 방식으로 배포합니다.
웹/API 와 동일하게 dev/prod 두 Pages 프로젝트(neul-docs-dev / neul-docs-prod)로 나눠 배포합니다.
pnpm --filter @neul/docs build # next build → ./out (정적 파일)
pnpm --filter @neul/docs run deploy:dev # neul-docs-dev 로 배포
pnpm --filter @neul/docs run deploy:prod # neul-docs-prod 로 배포apps/docs/package.json 의 deploy 스크립트:
"deploy:dev": "next build && wrangler pages deploy ./out --project-name neul-docs-dev --branch main",
"deploy:prod": "next build && wrangler pages deploy ./out --project-name neul-docs-prod --branch main"배포 URL: dev https://neul-docs-dev.pages.dev · prod https://neul-docs-prod.pages.dev.
왜 정적 export 인가
apps/web이 이미 Pages 로 배포되므로 배포 스타일이 일관됩니다.- 정적 사이트라 SSR 런타임/서버 비용이 없고, Pages CDN 에 그대로 올라갑니다.
- fumadocs 검색은 빌드 타임에 Orama 인덱스(JSON)를 생성하는 static 모드라 서버
없이도 동작합니다(
app/api/search/route.ts의staticGET).
SSR 이 필요해지면(예: ISR, 동적 OG, 서버 사이드 검색) output: "export" 를
제거하고 @opennextjs/cloudflare 로 전환해
Workers 위에서 Next.js 를 SSR 로 돌릴 수 있습니다. 이 경우 wrangler.jsonc 와
deploy 스크립트(opennextjs-cloudflare build && ... deploy)를 추가합니다.
현재 가이드/온보딩 용도에는 정적 export 로 충분합니다.
시크릿 관리 요약
| 위치 | 용도 |
|---|---|
apps/api/.dev.vars | 로컬 Workers 환경변수(wrangler 규약). git 에 커밋하지 않음 |
wrangler secret put <NAME> --env <dev|prod> | 원격 dev/prod 시크릿 주입 |
.env.example (루트) | 필요한 키 목록 레퍼런스 |
DB(DATABASE_URL/DIRECT_URL), JWT_SECRET, Gemini 키, (선택)SLACK_WEBHOOK_URL
등이 시크릿 대상입니다.