@kood/claude-code 0.1.2 → 0.1.4
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.js +129 -5
- package/package.json +2 -2
- package/templates/hono/CLAUDE.md +20 -2
- package/templates/hono/docs/architecture/architecture.md +909 -0
- package/templates/hono/docs/commands/git.md +275 -0
- package/templates/hono/docs/deployment/cloudflare.md +527 -190
- package/templates/hono/docs/deployment/docker.md +514 -0
- package/templates/hono/docs/deployment/index.md +179 -214
- package/templates/hono/docs/deployment/railway.md +416 -0
- package/templates/hono/docs/deployment/vercel.md +567 -0
- package/templates/hono/docs/library/ai-sdk/index.md +427 -0
- package/templates/hono/docs/library/ai-sdk/openrouter.md +479 -0
- package/templates/hono/docs/library/ai-sdk/providers.md +468 -0
- package/templates/hono/docs/library/ai-sdk/streaming.md +447 -0
- package/templates/hono/docs/library/ai-sdk/structured-output.md +493 -0
- package/templates/hono/docs/library/ai-sdk/tools.md +513 -0
- package/templates/hono/docs/library/hono/env-setup.md +458 -0
- package/templates/hono/docs/library/hono/index.md +1 -3
- package/templates/hono/docs/library/pino/index.md +437 -0
- package/templates/hono/docs/library/prisma/cloudflare-d1.md +503 -0
- package/templates/hono/docs/library/prisma/config.md +362 -0
- package/templates/hono/docs/library/prisma/index.md +86 -13
- package/templates/hono/docs/skills/gemini-review/SKILL.md +116 -116
- package/templates/hono/docs/skills/gemini-review/references/checklists.md +125 -125
- package/templates/hono/docs/skills/gemini-review/references/prompt-templates.md +191 -191
- package/templates/npx/CLAUDE.md +309 -0
- package/templates/npx/docs/commands/git.md +275 -0
- package/templates/npx/docs/library/commander/index.md +164 -0
- package/templates/npx/docs/library/fs-extra/index.md +171 -0
- package/templates/npx/docs/library/prompts/index.md +253 -0
- package/templates/npx/docs/mcp/index.md +60 -0
- package/templates/npx/docs/skills/gemini-review/SKILL.md +220 -0
- package/templates/npx/docs/skills/gemini-review/references/checklists.md +134 -0
- package/templates/npx/docs/skills/gemini-review/references/prompt-templates.md +301 -0
- package/templates/tanstack-start/CLAUDE.md +43 -5
- package/templates/tanstack-start/docs/architecture/architecture.md +134 -4
- package/templates/tanstack-start/docs/commands/git.md +275 -0
- package/templates/tanstack-start/docs/deployment/cloudflare.md +223 -50
- package/templates/tanstack-start/docs/deployment/index.md +320 -30
- package/templates/tanstack-start/docs/deployment/nitro.md +195 -14
- package/templates/tanstack-start/docs/deployment/railway.md +302 -150
- package/templates/tanstack-start/docs/deployment/vercel.md +345 -75
- package/templates/tanstack-start/docs/guides/best-practices.md +203 -1
- package/templates/tanstack-start/docs/guides/env-setup.md +450 -0
- package/templates/tanstack-start/docs/library/ai-sdk/hooks.md +472 -0
- package/templates/tanstack-start/docs/library/ai-sdk/index.md +264 -0
- package/templates/tanstack-start/docs/library/ai-sdk/openrouter.md +371 -0
- package/templates/tanstack-start/docs/library/ai-sdk/providers.md +403 -0
- package/templates/tanstack-start/docs/library/ai-sdk/streaming.md +320 -0
- package/templates/tanstack-start/docs/library/ai-sdk/structured-output.md +454 -0
- package/templates/tanstack-start/docs/library/ai-sdk/tools.md +473 -0
- package/templates/tanstack-start/docs/library/pino/index.md +320 -0
- package/templates/tanstack-start/docs/library/prisma/cloudflare-d1.md +404 -0
- package/templates/tanstack-start/docs/library/prisma/config.md +377 -0
- package/templates/tanstack-start/docs/library/prisma/index.md +3 -5
- package/templates/tanstack-start/docs/library/prisma/schema.md +123 -25
- package/templates/tanstack-start/docs/library/prisma/setup.md +0 -7
- package/templates/tanstack-start/docs/library/tanstack-start/server-functions.md +80 -2
- package/templates/tanstack-start/docs/skills/gemini-review/SKILL.md +116 -116
- package/templates/tanstack-start/docs/skills/gemini-review/references/checklists.md +138 -144
- package/templates/tanstack-start/docs/skills/gemini-review/references/prompt-templates.md +186 -187
- package/templates/hono/docs/git/index.md +0 -180
- package/templates/tanstack-start/docs/git/index.md +0 -203
|
@@ -0,0 +1,416 @@
|
|
|
1
|
+
# Nitro v3 - Railway 배포
|
|
2
|
+
|
|
3
|
+
> **상위 문서**: [배포 가이드](./index.md)
|
|
4
|
+
|
|
5
|
+
Railway를 사용하여 Hono + Nitro 애플리케이션을 간편하게 배포합니다.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 🚀 Quick Reference (복사용)
|
|
10
|
+
|
|
11
|
+
```typescript
|
|
12
|
+
// nitro.config.ts
|
|
13
|
+
import { defineNitroConfig } from "nitro/config";
|
|
14
|
+
|
|
15
|
+
export default defineNitroConfig({
|
|
16
|
+
preset: "node",
|
|
17
|
+
compatibilityDate: "2024-09-19",
|
|
18
|
+
});
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
```json
|
|
22
|
+
// package.json scripts
|
|
23
|
+
{
|
|
24
|
+
"scripts": {
|
|
25
|
+
"build": "nitro build",
|
|
26
|
+
"start": "node .output/server/index.mjs"
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
# Railway CLI 배포
|
|
33
|
+
railway login
|
|
34
|
+
railway init
|
|
35
|
+
railway up
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
## Railway 설정
|
|
41
|
+
|
|
42
|
+
### 1. Nitro 설정
|
|
43
|
+
|
|
44
|
+
```typescript
|
|
45
|
+
// nitro.config.ts
|
|
46
|
+
// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
47
|
+
// Railway 배포용 Nitro 설정
|
|
48
|
+
// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
49
|
+
import { defineNitroConfig } from "nitro/config";
|
|
50
|
+
|
|
51
|
+
export default defineNitroConfig({
|
|
52
|
+
// Node.js 서버 preset
|
|
53
|
+
preset: "node",
|
|
54
|
+
|
|
55
|
+
// 호환성 날짜
|
|
56
|
+
compatibilityDate: "2024-09-19",
|
|
57
|
+
|
|
58
|
+
// Railway는 PORT 환경 변수 자동 제공
|
|
59
|
+
// 별도 설정 불필요
|
|
60
|
+
});
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
### 2. package.json 설정
|
|
64
|
+
|
|
65
|
+
```json
|
|
66
|
+
{
|
|
67
|
+
"name": "hono-nitro-app",
|
|
68
|
+
"type": "module",
|
|
69
|
+
"scripts": {
|
|
70
|
+
"dev": "nitro dev",
|
|
71
|
+
"build": "nitro build",
|
|
72
|
+
"start": "node .output/server/index.mjs",
|
|
73
|
+
"preview": "nitro preview"
|
|
74
|
+
},
|
|
75
|
+
"dependencies": {
|
|
76
|
+
"hono": "^4.0.0",
|
|
77
|
+
"nitro": "^3.0.0"
|
|
78
|
+
},
|
|
79
|
+
"devDependencies": {
|
|
80
|
+
"typescript": "^5.0.0"
|
|
81
|
+
},
|
|
82
|
+
"engines": {
|
|
83
|
+
"node": ">=20.0.0"
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
90
|
+
## 배포 방법
|
|
91
|
+
|
|
92
|
+
### 방법 1: GitHub 연동 (권장)
|
|
93
|
+
|
|
94
|
+
1. **Railway 프로젝트 생성**
|
|
95
|
+
- [Railway 대시보드](https://railway.app) 접속
|
|
96
|
+
- "New Project" → "Deploy from GitHub repo" 선택
|
|
97
|
+
- 저장소 연결
|
|
98
|
+
|
|
99
|
+
2. **자동 감지**
|
|
100
|
+
- Railway가 자동으로 Node.js 프로젝트 감지
|
|
101
|
+
- `package.json`의 `build`, `start` 스크립트 사용
|
|
102
|
+
|
|
103
|
+
3. **환경 변수 설정**
|
|
104
|
+
- Railway 대시보드에서 Variables 탭 선택
|
|
105
|
+
- 필요한 환경 변수 추가
|
|
106
|
+
|
|
107
|
+
### 방법 2: Railway CLI
|
|
108
|
+
|
|
109
|
+
```bash
|
|
110
|
+
# Railway CLI 설치
|
|
111
|
+
npm install -g @railway/cli
|
|
112
|
+
|
|
113
|
+
# 로그인
|
|
114
|
+
railway login
|
|
115
|
+
|
|
116
|
+
# 프로젝트 초기화
|
|
117
|
+
railway init
|
|
118
|
+
|
|
119
|
+
# 배포
|
|
120
|
+
railway up
|
|
121
|
+
|
|
122
|
+
# 환경 변수 설정
|
|
123
|
+
railway variables set DATABASE_URL="postgresql://..."
|
|
124
|
+
railway variables set API_SECRET="your-secret"
|
|
125
|
+
|
|
126
|
+
# 로그 확인
|
|
127
|
+
railway logs
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
### 방법 3: Docker 배포
|
|
131
|
+
|
|
132
|
+
Railway는 Dockerfile을 자동으로 감지합니다.
|
|
133
|
+
|
|
134
|
+
```dockerfile
|
|
135
|
+
# Dockerfile
|
|
136
|
+
FROM node:20-alpine AS builder
|
|
137
|
+
WORKDIR /app
|
|
138
|
+
COPY package.json yarn.lock ./
|
|
139
|
+
RUN yarn install --frozen-lockfile
|
|
140
|
+
COPY . .
|
|
141
|
+
RUN yarn build
|
|
142
|
+
|
|
143
|
+
FROM node:20-alpine
|
|
144
|
+
WORKDIR /app
|
|
145
|
+
COPY --from=builder /app/.output ./.output
|
|
146
|
+
ENV PORT=3000 NODE_ENV=production
|
|
147
|
+
EXPOSE 3000
|
|
148
|
+
CMD ["node", ".output/server/index.mjs"]
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
---
|
|
152
|
+
|
|
153
|
+
## railway.toml 설정 (선택)
|
|
154
|
+
|
|
155
|
+
```toml
|
|
156
|
+
# railway.toml
|
|
157
|
+
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
158
|
+
# Railway 배포 설정 (선택적)
|
|
159
|
+
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
160
|
+
|
|
161
|
+
[build]
|
|
162
|
+
# 빌드 명령어
|
|
163
|
+
builder = "nixpacks"
|
|
164
|
+
buildCommand = "yarn install && yarn build"
|
|
165
|
+
|
|
166
|
+
[deploy]
|
|
167
|
+
# 시작 명령어
|
|
168
|
+
startCommand = "node .output/server/index.mjs"
|
|
169
|
+
|
|
170
|
+
# 헬스체크
|
|
171
|
+
healthcheckPath = "/health"
|
|
172
|
+
healthcheckTimeout = 300
|
|
173
|
+
|
|
174
|
+
# 재시작 정책
|
|
175
|
+
restartPolicyType = "ON_FAILURE"
|
|
176
|
+
restartPolicyMaxRetries = 3
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
---
|
|
180
|
+
|
|
181
|
+
## 환경 변수
|
|
182
|
+
|
|
183
|
+
### Railway 대시보드에서 설정
|
|
184
|
+
|
|
185
|
+
```
|
|
186
|
+
DATABASE_URL=postgresql://user:pass@host:5432/db
|
|
187
|
+
API_SECRET=your-secret-key
|
|
188
|
+
NODE_ENV=production
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
### 코드에서 사용
|
|
192
|
+
|
|
193
|
+
```typescript
|
|
194
|
+
// src/server.ts
|
|
195
|
+
import { Hono } from "hono";
|
|
196
|
+
|
|
197
|
+
const app = new Hono();
|
|
198
|
+
|
|
199
|
+
app.get("/health", (c) => {
|
|
200
|
+
return c.json({
|
|
201
|
+
status: "ok",
|
|
202
|
+
environment: process.env.NODE_ENV,
|
|
203
|
+
// Railway 자동 제공 변수
|
|
204
|
+
railway: {
|
|
205
|
+
environment: process.env.RAILWAY_ENVIRONMENT,
|
|
206
|
+
service: process.env.RAILWAY_SERVICE_NAME,
|
|
207
|
+
},
|
|
208
|
+
});
|
|
209
|
+
});
|
|
210
|
+
|
|
211
|
+
export default app;
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
### Railway 자동 제공 변수
|
|
215
|
+
|
|
216
|
+
| 변수 | 설명 |
|
|
217
|
+
|------|------|
|
|
218
|
+
| `PORT` | 서버 포트 (자동 할당) |
|
|
219
|
+
| `RAILWAY_ENVIRONMENT` | 환경 (production, staging 등) |
|
|
220
|
+
| `RAILWAY_SERVICE_NAME` | 서비스 이름 |
|
|
221
|
+
| `RAILWAY_PROJECT_ID` | 프로젝트 ID |
|
|
222
|
+
| `RAILWAY_DEPLOYMENT_ID` | 배포 ID |
|
|
223
|
+
|
|
224
|
+
---
|
|
225
|
+
|
|
226
|
+
## 데이터베이스 연동
|
|
227
|
+
|
|
228
|
+
### PostgreSQL 추가
|
|
229
|
+
|
|
230
|
+
1. Railway 대시보드에서 "New" → "Database" → "PostgreSQL" 선택
|
|
231
|
+
2. 자동으로 `DATABASE_URL` 환경 변수 연결
|
|
232
|
+
|
|
233
|
+
```typescript
|
|
234
|
+
// src/lib/db.ts
|
|
235
|
+
import { PrismaClient } from "@prisma/client";
|
|
236
|
+
|
|
237
|
+
// Railway의 DATABASE_URL 자동 사용
|
|
238
|
+
export const prisma = new PrismaClient();
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
### Redis 추가
|
|
242
|
+
|
|
243
|
+
1. Railway 대시보드에서 "New" → "Database" → "Redis" 선택
|
|
244
|
+
2. `REDIS_URL` 환경 변수 자동 연결
|
|
245
|
+
|
|
246
|
+
```typescript
|
|
247
|
+
// src/lib/redis.ts
|
|
248
|
+
import { createClient } from "redis";
|
|
249
|
+
|
|
250
|
+
const client = createClient({
|
|
251
|
+
url: process.env.REDIS_URL,
|
|
252
|
+
});
|
|
253
|
+
|
|
254
|
+
export default client;
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
---
|
|
258
|
+
|
|
259
|
+
## 도메인 설정
|
|
260
|
+
|
|
261
|
+
### 자동 도메인
|
|
262
|
+
|
|
263
|
+
Railway는 자동으로 도메인을 생성합니다:
|
|
264
|
+
- `your-app-production.up.railway.app`
|
|
265
|
+
|
|
266
|
+
### 커스텀 도메인
|
|
267
|
+
|
|
268
|
+
1. Railway 대시보드 → Settings → Domains
|
|
269
|
+
2. "Add Custom Domain" 클릭
|
|
270
|
+
3. DNS 설정:
|
|
271
|
+
```
|
|
272
|
+
CNAME your-domain.com → your-app-production.up.railway.app
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
---
|
|
276
|
+
|
|
277
|
+
## CI/CD 설정
|
|
278
|
+
|
|
279
|
+
### GitHub Actions 연동
|
|
280
|
+
|
|
281
|
+
```yaml
|
|
282
|
+
# .github/workflows/railway.yml
|
|
283
|
+
name: Deploy to Railway
|
|
284
|
+
|
|
285
|
+
on:
|
|
286
|
+
push:
|
|
287
|
+
branches: [main]
|
|
288
|
+
|
|
289
|
+
jobs:
|
|
290
|
+
deploy:
|
|
291
|
+
runs-on: ubuntu-latest
|
|
292
|
+
steps:
|
|
293
|
+
- uses: actions/checkout@v4
|
|
294
|
+
|
|
295
|
+
- name: Install Railway CLI
|
|
296
|
+
run: npm install -g @railway/cli
|
|
297
|
+
|
|
298
|
+
- name: Deploy
|
|
299
|
+
run: railway up
|
|
300
|
+
env:
|
|
301
|
+
RAILWAY_TOKEN: ${{ secrets.RAILWAY_TOKEN }}
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
### 환경별 배포
|
|
305
|
+
|
|
306
|
+
```yaml
|
|
307
|
+
# .github/workflows/railway-env.yml
|
|
308
|
+
name: Deploy to Railway (Multi-Environment)
|
|
309
|
+
|
|
310
|
+
on:
|
|
311
|
+
push:
|
|
312
|
+
branches:
|
|
313
|
+
- main
|
|
314
|
+
- staging
|
|
315
|
+
|
|
316
|
+
jobs:
|
|
317
|
+
deploy:
|
|
318
|
+
runs-on: ubuntu-latest
|
|
319
|
+
steps:
|
|
320
|
+
- uses: actions/checkout@v4
|
|
321
|
+
|
|
322
|
+
- name: Install Railway CLI
|
|
323
|
+
run: npm install -g @railway/cli
|
|
324
|
+
|
|
325
|
+
- name: Deploy to Production
|
|
326
|
+
if: github.ref == 'refs/heads/main'
|
|
327
|
+
run: railway up --environment production
|
|
328
|
+
env:
|
|
329
|
+
RAILWAY_TOKEN: ${{ secrets.RAILWAY_TOKEN }}
|
|
330
|
+
|
|
331
|
+
- name: Deploy to Staging
|
|
332
|
+
if: github.ref == 'refs/heads/staging'
|
|
333
|
+
run: railway up --environment staging
|
|
334
|
+
env:
|
|
335
|
+
RAILWAY_TOKEN: ${{ secrets.RAILWAY_TOKEN }}
|
|
336
|
+
```
|
|
337
|
+
|
|
338
|
+
---
|
|
339
|
+
|
|
340
|
+
## 모니터링
|
|
341
|
+
|
|
342
|
+
### 로그 확인
|
|
343
|
+
|
|
344
|
+
```bash
|
|
345
|
+
# CLI로 로그 확인
|
|
346
|
+
railway logs
|
|
347
|
+
|
|
348
|
+
# 실시간 로그
|
|
349
|
+
railway logs -f
|
|
350
|
+
|
|
351
|
+
# 특정 서비스 로그
|
|
352
|
+
railway logs --service my-service
|
|
353
|
+
```
|
|
354
|
+
|
|
355
|
+
### 메트릭 확인
|
|
356
|
+
|
|
357
|
+
Railway 대시보드에서 확인 가능:
|
|
358
|
+
- CPU 사용량
|
|
359
|
+
- 메모리 사용량
|
|
360
|
+
- 네트워크 트래픽
|
|
361
|
+
- 요청 수
|
|
362
|
+
|
|
363
|
+
---
|
|
364
|
+
|
|
365
|
+
## 비용 최적화
|
|
366
|
+
|
|
367
|
+
### Hobby Plan 활용
|
|
368
|
+
|
|
369
|
+
```toml
|
|
370
|
+
# railway.toml
|
|
371
|
+
[deploy]
|
|
372
|
+
# 유휴 시 슬립 (Hobby Plan)
|
|
373
|
+
sleepAfterInactivity = 300 # 5분 후 슬립
|
|
374
|
+
```
|
|
375
|
+
|
|
376
|
+
### 리소스 제한
|
|
377
|
+
|
|
378
|
+
Railway 대시보드에서 설정:
|
|
379
|
+
- Memory Limit: 512MB (시작점)
|
|
380
|
+
- Replicas: 1 (시작점)
|
|
381
|
+
|
|
382
|
+
---
|
|
383
|
+
|
|
384
|
+
## 문제 해결
|
|
385
|
+
|
|
386
|
+
### 일반적인 문제
|
|
387
|
+
|
|
388
|
+
| 문제 | 원인 | 해결 |
|
|
389
|
+
|------|------|------|
|
|
390
|
+
| 빌드 실패 | 의존성 오류 | `yarn.lock` 커밋 확인 |
|
|
391
|
+
| 포트 바인딩 실패 | 하드코딩된 포트 | `process.env.PORT` 사용 |
|
|
392
|
+
| 메모리 초과 | 메모리 누수 | 리소스 제한 증가 또는 코드 최적화 |
|
|
393
|
+
| 헬스체크 실패 | 엔드포인트 없음 | `/health` 엔드포인트 추가 |
|
|
394
|
+
|
|
395
|
+
### 디버깅
|
|
396
|
+
|
|
397
|
+
```bash
|
|
398
|
+
# 로컬에서 Railway 환경 시뮬레이션
|
|
399
|
+
railway run yarn dev
|
|
400
|
+
|
|
401
|
+
# 환경 변수 확인
|
|
402
|
+
railway variables
|
|
403
|
+
|
|
404
|
+
# 서비스 상태 확인
|
|
405
|
+
railway status
|
|
406
|
+
```
|
|
407
|
+
|
|
408
|
+
---
|
|
409
|
+
|
|
410
|
+
## 관련 문서
|
|
411
|
+
|
|
412
|
+
- [배포 가이드 개요](./index.md)
|
|
413
|
+
- [Docker 배포](./docker.md)
|
|
414
|
+
- [Vercel 배포](./vercel.md)
|
|
415
|
+
- [Cloudflare 배포](./cloudflare.md)
|
|
416
|
+
- [Railway 공식 문서](https://docs.railway.app)
|