Neul 개발 문서

배포

Cloudflare Workers(api) · Pages(web/docs) 배포와 시크릿 관리

Neul 은 전부 Cloudflare 위에서 동작합니다. API 는 Workers, 웹과 이 문서 사이트는 Pages 로 배포합니다.

apps/api — Cloudflare Workers (wrangler)

API 는 wrangler 로 배포합니다(apps/api/package.jsondeploy 스크립트).

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 prod

apps/api/wrangler.jsonc3-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-web

apps/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.jsondeploy 스크립트:

"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.tsstaticGET).

SSR 이 필요해지면(예: ISR, 동적 OG, 서버 사이드 검색) output: "export" 를 제거하고 @opennextjs/cloudflare 로 전환해 Workers 위에서 Next.js 를 SSR 로 돌릴 수 있습니다. 이 경우 wrangler.jsoncdeploy 스크립트(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 등이 시크릿 대상입니다.

On this page