@kood/claude-code 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +2 -0
- package/dist/index.js +297 -0
- package/package.json +47 -0
- package/templates/hono/CLAUDE.md +376 -0
- package/templates/hono/docs/deployment/cloudflare.md +328 -0
- package/templates/hono/docs/deployment/index.md +291 -0
- package/templates/hono/docs/git/index.md +180 -0
- package/templates/hono/docs/library/hono/error-handling.md +400 -0
- package/templates/hono/docs/library/hono/index.md +241 -0
- package/templates/hono/docs/library/hono/middleware.md +334 -0
- package/templates/hono/docs/library/hono/rpc.md +454 -0
- package/templates/hono/docs/library/hono/validation.md +328 -0
- package/templates/hono/docs/library/prisma/index.md +427 -0
- package/templates/hono/docs/library/zod/index.md +413 -0
- package/templates/hono/docs/mcp/context7.md +106 -0
- package/templates/hono/docs/mcp/index.md +94 -0
- package/templates/hono/docs/mcp/sequential-thinking.md +101 -0
- package/templates/hono/docs/mcp/sgrep.md +105 -0
- package/templates/hono/docs/skills/gemini-review/SKILL.md +220 -0
- package/templates/hono/docs/skills/gemini-review/references/checklists.md +136 -0
- package/templates/hono/docs/skills/gemini-review/references/prompt-templates.md +303 -0
- package/templates/tanstack-start/CLAUDE.md +279 -0
- package/templates/tanstack-start/docs/architecture/architecture.md +547 -0
- package/templates/tanstack-start/docs/deployment/cloudflare.md +346 -0
- package/templates/tanstack-start/docs/deployment/index.md +102 -0
- package/templates/tanstack-start/docs/deployment/nitro.md +211 -0
- package/templates/tanstack-start/docs/deployment/railway.md +364 -0
- package/templates/tanstack-start/docs/deployment/vercel.md +287 -0
- package/templates/tanstack-start/docs/design/accessibility.md +433 -0
- package/templates/tanstack-start/docs/design/color.md +235 -0
- package/templates/tanstack-start/docs/design/components.md +409 -0
- package/templates/tanstack-start/docs/design/index.md +107 -0
- package/templates/tanstack-start/docs/design/safe-area.md +317 -0
- package/templates/tanstack-start/docs/design/spacing.md +341 -0
- package/templates/tanstack-start/docs/design/tailwind-setup.md +470 -0
- package/templates/tanstack-start/docs/design/typography.md +324 -0
- package/templates/tanstack-start/docs/git/index.md +203 -0
- package/templates/tanstack-start/docs/guides/best-practices.md +753 -0
- package/templates/tanstack-start/docs/guides/getting-started.md +304 -0
- package/templates/tanstack-start/docs/guides/husky-lint-staged.md +303 -0
- package/templates/tanstack-start/docs/guides/prettier.md +189 -0
- package/templates/tanstack-start/docs/guides/project-templates.md +710 -0
- package/templates/tanstack-start/docs/library/better-auth/2fa.md +136 -0
- package/templates/tanstack-start/docs/library/better-auth/advanced.md +138 -0
- package/templates/tanstack-start/docs/library/better-auth/index.md +83 -0
- package/templates/tanstack-start/docs/library/better-auth/plugins.md +111 -0
- package/templates/tanstack-start/docs/library/better-auth/session.md +127 -0
- package/templates/tanstack-start/docs/library/better-auth/setup.md +123 -0
- package/templates/tanstack-start/docs/library/prisma/crud.md +218 -0
- package/templates/tanstack-start/docs/library/prisma/index.md +165 -0
- package/templates/tanstack-start/docs/library/prisma/relations.md +191 -0
- package/templates/tanstack-start/docs/library/prisma/schema.md +177 -0
- package/templates/tanstack-start/docs/library/prisma/setup.md +156 -0
- package/templates/tanstack-start/docs/library/prisma/transactions.md +140 -0
- package/templates/tanstack-start/docs/library/tanstack-query/index.md +146 -0
- package/templates/tanstack-start/docs/library/tanstack-query/invalidation.md +146 -0
- package/templates/tanstack-start/docs/library/tanstack-query/optimistic-updates.md +196 -0
- package/templates/tanstack-start/docs/library/tanstack-query/setup.md +110 -0
- package/templates/tanstack-start/docs/library/tanstack-query/use-mutation.md +170 -0
- package/templates/tanstack-start/docs/library/tanstack-query/use-query.md +173 -0
- package/templates/tanstack-start/docs/library/tanstack-start/auth-patterns.md +171 -0
- package/templates/tanstack-start/docs/library/tanstack-start/index.md +114 -0
- package/templates/tanstack-start/docs/library/tanstack-start/middleware.md +142 -0
- package/templates/tanstack-start/docs/library/tanstack-start/routing.md +163 -0
- package/templates/tanstack-start/docs/library/tanstack-start/server-functions.md +128 -0
- package/templates/tanstack-start/docs/library/tanstack-start/setup.md +85 -0
- package/templates/tanstack-start/docs/library/zod/basic-types.md +186 -0
- package/templates/tanstack-start/docs/library/zod/complex-types.md +204 -0
- package/templates/tanstack-start/docs/library/zod/index.md +186 -0
- package/templates/tanstack-start/docs/library/zod/transforms.md +174 -0
- package/templates/tanstack-start/docs/library/zod/validation.md +208 -0
- package/templates/tanstack-start/docs/mcp/context7.md +204 -0
- package/templates/tanstack-start/docs/mcp/index.md +116 -0
- package/templates/tanstack-start/docs/mcp/sequential-thinking.md +180 -0
- package/templates/tanstack-start/docs/mcp/sgrep.md +174 -0
- package/templates/tanstack-start/docs/skills/gemini-review/SKILL.md +220 -0
- package/templates/tanstack-start/docs/skills/gemini-review/references/checklists.md +150 -0
- package/templates/tanstack-start/docs/skills/gemini-review/references/prompt-templates.md +293 -0
|
@@ -0,0 +1,364 @@
|
|
|
1
|
+
# Railway 배포
|
|
2
|
+
|
|
3
|
+
> **상위 문서**: [배포](./index.md)
|
|
4
|
+
|
|
5
|
+
Railway는 Node.js 서버를 간편하게 배포할 수 있는 플랫폼입니다.
|
|
6
|
+
|
|
7
|
+
## 빠른 시작
|
|
8
|
+
|
|
9
|
+
### 1. Nitro 설정
|
|
10
|
+
|
|
11
|
+
```typescript
|
|
12
|
+
// nitro.config.ts
|
|
13
|
+
import { defineNitroConfig } from 'nitro/config'
|
|
14
|
+
|
|
15
|
+
export default defineNitroConfig({
|
|
16
|
+
preset: 'node-server',
|
|
17
|
+
})
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
### 2. Vite 설정
|
|
21
|
+
|
|
22
|
+
```typescript
|
|
23
|
+
// vite.config.ts
|
|
24
|
+
import { defineConfig } from 'vite'
|
|
25
|
+
import react from '@vitejs/plugin-react'
|
|
26
|
+
import { tanstackStart } from '@tanstack/react-start/plugin/vite'
|
|
27
|
+
import { nitro } from 'nitro/vite'
|
|
28
|
+
|
|
29
|
+
export default defineConfig({
|
|
30
|
+
plugins: [
|
|
31
|
+
tanstackStart(),
|
|
32
|
+
nitro(),
|
|
33
|
+
react(),
|
|
34
|
+
],
|
|
35
|
+
})
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
### 3. 빌드 스크립트
|
|
39
|
+
|
|
40
|
+
```json
|
|
41
|
+
// package.json
|
|
42
|
+
{
|
|
43
|
+
"scripts": {
|
|
44
|
+
"build": "vite build",
|
|
45
|
+
"start": "node .output/server/index.mjs"
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## Railway 설정
|
|
51
|
+
|
|
52
|
+
### railway.json
|
|
53
|
+
|
|
54
|
+
```json
|
|
55
|
+
{
|
|
56
|
+
"$schema": "https://railway.app/railway.schema.json",
|
|
57
|
+
"build": {
|
|
58
|
+
"builder": "NIXPACKS",
|
|
59
|
+
"buildCommand": "yarn install && yarn build"
|
|
60
|
+
},
|
|
61
|
+
"deploy": {
|
|
62
|
+
"startCommand": "node .output/server/index.mjs",
|
|
63
|
+
"healthcheckPath": "/",
|
|
64
|
+
"healthcheckTimeout": 100,
|
|
65
|
+
"restartPolicyType": "ON_FAILURE",
|
|
66
|
+
"restartPolicyMaxRetries": 10
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### nixpacks.toml (선택사항)
|
|
72
|
+
|
|
73
|
+
```toml
|
|
74
|
+
[phases.setup]
|
|
75
|
+
nixPkgs = ["nodejs_20"]
|
|
76
|
+
|
|
77
|
+
[phases.install]
|
|
78
|
+
cmds = ["yarn install"]
|
|
79
|
+
|
|
80
|
+
[phases.build]
|
|
81
|
+
cmds = ["yarn build"]
|
|
82
|
+
|
|
83
|
+
[start]
|
|
84
|
+
cmd = "node .output/server/index.mjs"
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
## 환경변수
|
|
88
|
+
|
|
89
|
+
### Railway 대시보드에서 설정
|
|
90
|
+
|
|
91
|
+
1. Railway 대시보드 → 프로젝트 선택
|
|
92
|
+
2. Variables 탭 클릭
|
|
93
|
+
3. 환경변수 추가:
|
|
94
|
+
- `NODE_ENV=production`
|
|
95
|
+
- `DATABASE_URL=...`
|
|
96
|
+
- `API_SECRET=...`
|
|
97
|
+
|
|
98
|
+
### Railway CLI 사용
|
|
99
|
+
|
|
100
|
+
```bash
|
|
101
|
+
# Railway CLI 설치
|
|
102
|
+
npm install -g @railway/cli
|
|
103
|
+
|
|
104
|
+
# 로그인
|
|
105
|
+
railway login
|
|
106
|
+
|
|
107
|
+
# 환경변수 설정
|
|
108
|
+
railway variables set DATABASE_URL=postgresql://...
|
|
109
|
+
railway variables set API_SECRET=your-secret
|
|
110
|
+
|
|
111
|
+
# 환경변수 확인
|
|
112
|
+
railway variables
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
## 데이터베이스 연결
|
|
116
|
+
|
|
117
|
+
### PostgreSQL
|
|
118
|
+
|
|
119
|
+
Railway에서 PostgreSQL 서비스 추가 후:
|
|
120
|
+
|
|
121
|
+
```bash
|
|
122
|
+
# 자동 생성된 환경변수 사용
|
|
123
|
+
DATABASE_URL=${{ Postgres.DATABASE_URL }}
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
### Prisma와 함께 사용
|
|
127
|
+
|
|
128
|
+
```typescript
|
|
129
|
+
// server/db.ts
|
|
130
|
+
import { PrismaClient } from './generated/prisma'
|
|
131
|
+
|
|
132
|
+
const prisma = new PrismaClient({
|
|
133
|
+
datasources: {
|
|
134
|
+
db: {
|
|
135
|
+
url: process.env.DATABASE_URL,
|
|
136
|
+
},
|
|
137
|
+
},
|
|
138
|
+
})
|
|
139
|
+
|
|
140
|
+
export default prisma
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
## 포트 설정
|
|
144
|
+
|
|
145
|
+
Railway는 `PORT` 환경변수를 자동 제공합니다:
|
|
146
|
+
|
|
147
|
+
```typescript
|
|
148
|
+
// nitro.config.ts
|
|
149
|
+
import { defineNitroConfig } from 'nitro/config'
|
|
150
|
+
|
|
151
|
+
export default defineNitroConfig({
|
|
152
|
+
preset: 'node-server',
|
|
153
|
+
// Railway의 PORT 환경변수 사용
|
|
154
|
+
})
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
서버 코드에서:
|
|
158
|
+
|
|
159
|
+
```typescript
|
|
160
|
+
// .output/server/index.mjs (자동 생성됨)
|
|
161
|
+
// Nitro가 자동으로 PORT 환경변수를 사용
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
## 배포 방법
|
|
165
|
+
|
|
166
|
+
### GitHub 연동 (권장)
|
|
167
|
+
|
|
168
|
+
1. Railway 대시보드에서 "New Project" 클릭
|
|
169
|
+
2. "Deploy from GitHub repo" 선택
|
|
170
|
+
3. 저장소 선택 및 연결
|
|
171
|
+
4. 자동 배포 설정 완료
|
|
172
|
+
|
|
173
|
+
### Railway CLI
|
|
174
|
+
|
|
175
|
+
```bash
|
|
176
|
+
# 프로젝트 초기화
|
|
177
|
+
railway init
|
|
178
|
+
|
|
179
|
+
# 배포
|
|
180
|
+
railway up
|
|
181
|
+
|
|
182
|
+
# 로그 확인
|
|
183
|
+
railway logs
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
## 커스텀 도메인
|
|
187
|
+
|
|
188
|
+
### Railway 대시보드에서
|
|
189
|
+
|
|
190
|
+
1. 프로젝트 Settings 탭
|
|
191
|
+
2. Domains 섹션
|
|
192
|
+
3. "Generate Domain" 또는 "Custom Domain" 추가
|
|
193
|
+
|
|
194
|
+
### CLI 사용
|
|
195
|
+
|
|
196
|
+
```bash
|
|
197
|
+
# 도메인 추가
|
|
198
|
+
railway domain add example.com
|
|
199
|
+
|
|
200
|
+
# 도메인 확인
|
|
201
|
+
railway domain
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
## 헬스체크
|
|
205
|
+
|
|
206
|
+
### 기본 헬스체크 엔드포인트
|
|
207
|
+
|
|
208
|
+
```typescript
|
|
209
|
+
// server/api/health.ts
|
|
210
|
+
import { defineHandler } from 'nitro/h3'
|
|
211
|
+
|
|
212
|
+
export default defineHandler(() => {
|
|
213
|
+
return { status: 'ok', timestamp: new Date().toISOString() }
|
|
214
|
+
})
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
### railway.json 헬스체크 설정
|
|
218
|
+
|
|
219
|
+
```json
|
|
220
|
+
{
|
|
221
|
+
"deploy": {
|
|
222
|
+
"healthcheckPath": "/api/health",
|
|
223
|
+
"healthcheckTimeout": 100
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
## 스케일링
|
|
229
|
+
|
|
230
|
+
### 수평 스케일링
|
|
231
|
+
|
|
232
|
+
Railway 대시보드에서:
|
|
233
|
+
1. Settings → Scaling
|
|
234
|
+
2. 인스턴스 수 조정
|
|
235
|
+
|
|
236
|
+
### 리소스 설정
|
|
237
|
+
|
|
238
|
+
```json
|
|
239
|
+
// railway.json
|
|
240
|
+
{
|
|
241
|
+
"deploy": {
|
|
242
|
+
"numReplicas": 2
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
## 로깅 및 모니터링
|
|
248
|
+
|
|
249
|
+
### 로그 확인
|
|
250
|
+
|
|
251
|
+
```bash
|
|
252
|
+
# 실시간 로그
|
|
253
|
+
railway logs -f
|
|
254
|
+
|
|
255
|
+
# 최근 로그
|
|
256
|
+
railway logs --lines 100
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
### 메트릭 확인
|
|
260
|
+
|
|
261
|
+
Railway 대시보드에서:
|
|
262
|
+
- CPU 사용량
|
|
263
|
+
- 메모리 사용량
|
|
264
|
+
- 네트워크 트래픽
|
|
265
|
+
- 요청 수
|
|
266
|
+
|
|
267
|
+
## CI/CD 설정
|
|
268
|
+
|
|
269
|
+
### GitHub Actions
|
|
270
|
+
|
|
271
|
+
```yaml
|
|
272
|
+
name: Deploy to Railway
|
|
273
|
+
|
|
274
|
+
on:
|
|
275
|
+
push:
|
|
276
|
+
branches: [main]
|
|
277
|
+
|
|
278
|
+
jobs:
|
|
279
|
+
deploy:
|
|
280
|
+
runs-on: ubuntu-latest
|
|
281
|
+
steps:
|
|
282
|
+
- uses: actions/checkout@v4
|
|
283
|
+
|
|
284
|
+
- name: Install Railway CLI
|
|
285
|
+
run: npm install -g @railway/cli
|
|
286
|
+
|
|
287
|
+
- name: Deploy
|
|
288
|
+
run: railway up
|
|
289
|
+
env:
|
|
290
|
+
RAILWAY_TOKEN: ${{ secrets.RAILWAY_TOKEN }}
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
### Railway 토큰 생성
|
|
294
|
+
|
|
295
|
+
1. Railway 대시보드 → Account Settings
|
|
296
|
+
2. Tokens 섹션에서 새 토큰 생성
|
|
297
|
+
3. GitHub Secrets에 `RAILWAY_TOKEN`으로 저장
|
|
298
|
+
|
|
299
|
+
## 트러블슈팅
|
|
300
|
+
|
|
301
|
+
### 빌드 실패
|
|
302
|
+
|
|
303
|
+
```bash
|
|
304
|
+
# 로컬에서 빌드 테스트
|
|
305
|
+
NITRO_PRESET=node-server yarn build
|
|
306
|
+
|
|
307
|
+
# 시작 명령 테스트
|
|
308
|
+
node .output/server/index.mjs
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
### 포트 바인딩 오류
|
|
312
|
+
|
|
313
|
+
Railway는 `PORT` 환경변수를 자동 설정합니다. 하드코딩된 포트가 없는지 확인:
|
|
314
|
+
|
|
315
|
+
```typescript
|
|
316
|
+
// ❌ 잘못된 예
|
|
317
|
+
const port = 3000
|
|
318
|
+
|
|
319
|
+
// ✅ 올바른 예
|
|
320
|
+
const port = process.env.PORT || 3000
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
### 메모리 초과
|
|
324
|
+
|
|
325
|
+
```json
|
|
326
|
+
// railway.json
|
|
327
|
+
{
|
|
328
|
+
"deploy": {
|
|
329
|
+
"restartPolicyType": "ON_FAILURE",
|
|
330
|
+
"restartPolicyMaxRetries": 10
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
```
|
|
334
|
+
|
|
335
|
+
Node.js 메모리 제한 설정:
|
|
336
|
+
|
|
337
|
+
```json
|
|
338
|
+
// package.json
|
|
339
|
+
{
|
|
340
|
+
"scripts": {
|
|
341
|
+
"start": "node --max-old-space-size=512 .output/server/index.mjs"
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
```
|
|
345
|
+
|
|
346
|
+
## 프로젝트 구조
|
|
347
|
+
|
|
348
|
+
```
|
|
349
|
+
my-app/
|
|
350
|
+
├── src/
|
|
351
|
+
│ └── routes/
|
|
352
|
+
├── server/
|
|
353
|
+
│ └── api/
|
|
354
|
+
├── nitro.config.ts
|
|
355
|
+
├── vite.config.ts
|
|
356
|
+
├── package.json
|
|
357
|
+
└── railway.json
|
|
358
|
+
```
|
|
359
|
+
|
|
360
|
+
## 참고 자료
|
|
361
|
+
|
|
362
|
+
- [Railway 공식 문서](https://docs.railway.app)
|
|
363
|
+
- [Railway CLI](https://docs.railway.app/reference/cli-api)
|
|
364
|
+
- [Nitro Node Server Preset](https://nitro.build/deploy/providers/node)
|
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
# Vercel 배포
|
|
2
|
+
|
|
3
|
+
> **상위 문서**: [배포](./index.md)
|
|
4
|
+
|
|
5
|
+
Vercel은 TanStack Start 앱을 위한 최적화된 배포 플랫폼입니다.
|
|
6
|
+
|
|
7
|
+
## 빠른 시작
|
|
8
|
+
|
|
9
|
+
### 1. Nitro 설정
|
|
10
|
+
|
|
11
|
+
```typescript
|
|
12
|
+
// nitro.config.ts
|
|
13
|
+
import { defineNitroConfig } from 'nitro/config'
|
|
14
|
+
|
|
15
|
+
export default defineNitroConfig({
|
|
16
|
+
preset: 'vercel',
|
|
17
|
+
})
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
### 2. 빌드 및 배포
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
# 빌드
|
|
24
|
+
yarn build
|
|
25
|
+
|
|
26
|
+
# Vercel CLI로 배포
|
|
27
|
+
vercel
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## Vercel 설정
|
|
31
|
+
|
|
32
|
+
### vercel.json
|
|
33
|
+
|
|
34
|
+
```json
|
|
35
|
+
{
|
|
36
|
+
"$schema": "https://openapi.vercel.sh/vercel.json",
|
|
37
|
+
"buildCommand": "yarn build",
|
|
38
|
+
"outputDirectory": ".output",
|
|
39
|
+
"framework": null
|
|
40
|
+
}
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
### 환경변수
|
|
44
|
+
|
|
45
|
+
Vercel 대시보드에서 설정하거나 CLI 사용:
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
# 환경변수 추가
|
|
49
|
+
vercel env add DATABASE_URL
|
|
50
|
+
|
|
51
|
+
# 환경변수 확인
|
|
52
|
+
vercel env ls
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## ISR (Incremental Static Regeneration)
|
|
56
|
+
|
|
57
|
+
### 기본 ISR 설정
|
|
58
|
+
|
|
59
|
+
```typescript
|
|
60
|
+
// nitro.config.ts
|
|
61
|
+
import { defineNitroConfig } from 'nitro/config'
|
|
62
|
+
|
|
63
|
+
export default defineNitroConfig({
|
|
64
|
+
preset: 'vercel',
|
|
65
|
+
routeRules: {
|
|
66
|
+
// 60초마다 재검증
|
|
67
|
+
'/products/**': {
|
|
68
|
+
isr: {
|
|
69
|
+
expiration: 60,
|
|
70
|
+
},
|
|
71
|
+
},
|
|
72
|
+
},
|
|
73
|
+
})
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
### On-Demand ISR
|
|
77
|
+
|
|
78
|
+
```typescript
|
|
79
|
+
// nitro.config.ts
|
|
80
|
+
import { defineNitroConfig } from 'nitro/config'
|
|
81
|
+
|
|
82
|
+
export default defineNitroConfig({
|
|
83
|
+
preset: 'vercel',
|
|
84
|
+
vercel: {
|
|
85
|
+
config: {
|
|
86
|
+
bypassToken: process.env.VERCEL_BYPASS_TOKEN,
|
|
87
|
+
},
|
|
88
|
+
},
|
|
89
|
+
routeRules: {
|
|
90
|
+
'/products/**': {
|
|
91
|
+
isr: {
|
|
92
|
+
allowQuery: ['q'], // 쿼리 파라미터 허용
|
|
93
|
+
passQuery: true,
|
|
94
|
+
},
|
|
95
|
+
},
|
|
96
|
+
},
|
|
97
|
+
})
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
### ISR 재검증 트리거
|
|
101
|
+
|
|
102
|
+
```typescript
|
|
103
|
+
// server/api/revalidate.ts
|
|
104
|
+
import { defineHandler, getHeader, createError } from 'nitro/h3'
|
|
105
|
+
|
|
106
|
+
export default defineHandler(async (event) => {
|
|
107
|
+
const token = getHeader(event, 'x-vercel-bypass-token')
|
|
108
|
+
|
|
109
|
+
if (token !== process.env.VERCEL_BYPASS_TOKEN) {
|
|
110
|
+
throw createError({ statusCode: 401 })
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// 특정 경로 재검증
|
|
114
|
+
await $fetch('/__revalidate', {
|
|
115
|
+
method: 'POST',
|
|
116
|
+
body: { paths: ['/products/123'] },
|
|
117
|
+
})
|
|
118
|
+
|
|
119
|
+
return { revalidated: true }
|
|
120
|
+
})
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
## Bun 런타임
|
|
124
|
+
|
|
125
|
+
### nitro.config.ts 설정
|
|
126
|
+
|
|
127
|
+
```typescript
|
|
128
|
+
import { defineNitroConfig } from 'nitro/config'
|
|
129
|
+
|
|
130
|
+
export default defineNitroConfig({
|
|
131
|
+
preset: 'vercel',
|
|
132
|
+
vercel: {
|
|
133
|
+
functions: {
|
|
134
|
+
runtime: 'bun1.x',
|
|
135
|
+
},
|
|
136
|
+
},
|
|
137
|
+
})
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
### vercel.json 설정
|
|
141
|
+
|
|
142
|
+
```json
|
|
143
|
+
{
|
|
144
|
+
"$schema": "https://openapi.vercel.sh/vercel.json",
|
|
145
|
+
"bunVersion": "1.x"
|
|
146
|
+
}
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
## Edge Functions
|
|
150
|
+
|
|
151
|
+
### Edge 런타임 설정
|
|
152
|
+
|
|
153
|
+
```typescript
|
|
154
|
+
// nitro.config.ts
|
|
155
|
+
import { defineNitroConfig } from 'nitro/config'
|
|
156
|
+
|
|
157
|
+
export default defineNitroConfig({
|
|
158
|
+
preset: 'vercel',
|
|
159
|
+
routeRules: {
|
|
160
|
+
'/api/edge/**': {
|
|
161
|
+
// Edge 런타임에서 실행
|
|
162
|
+
headers: {
|
|
163
|
+
'x-vercel-edge': '1',
|
|
164
|
+
},
|
|
165
|
+
},
|
|
166
|
+
},
|
|
167
|
+
})
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
## 환경별 설정
|
|
171
|
+
|
|
172
|
+
### 프리뷰 vs 프로덕션
|
|
173
|
+
|
|
174
|
+
```typescript
|
|
175
|
+
// nitro.config.ts
|
|
176
|
+
import { defineNitroConfig } from 'nitro/config'
|
|
177
|
+
|
|
178
|
+
const isProduction = process.env.VERCEL_ENV === 'production'
|
|
179
|
+
|
|
180
|
+
export default defineNitroConfig({
|
|
181
|
+
preset: 'vercel',
|
|
182
|
+
routeRules: {
|
|
183
|
+
'/api/**': {
|
|
184
|
+
cors: !isProduction, // 개발 환경에서만 CORS 허용
|
|
185
|
+
},
|
|
186
|
+
},
|
|
187
|
+
})
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
## 모노레포 설정
|
|
191
|
+
|
|
192
|
+
### vercel.json
|
|
193
|
+
|
|
194
|
+
```json
|
|
195
|
+
{
|
|
196
|
+
"$schema": "https://openapi.vercel.sh/vercel.json",
|
|
197
|
+
"installCommand": "yarn install",
|
|
198
|
+
"buildCommand": "yarn workspace web build",
|
|
199
|
+
"outputDirectory": "apps/web/.output"
|
|
200
|
+
}
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
## GitHub 통합
|
|
204
|
+
|
|
205
|
+
### 자동 배포 설정
|
|
206
|
+
|
|
207
|
+
1. Vercel 대시보드에서 GitHub 저장소 연결
|
|
208
|
+
2. 브랜치별 배포 설정:
|
|
209
|
+
- `main` → 프로덕션
|
|
210
|
+
- `develop` → 프리뷰
|
|
211
|
+
- PR → 프리뷰 배포
|
|
212
|
+
|
|
213
|
+
### vercel.json 브랜치 설정
|
|
214
|
+
|
|
215
|
+
```json
|
|
216
|
+
{
|
|
217
|
+
"$schema": "https://openapi.vercel.sh/vercel.json",
|
|
218
|
+
"git": {
|
|
219
|
+
"deploymentEnabled": {
|
|
220
|
+
"main": true,
|
|
221
|
+
"develop": true
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
## 도메인 설정
|
|
228
|
+
|
|
229
|
+
```bash
|
|
230
|
+
# 커스텀 도메인 추가
|
|
231
|
+
vercel domains add example.com
|
|
232
|
+
|
|
233
|
+
# DNS 설정 확인
|
|
234
|
+
vercel domains inspect example.com
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
## 트러블슈팅
|
|
238
|
+
|
|
239
|
+
### 빌드 실패
|
|
240
|
+
|
|
241
|
+
```bash
|
|
242
|
+
# 로컬에서 Vercel 빌드 시뮬레이션
|
|
243
|
+
vercel build
|
|
244
|
+
|
|
245
|
+
# 상세 로그 확인
|
|
246
|
+
vercel logs [deployment-url]
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
### Function 크기 초과
|
|
250
|
+
|
|
251
|
+
```typescript
|
|
252
|
+
// nitro.config.ts
|
|
253
|
+
export default defineNitroConfig({
|
|
254
|
+
preset: 'vercel',
|
|
255
|
+
// 외부 패키지로 분리
|
|
256
|
+
externals: ['@prisma/client', 'sharp'],
|
|
257
|
+
})
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
### 환경변수 누락
|
|
261
|
+
|
|
262
|
+
```bash
|
|
263
|
+
# 환경변수 풀 다운
|
|
264
|
+
vercel env pull .env.local
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
## 유용한 명령어
|
|
268
|
+
|
|
269
|
+
```bash
|
|
270
|
+
# 프로덕션 배포
|
|
271
|
+
vercel --prod
|
|
272
|
+
|
|
273
|
+
# 특정 프로젝트로 배포
|
|
274
|
+
vercel --scope my-team
|
|
275
|
+
|
|
276
|
+
# 배포 목록 확인
|
|
277
|
+
vercel ls
|
|
278
|
+
|
|
279
|
+
# 배포 롤백
|
|
280
|
+
vercel rollback [deployment-url]
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
## 참고 자료
|
|
284
|
+
|
|
285
|
+
- [Vercel 공식 문서](https://vercel.com/docs)
|
|
286
|
+
- [Vercel CLI](https://vercel.com/docs/cli)
|
|
287
|
+
- [Nitro Vercel Preset](https://nitro.build/deploy/providers/vercel)
|