@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
|
@@ -1,52 +1,102 @@
|
|
|
1
1
|
# Railway 배포
|
|
2
2
|
|
|
3
3
|
> **상위 문서**: [배포](./index.md)
|
|
4
|
+
> **Version**: Nitro 3.x
|
|
4
5
|
|
|
5
6
|
Railway는 Node.js 서버를 간편하게 배포할 수 있는 플랫폼입니다.
|
|
6
7
|
|
|
7
|
-
|
|
8
|
+
---
|
|
8
9
|
|
|
9
|
-
|
|
10
|
+
## 🚀 Quick Reference (복사용)
|
|
10
11
|
|
|
11
12
|
```typescript
|
|
12
13
|
// nitro.config.ts
|
|
13
14
|
import { defineNitroConfig } from 'nitro/config'
|
|
14
15
|
|
|
15
16
|
export default defineNitroConfig({
|
|
16
|
-
preset: 'node
|
|
17
|
+
preset: 'node',
|
|
18
|
+
compatibilityDate: '2024-09-19',
|
|
17
19
|
})
|
|
18
20
|
```
|
|
19
21
|
|
|
20
|
-
|
|
22
|
+
```json
|
|
23
|
+
// package.json scripts
|
|
24
|
+
{
|
|
25
|
+
"scripts": {
|
|
26
|
+
"build": "vite build && tsc --noEmit",
|
|
27
|
+
"start": "node .output/server/index.mjs"
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
# Railway CLI 배포
|
|
34
|
+
railway login
|
|
35
|
+
railway init
|
|
36
|
+
railway up
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## Nitro 설정
|
|
42
|
+
|
|
43
|
+
### nitro.config.ts
|
|
44
|
+
|
|
45
|
+
```typescript
|
|
46
|
+
// nitro.config.ts
|
|
47
|
+
import { defineNitroConfig } from 'nitro/config'
|
|
48
|
+
|
|
49
|
+
export default defineNitroConfig({
|
|
50
|
+
// Node.js 서버 preset
|
|
51
|
+
preset: 'node',
|
|
52
|
+
|
|
53
|
+
// 호환성 날짜 (Nitro v3 필수)
|
|
54
|
+
compatibilityDate: '2024-09-19',
|
|
55
|
+
})
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
---
|
|
59
|
+
|
|
60
|
+
## Vite 설정
|
|
21
61
|
|
|
22
62
|
```typescript
|
|
23
63
|
// vite.config.ts
|
|
24
64
|
import { defineConfig } from 'vite'
|
|
25
|
-
import react from '@vitejs/plugin-react'
|
|
26
65
|
import { tanstackStart } from '@tanstack/react-start/plugin/vite'
|
|
27
66
|
import { nitro } from 'nitro/vite'
|
|
67
|
+
import viteReact from '@vitejs/plugin-react'
|
|
28
68
|
|
|
29
69
|
export default defineConfig({
|
|
30
70
|
plugins: [
|
|
31
71
|
tanstackStart(),
|
|
32
72
|
nitro(),
|
|
33
|
-
|
|
73
|
+
viteReact(),
|
|
34
74
|
],
|
|
35
75
|
})
|
|
36
76
|
```
|
|
37
77
|
|
|
38
|
-
|
|
78
|
+
---
|
|
79
|
+
|
|
80
|
+
## package.json 설정
|
|
39
81
|
|
|
40
82
|
```json
|
|
41
|
-
// package.json
|
|
42
83
|
{
|
|
84
|
+
"name": "tanstack-start-app",
|
|
85
|
+
"type": "module",
|
|
43
86
|
"scripts": {
|
|
44
|
-
"
|
|
45
|
-
"
|
|
87
|
+
"dev": "vite dev",
|
|
88
|
+
"build": "vite build && tsc --noEmit",
|
|
89
|
+
"start": "node .output/server/index.mjs",
|
|
90
|
+
"preview": "vite preview"
|
|
91
|
+
},
|
|
92
|
+
"engines": {
|
|
93
|
+
"node": ">=20.0.0"
|
|
46
94
|
}
|
|
47
95
|
}
|
|
48
96
|
```
|
|
49
97
|
|
|
98
|
+
---
|
|
99
|
+
|
|
50
100
|
## Railway 설정
|
|
51
101
|
|
|
52
102
|
### railway.json
|
|
@@ -60,15 +110,31 @@ export default defineConfig({
|
|
|
60
110
|
},
|
|
61
111
|
"deploy": {
|
|
62
112
|
"startCommand": "node .output/server/index.mjs",
|
|
63
|
-
"healthcheckPath": "/",
|
|
64
|
-
"healthcheckTimeout":
|
|
113
|
+
"healthcheckPath": "/health",
|
|
114
|
+
"healthcheckTimeout": 300,
|
|
65
115
|
"restartPolicyType": "ON_FAILURE",
|
|
66
|
-
"restartPolicyMaxRetries":
|
|
116
|
+
"restartPolicyMaxRetries": 3
|
|
67
117
|
}
|
|
68
118
|
}
|
|
69
119
|
```
|
|
70
120
|
|
|
71
|
-
###
|
|
121
|
+
### railway.toml (선택)
|
|
122
|
+
|
|
123
|
+
```toml
|
|
124
|
+
# railway.toml
|
|
125
|
+
[build]
|
|
126
|
+
builder = "nixpacks"
|
|
127
|
+
buildCommand = "yarn install && yarn build"
|
|
128
|
+
|
|
129
|
+
[deploy]
|
|
130
|
+
startCommand = "node .output/server/index.mjs"
|
|
131
|
+
healthcheckPath = "/health"
|
|
132
|
+
healthcheckTimeout = 300
|
|
133
|
+
restartPolicyType = "ON_FAILURE"
|
|
134
|
+
restartPolicyMaxRetries = 3
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
### nixpacks.toml (선택)
|
|
72
138
|
|
|
73
139
|
```toml
|
|
74
140
|
[phases.setup]
|
|
@@ -84,18 +150,26 @@ cmds = ["yarn build"]
|
|
|
84
150
|
cmd = "node .output/server/index.mjs"
|
|
85
151
|
```
|
|
86
152
|
|
|
87
|
-
|
|
153
|
+
---
|
|
88
154
|
|
|
89
|
-
|
|
155
|
+
## 배포 방법
|
|
90
156
|
|
|
91
|
-
|
|
92
|
-
2. Variables 탭 클릭
|
|
93
|
-
3. 환경변수 추가:
|
|
94
|
-
- `NODE_ENV=production`
|
|
95
|
-
- `DATABASE_URL=...`
|
|
96
|
-
- `API_SECRET=...`
|
|
157
|
+
### 방법 1: GitHub 연동 (권장)
|
|
97
158
|
|
|
98
|
-
|
|
159
|
+
1. **Railway 프로젝트 생성**
|
|
160
|
+
- [Railway 대시보드](https://railway.app) 접속
|
|
161
|
+
- "New Project" → "Deploy from GitHub repo" 선택
|
|
162
|
+
- 저장소 연결
|
|
163
|
+
|
|
164
|
+
2. **자동 감지**
|
|
165
|
+
- Railway가 자동으로 Node.js 프로젝트 감지
|
|
166
|
+
- `package.json`의 `build`, `start` 스크립트 사용
|
|
167
|
+
|
|
168
|
+
3. **환경 변수 설정**
|
|
169
|
+
- Railway 대시보드에서 Variables 탭 선택
|
|
170
|
+
- 필요한 환경 변수 추가
|
|
171
|
+
|
|
172
|
+
### 방법 2: Railway CLI
|
|
99
173
|
|
|
100
174
|
```bash
|
|
101
175
|
# Railway CLI 설치
|
|
@@ -104,113 +178,148 @@ npm install -g @railway/cli
|
|
|
104
178
|
# 로그인
|
|
105
179
|
railway login
|
|
106
180
|
|
|
107
|
-
#
|
|
108
|
-
railway
|
|
109
|
-
railway variables set API_SECRET=your-secret
|
|
181
|
+
# 프로젝트 초기화
|
|
182
|
+
railway init
|
|
110
183
|
|
|
111
|
-
#
|
|
112
|
-
railway
|
|
184
|
+
# 배포
|
|
185
|
+
railway up
|
|
186
|
+
|
|
187
|
+
# 환경 변수 설정
|
|
188
|
+
railway variables set DATABASE_URL="postgresql://..."
|
|
189
|
+
railway variables set API_SECRET="your-secret"
|
|
190
|
+
|
|
191
|
+
# 로그 확인
|
|
192
|
+
railway logs
|
|
113
193
|
```
|
|
114
194
|
|
|
115
|
-
|
|
195
|
+
### 방법 3: Docker 배포
|
|
196
|
+
|
|
197
|
+
Railway는 Dockerfile을 자동으로 감지합니다.
|
|
198
|
+
|
|
199
|
+
```dockerfile
|
|
200
|
+
# Dockerfile
|
|
201
|
+
FROM node:20-alpine AS builder
|
|
202
|
+
WORKDIR /app
|
|
203
|
+
COPY package.json yarn.lock ./
|
|
204
|
+
RUN yarn install --frozen-lockfile
|
|
205
|
+
COPY . .
|
|
206
|
+
RUN yarn build
|
|
207
|
+
|
|
208
|
+
FROM node:20-alpine
|
|
209
|
+
WORKDIR /app
|
|
210
|
+
COPY --from=builder /app/.output ./.output
|
|
211
|
+
ENV PORT=3000 NODE_ENV=production
|
|
212
|
+
EXPOSE 3000
|
|
213
|
+
CMD ["node", ".output/server/index.mjs"]
|
|
214
|
+
```
|
|
116
215
|
|
|
117
|
-
|
|
216
|
+
---
|
|
118
217
|
|
|
119
|
-
|
|
218
|
+
## 환경변수
|
|
120
219
|
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
220
|
+
### Railway 대시보드에서 설정
|
|
221
|
+
|
|
222
|
+
```
|
|
223
|
+
DATABASE_URL=postgresql://user:pass@host:5432/db
|
|
224
|
+
API_SECRET=your-secret-key
|
|
225
|
+
NODE_ENV=production
|
|
124
226
|
```
|
|
125
227
|
|
|
126
|
-
###
|
|
228
|
+
### 코드에서 사용
|
|
127
229
|
|
|
128
230
|
```typescript
|
|
129
|
-
// server/
|
|
130
|
-
import {
|
|
231
|
+
// server/api/health.ts
|
|
232
|
+
import { defineHandler } from 'nitro/h3'
|
|
131
233
|
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
234
|
+
export default defineHandler(() => {
|
|
235
|
+
return {
|
|
236
|
+
status: 'ok',
|
|
237
|
+
environment: process.env.NODE_ENV,
|
|
238
|
+
// Railway 자동 제공 변수
|
|
239
|
+
railway: {
|
|
240
|
+
environment: process.env.RAILWAY_ENVIRONMENT,
|
|
241
|
+
service: process.env.RAILWAY_SERVICE_NAME,
|
|
136
242
|
},
|
|
137
|
-
}
|
|
243
|
+
}
|
|
138
244
|
})
|
|
139
|
-
|
|
140
|
-
export default prisma
|
|
141
245
|
```
|
|
142
246
|
|
|
143
|
-
|
|
247
|
+
### Railway 자동 제공 변수
|
|
144
248
|
|
|
145
|
-
|
|
249
|
+
| 변수 | 설명 |
|
|
250
|
+
|------|------|
|
|
251
|
+
| `PORT` | 서버 포트 (자동 할당) |
|
|
252
|
+
| `RAILWAY_ENVIRONMENT` | 환경 (production, staging 등) |
|
|
253
|
+
| `RAILWAY_SERVICE_NAME` | 서비스 이름 |
|
|
254
|
+
| `RAILWAY_PROJECT_ID` | 프로젝트 ID |
|
|
255
|
+
| `RAILWAY_DEPLOYMENT_ID` | 배포 ID |
|
|
146
256
|
|
|
147
|
-
|
|
148
|
-
// nitro.config.ts
|
|
149
|
-
import { defineNitroConfig } from 'nitro/config'
|
|
257
|
+
---
|
|
150
258
|
|
|
151
|
-
|
|
152
|
-
preset: 'node-server',
|
|
153
|
-
// Railway의 PORT 환경변수 사용
|
|
154
|
-
})
|
|
155
|
-
```
|
|
259
|
+
## 데이터베이스 연동
|
|
156
260
|
|
|
157
|
-
|
|
261
|
+
### PostgreSQL 추가
|
|
158
262
|
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
// Nitro가 자동으로 PORT 환경변수를 사용
|
|
162
|
-
```
|
|
263
|
+
1. Railway 대시보드에서 "New" → "Database" → "PostgreSQL" 선택
|
|
264
|
+
2. 자동으로 `DATABASE_URL` 환경 변수 연결
|
|
163
265
|
|
|
164
|
-
|
|
266
|
+
```typescript
|
|
267
|
+
// server/lib/db.ts
|
|
268
|
+
import { PrismaClient } from '@prisma/client'
|
|
165
269
|
|
|
166
|
-
|
|
270
|
+
// Railway의 DATABASE_URL 자동 사용
|
|
271
|
+
export const prisma = new PrismaClient()
|
|
272
|
+
```
|
|
167
273
|
|
|
168
|
-
|
|
169
|
-
2. "Deploy from GitHub repo" 선택
|
|
170
|
-
3. 저장소 선택 및 연결
|
|
171
|
-
4. 자동 배포 설정 완료
|
|
274
|
+
### Redis 추가
|
|
172
275
|
|
|
173
|
-
|
|
276
|
+
1. Railway 대시보드에서 "New" → "Database" → "Redis" 선택
|
|
277
|
+
2. `REDIS_URL` 환경 변수 자동 연결
|
|
174
278
|
|
|
175
|
-
```
|
|
176
|
-
|
|
177
|
-
|
|
279
|
+
```typescript
|
|
280
|
+
// server/lib/redis.ts
|
|
281
|
+
import { createClient } from 'redis'
|
|
178
282
|
|
|
179
|
-
|
|
180
|
-
|
|
283
|
+
const client = createClient({
|
|
284
|
+
url: process.env.REDIS_URL,
|
|
285
|
+
})
|
|
181
286
|
|
|
182
|
-
|
|
183
|
-
railway logs
|
|
287
|
+
export default client
|
|
184
288
|
```
|
|
185
289
|
|
|
186
|
-
|
|
290
|
+
---
|
|
187
291
|
|
|
188
|
-
|
|
292
|
+
## 도메인 설정
|
|
189
293
|
|
|
190
|
-
|
|
191
|
-
2. Domains 섹션
|
|
192
|
-
3. "Generate Domain" 또는 "Custom Domain" 추가
|
|
294
|
+
### 자동 도메인
|
|
193
295
|
|
|
194
|
-
|
|
296
|
+
Railway는 자동으로 도메인을 생성합니다:
|
|
297
|
+
- `your-app-production.up.railway.app`
|
|
195
298
|
|
|
196
|
-
|
|
197
|
-
# 도메인 추가
|
|
198
|
-
railway domain add example.com
|
|
299
|
+
### 커스텀 도메인
|
|
199
300
|
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
301
|
+
1. Railway 대시보드 → Settings → Domains
|
|
302
|
+
2. "Add Custom Domain" 클릭
|
|
303
|
+
3. DNS 설정:
|
|
304
|
+
```
|
|
305
|
+
CNAME your-domain.com → your-app-production.up.railway.app
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
---
|
|
203
309
|
|
|
204
310
|
## 헬스체크
|
|
205
311
|
|
|
206
|
-
###
|
|
312
|
+
### 헬스체크 엔드포인트
|
|
207
313
|
|
|
208
314
|
```typescript
|
|
209
315
|
// server/api/health.ts
|
|
210
316
|
import { defineHandler } from 'nitro/h3'
|
|
211
317
|
|
|
212
318
|
export default defineHandler(() => {
|
|
213
|
-
return {
|
|
319
|
+
return {
|
|
320
|
+
status: 'ok',
|
|
321
|
+
timestamp: new Date().toISOString(),
|
|
322
|
+
}
|
|
214
323
|
})
|
|
215
324
|
```
|
|
216
325
|
|
|
@@ -220,60 +329,51 @@ export default defineHandler(() => {
|
|
|
220
329
|
{
|
|
221
330
|
"deploy": {
|
|
222
331
|
"healthcheckPath": "/api/health",
|
|
223
|
-
"healthcheckTimeout":
|
|
332
|
+
"healthcheckTimeout": 300
|
|
224
333
|
}
|
|
225
334
|
}
|
|
226
335
|
```
|
|
227
336
|
|
|
228
|
-
|
|
337
|
+
---
|
|
229
338
|
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
Railway 대시보드에서:
|
|
233
|
-
1. Settings → Scaling
|
|
234
|
-
2. 인스턴스 수 조정
|
|
339
|
+
## CI/CD 설정
|
|
235
340
|
|
|
236
|
-
###
|
|
341
|
+
### GitHub Actions
|
|
237
342
|
|
|
238
|
-
```
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
"deploy": {
|
|
242
|
-
"numReplicas": 2
|
|
243
|
-
}
|
|
244
|
-
}
|
|
245
|
-
```
|
|
343
|
+
```yaml
|
|
344
|
+
# .github/workflows/railway.yml
|
|
345
|
+
name: Deploy to Railway
|
|
246
346
|
|
|
247
|
-
|
|
347
|
+
on:
|
|
348
|
+
push:
|
|
349
|
+
branches: [main]
|
|
248
350
|
|
|
249
|
-
|
|
351
|
+
jobs:
|
|
352
|
+
deploy:
|
|
353
|
+
runs-on: ubuntu-latest
|
|
354
|
+
steps:
|
|
355
|
+
- uses: actions/checkout@v4
|
|
250
356
|
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
railway logs -f
|
|
357
|
+
- name: Install Railway CLI
|
|
358
|
+
run: npm install -g @railway/cli
|
|
254
359
|
|
|
255
|
-
|
|
256
|
-
railway
|
|
360
|
+
- name: Deploy
|
|
361
|
+
run: railway up
|
|
362
|
+
env:
|
|
363
|
+
RAILWAY_TOKEN: ${{ secrets.RAILWAY_TOKEN }}
|
|
257
364
|
```
|
|
258
365
|
|
|
259
|
-
###
|
|
260
|
-
|
|
261
|
-
Railway 대시보드에서:
|
|
262
|
-
- CPU 사용량
|
|
263
|
-
- 메모리 사용량
|
|
264
|
-
- 네트워크 트래픽
|
|
265
|
-
- 요청 수
|
|
266
|
-
|
|
267
|
-
## CI/CD 설정
|
|
268
|
-
|
|
269
|
-
### GitHub Actions
|
|
366
|
+
### 환경별 배포
|
|
270
367
|
|
|
271
368
|
```yaml
|
|
272
|
-
|
|
369
|
+
# .github/workflows/railway-env.yml
|
|
370
|
+
name: Deploy to Railway (Multi-Environment)
|
|
273
371
|
|
|
274
372
|
on:
|
|
275
373
|
push:
|
|
276
|
-
branches:
|
|
374
|
+
branches:
|
|
375
|
+
- main
|
|
376
|
+
- staging
|
|
277
377
|
|
|
278
378
|
jobs:
|
|
279
379
|
deploy:
|
|
@@ -284,33 +384,92 @@ jobs:
|
|
|
284
384
|
- name: Install Railway CLI
|
|
285
385
|
run: npm install -g @railway/cli
|
|
286
386
|
|
|
287
|
-
- name: Deploy
|
|
288
|
-
|
|
387
|
+
- name: Deploy to Production
|
|
388
|
+
if: github.ref == 'refs/heads/main'
|
|
389
|
+
run: railway up --environment production
|
|
289
390
|
env:
|
|
290
391
|
RAILWAY_TOKEN: ${{ secrets.RAILWAY_TOKEN }}
|
|
392
|
+
|
|
393
|
+
- name: Deploy to Staging
|
|
394
|
+
if: github.ref == 'refs/heads/staging'
|
|
395
|
+
run: railway up --environment staging
|
|
396
|
+
env:
|
|
397
|
+
RAILWAY_TOKEN: ${{ secrets.RAILWAY_TOKEN }}
|
|
398
|
+
```
|
|
399
|
+
|
|
400
|
+
---
|
|
401
|
+
|
|
402
|
+
## 모니터링
|
|
403
|
+
|
|
404
|
+
### 로그 확인
|
|
405
|
+
|
|
406
|
+
```bash
|
|
407
|
+
# CLI로 로그 확인
|
|
408
|
+
railway logs
|
|
409
|
+
|
|
410
|
+
# 실시간 로그
|
|
411
|
+
railway logs -f
|
|
412
|
+
|
|
413
|
+
# 특정 서비스 로그
|
|
414
|
+
railway logs --service my-service
|
|
291
415
|
```
|
|
292
416
|
|
|
293
|
-
###
|
|
417
|
+
### 메트릭 확인
|
|
418
|
+
|
|
419
|
+
Railway 대시보드에서 확인 가능:
|
|
420
|
+
- CPU 사용량
|
|
421
|
+
- 메모리 사용량
|
|
422
|
+
- 네트워크 트래픽
|
|
423
|
+
- 요청 수
|
|
424
|
+
|
|
425
|
+
---
|
|
426
|
+
|
|
427
|
+
## 비용 최적화
|
|
294
428
|
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
429
|
+
### Hobby Plan 활용
|
|
430
|
+
|
|
431
|
+
```toml
|
|
432
|
+
# railway.toml
|
|
433
|
+
[deploy]
|
|
434
|
+
# 유휴 시 슬립 (Hobby Plan)
|
|
435
|
+
sleepAfterInactivity = 300 # 5분 후 슬립
|
|
436
|
+
```
|
|
437
|
+
|
|
438
|
+
### 리소스 제한
|
|
439
|
+
|
|
440
|
+
Railway 대시보드에서 설정:
|
|
441
|
+
- Memory Limit: 512MB (시작점)
|
|
442
|
+
- Replicas: 1 (시작점)
|
|
443
|
+
|
|
444
|
+
---
|
|
298
445
|
|
|
299
446
|
## 트러블슈팅
|
|
300
447
|
|
|
301
|
-
###
|
|
448
|
+
### 일반적인 문제
|
|
449
|
+
|
|
450
|
+
| 문제 | 원인 | 해결 |
|
|
451
|
+
|------|------|------|
|
|
452
|
+
| 빌드 실패 | 의존성 오류 | `yarn.lock` 커밋 확인 |
|
|
453
|
+
| 포트 바인딩 실패 | 하드코딩된 포트 | `process.env.PORT` 사용 |
|
|
454
|
+
| 메모리 초과 | 메모리 누수 | 리소스 제한 증가 또는 코드 최적화 |
|
|
455
|
+
| 헬스체크 실패 | 엔드포인트 없음 | `/health` 엔드포인트 추가 |
|
|
456
|
+
|
|
457
|
+
### 디버깅
|
|
302
458
|
|
|
303
459
|
```bash
|
|
304
|
-
# 로컬에서
|
|
305
|
-
|
|
460
|
+
# 로컬에서 Railway 환경 시뮬레이션
|
|
461
|
+
railway run yarn dev
|
|
306
462
|
|
|
307
|
-
#
|
|
308
|
-
|
|
463
|
+
# 환경 변수 확인
|
|
464
|
+
railway variables
|
|
465
|
+
|
|
466
|
+
# 서비스 상태 확인
|
|
467
|
+
railway status
|
|
309
468
|
```
|
|
310
469
|
|
|
311
|
-
### 포트 바인딩
|
|
470
|
+
### 포트 바인딩
|
|
312
471
|
|
|
313
|
-
Railway는 `PORT` 환경변수를 자동
|
|
472
|
+
Railway는 `PORT` 환경변수를 자동 설정합니다:
|
|
314
473
|
|
|
315
474
|
```typescript
|
|
316
475
|
// ❌ 잘못된 예
|
|
@@ -320,19 +479,7 @@ const port = 3000
|
|
|
320
479
|
const port = process.env.PORT || 3000
|
|
321
480
|
```
|
|
322
481
|
|
|
323
|
-
### 메모리
|
|
324
|
-
|
|
325
|
-
```json
|
|
326
|
-
// railway.json
|
|
327
|
-
{
|
|
328
|
-
"deploy": {
|
|
329
|
-
"restartPolicyType": "ON_FAILURE",
|
|
330
|
-
"restartPolicyMaxRetries": 10
|
|
331
|
-
}
|
|
332
|
-
}
|
|
333
|
-
```
|
|
334
|
-
|
|
335
|
-
Node.js 메모리 제한 설정:
|
|
482
|
+
### 메모리 설정
|
|
336
483
|
|
|
337
484
|
```json
|
|
338
485
|
// package.json
|
|
@@ -343,6 +490,8 @@ Node.js 메모리 제한 설정:
|
|
|
343
490
|
}
|
|
344
491
|
```
|
|
345
492
|
|
|
493
|
+
---
|
|
494
|
+
|
|
346
495
|
## 프로젝트 구조
|
|
347
496
|
|
|
348
497
|
```
|
|
@@ -357,8 +506,11 @@ my-app/
|
|
|
357
506
|
└── railway.json
|
|
358
507
|
```
|
|
359
508
|
|
|
509
|
+
---
|
|
510
|
+
|
|
360
511
|
## 참고 자료
|
|
361
512
|
|
|
513
|
+
- [TanStack Start Hosting](https://tanstack.com/start/latest/docs/framework/react/hosting)
|
|
362
514
|
- [Railway 공식 문서](https://docs.railway.app)
|
|
363
515
|
- [Railway CLI](https://docs.railway.app/reference/cli-api)
|
|
364
|
-
- [Nitro Node
|
|
516
|
+
- [Nitro Node Preset](https://nitro.build/deploy/providers/node)
|