@kood/claude-code 0.1.2 → 0.1.3
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 +12 -3
- 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/deployment/cloudflare.md +537 -190
- package/templates/hono/docs/deployment/docker.md +517 -0
- package/templates/hono/docs/deployment/index.md +181 -213
- package/templates/hono/docs/deployment/railway.md +416 -0
- package/templates/hono/docs/deployment/vercel.md +572 -0
- package/templates/hono/docs/git/git.md +285 -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 -0
- 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/git/git.md +307 -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/deployment/cloudflare.md +234 -51
- package/templates/tanstack-start/docs/deployment/index.md +322 -32
- package/templates/tanstack-start/docs/deployment/nitro.md +201 -20
- package/templates/tanstack-start/docs/deployment/railway.md +305 -153
- package/templates/tanstack-start/docs/deployment/vercel.md +353 -78
- package/templates/tanstack-start/docs/git/{index.md → git.md} +81 -7
- 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 -1
- package/templates/tanstack-start/docs/library/prisma/schema.md +123 -25
- 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
|
@@ -0,0 +1,517 @@
|
|
|
1
|
+
# Nitro v3 - Docker 배포
|
|
2
|
+
|
|
3
|
+
> **상위 문서**: [배포 가이드](./index.md)
|
|
4
|
+
|
|
5
|
+
Docker를 사용하여 Hono + Nitro 애플리케이션을 컨테이너로 배포합니다.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 🚀 Quick Reference (복사용)
|
|
10
|
+
|
|
11
|
+
```dockerfile
|
|
12
|
+
# Dockerfile
|
|
13
|
+
FROM node:20-alpine AS base
|
|
14
|
+
|
|
15
|
+
FROM base AS deps
|
|
16
|
+
WORKDIR /app
|
|
17
|
+
COPY package.json pnpm-lock.yaml ./
|
|
18
|
+
RUN corepack enable pnpm && pnpm install --frozen-lockfile
|
|
19
|
+
|
|
20
|
+
FROM base AS builder
|
|
21
|
+
WORKDIR /app
|
|
22
|
+
COPY --from=deps /app/node_modules ./node_modules
|
|
23
|
+
COPY . .
|
|
24
|
+
RUN corepack enable pnpm && pnpm run build
|
|
25
|
+
|
|
26
|
+
FROM base AS runner
|
|
27
|
+
WORKDIR /app
|
|
28
|
+
RUN addgroup --system --gid 1001 nodejs && \
|
|
29
|
+
adduser --system --uid 1001 hono
|
|
30
|
+
COPY --from=builder --chown=hono:nodejs /app/.output ./.output
|
|
31
|
+
USER hono
|
|
32
|
+
EXPOSE 3000
|
|
33
|
+
ENV PORT=3000 NODE_ENV=production
|
|
34
|
+
CMD ["node", ".output/server/index.mjs"]
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
# 빌드 및 실행
|
|
39
|
+
docker build -t my-hono-app .
|
|
40
|
+
docker run -p 3000:3000 my-hono-app
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
## Nitro 설정
|
|
46
|
+
|
|
47
|
+
### nitro.config.ts
|
|
48
|
+
|
|
49
|
+
```typescript
|
|
50
|
+
// nitro.config.ts
|
|
51
|
+
// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
52
|
+
// Docker 배포용 Nitro 설정
|
|
53
|
+
// Node.js 서버로 빌드됩니다
|
|
54
|
+
// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
55
|
+
import { defineNitroConfig } from "nitro/config";
|
|
56
|
+
|
|
57
|
+
export default defineNitroConfig({
|
|
58
|
+
// Node.js 서버 preset
|
|
59
|
+
preset: "node",
|
|
60
|
+
|
|
61
|
+
// 호환성 날짜
|
|
62
|
+
compatibilityDate: "2024-09-19",
|
|
63
|
+
|
|
64
|
+
// 소스 디렉토리
|
|
65
|
+
srcDir: "src",
|
|
66
|
+
|
|
67
|
+
// 빌드 출력
|
|
68
|
+
output: {
|
|
69
|
+
dir: ".output",
|
|
70
|
+
},
|
|
71
|
+
|
|
72
|
+
// Node.js 설정
|
|
73
|
+
node: {
|
|
74
|
+
// 압축 활성화
|
|
75
|
+
compress: true,
|
|
76
|
+
},
|
|
77
|
+
});
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
## Dockerfile (상세)
|
|
83
|
+
|
|
84
|
+
### 멀티스테이지 빌드
|
|
85
|
+
|
|
86
|
+
```dockerfile
|
|
87
|
+
# Dockerfile
|
|
88
|
+
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
89
|
+
# Hono + Nitro 멀티스테이지 Docker 빌드
|
|
90
|
+
# 최적화된 프로덕션 이미지 생성
|
|
91
|
+
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
92
|
+
|
|
93
|
+
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
94
|
+
# Stage 1: 베이스 이미지
|
|
95
|
+
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
96
|
+
FROM node:20-alpine AS base
|
|
97
|
+
|
|
98
|
+
# libc6-compat: 일부 네이티브 모듈 호환성을 위해 필요
|
|
99
|
+
RUN apk add --no-cache libc6-compat
|
|
100
|
+
|
|
101
|
+
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
102
|
+
# Stage 2: 의존성 설치
|
|
103
|
+
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
104
|
+
FROM base AS deps
|
|
105
|
+
WORKDIR /app
|
|
106
|
+
|
|
107
|
+
# 패키지 매니저 파일 복사
|
|
108
|
+
COPY package.json pnpm-lock.yaml ./
|
|
109
|
+
|
|
110
|
+
# pnpm 활성화 및 의존성 설치
|
|
111
|
+
RUN corepack enable pnpm && \
|
|
112
|
+
pnpm install --frozen-lockfile --prod=false
|
|
113
|
+
|
|
114
|
+
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
115
|
+
# Stage 3: 빌드
|
|
116
|
+
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
117
|
+
FROM base AS builder
|
|
118
|
+
WORKDIR /app
|
|
119
|
+
|
|
120
|
+
# 의존성 복사
|
|
121
|
+
COPY --from=deps /app/node_modules ./node_modules
|
|
122
|
+
|
|
123
|
+
# 소스 코드 복사
|
|
124
|
+
COPY . .
|
|
125
|
+
|
|
126
|
+
# Nitro 빌드
|
|
127
|
+
RUN corepack enable pnpm && \
|
|
128
|
+
pnpm run build && \
|
|
129
|
+
pnpm store prune
|
|
130
|
+
|
|
131
|
+
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
132
|
+
# Stage 4: 프로덕션 러너
|
|
133
|
+
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
134
|
+
FROM base AS runner
|
|
135
|
+
WORKDIR /app
|
|
136
|
+
|
|
137
|
+
# 보안: 비-root 사용자 생성
|
|
138
|
+
RUN addgroup --system --gid 1001 nodejs && \
|
|
139
|
+
adduser --system --uid 1001 hono
|
|
140
|
+
|
|
141
|
+
# 빌드 결과물만 복사 (최소화된 이미지)
|
|
142
|
+
COPY --from=builder --chown=hono:nodejs /app/.output ./.output
|
|
143
|
+
|
|
144
|
+
# 비-root 사용자로 전환
|
|
145
|
+
USER hono
|
|
146
|
+
|
|
147
|
+
# 포트 설정
|
|
148
|
+
EXPOSE 3000
|
|
149
|
+
|
|
150
|
+
# 환경 변수
|
|
151
|
+
ENV PORT=3000
|
|
152
|
+
ENV NODE_ENV=production
|
|
153
|
+
ENV HOST=0.0.0.0
|
|
154
|
+
|
|
155
|
+
# 헬스체크
|
|
156
|
+
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
|
|
157
|
+
CMD wget --no-verbose --tries=1 --spider http://localhost:3000/health || exit 1
|
|
158
|
+
|
|
159
|
+
# 서버 실행
|
|
160
|
+
CMD ["node", ".output/server/index.mjs"]
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
---
|
|
164
|
+
|
|
165
|
+
## .dockerignore
|
|
166
|
+
|
|
167
|
+
```dockerignore
|
|
168
|
+
# .dockerignore
|
|
169
|
+
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
170
|
+
# Docker 빌드 시 제외할 파일
|
|
171
|
+
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
172
|
+
|
|
173
|
+
# 의존성
|
|
174
|
+
node_modules/
|
|
175
|
+
|
|
176
|
+
# 빌드 결과물
|
|
177
|
+
.output/
|
|
178
|
+
dist/
|
|
179
|
+
|
|
180
|
+
# 환경 파일
|
|
181
|
+
.env
|
|
182
|
+
.env.*
|
|
183
|
+
!.env.example
|
|
184
|
+
|
|
185
|
+
# Git
|
|
186
|
+
.git/
|
|
187
|
+
.gitignore
|
|
188
|
+
|
|
189
|
+
# IDE
|
|
190
|
+
.vscode/
|
|
191
|
+
.idea/
|
|
192
|
+
|
|
193
|
+
# 테스트
|
|
194
|
+
coverage/
|
|
195
|
+
*.test.ts
|
|
196
|
+
*.spec.ts
|
|
197
|
+
__tests__/
|
|
198
|
+
|
|
199
|
+
# 문서
|
|
200
|
+
*.md
|
|
201
|
+
docs/
|
|
202
|
+
|
|
203
|
+
# Docker
|
|
204
|
+
Dockerfile*
|
|
205
|
+
docker-compose*.yml
|
|
206
|
+
.dockerignore
|
|
207
|
+
|
|
208
|
+
# 기타
|
|
209
|
+
.DS_Store
|
|
210
|
+
*.log
|
|
211
|
+
tmp/
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
---
|
|
215
|
+
|
|
216
|
+
## Docker Compose
|
|
217
|
+
|
|
218
|
+
### docker-compose.yml
|
|
219
|
+
|
|
220
|
+
```yaml
|
|
221
|
+
# docker-compose.yml
|
|
222
|
+
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
223
|
+
# Hono + Nitro 개발/프로덕션 환경 구성
|
|
224
|
+
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
225
|
+
|
|
226
|
+
services:
|
|
227
|
+
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
228
|
+
# Hono 애플리케이션
|
|
229
|
+
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
230
|
+
app:
|
|
231
|
+
build:
|
|
232
|
+
context: .
|
|
233
|
+
dockerfile: Dockerfile
|
|
234
|
+
ports:
|
|
235
|
+
- "3000:3000"
|
|
236
|
+
environment:
|
|
237
|
+
- NODE_ENV=production
|
|
238
|
+
- DATABASE_URL=postgresql://postgres:password@db:5432/mydb
|
|
239
|
+
depends_on:
|
|
240
|
+
db:
|
|
241
|
+
condition: service_healthy
|
|
242
|
+
restart: unless-stopped
|
|
243
|
+
healthcheck:
|
|
244
|
+
test: ["CMD", "wget", "--spider", "http://localhost:3000/health"]
|
|
245
|
+
interval: 30s
|
|
246
|
+
timeout: 10s
|
|
247
|
+
retries: 3
|
|
248
|
+
|
|
249
|
+
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
250
|
+
# PostgreSQL 데이터베이스
|
|
251
|
+
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
252
|
+
db:
|
|
253
|
+
image: postgres:16-alpine
|
|
254
|
+
environment:
|
|
255
|
+
- POSTGRES_USER=postgres
|
|
256
|
+
- POSTGRES_PASSWORD=password
|
|
257
|
+
- POSTGRES_DB=mydb
|
|
258
|
+
volumes:
|
|
259
|
+
- postgres_data:/var/lib/postgresql/data
|
|
260
|
+
healthcheck:
|
|
261
|
+
test: ["CMD-SHELL", "pg_isready -U postgres"]
|
|
262
|
+
interval: 10s
|
|
263
|
+
timeout: 5s
|
|
264
|
+
retries: 5
|
|
265
|
+
|
|
266
|
+
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
267
|
+
# Redis 캐시 (선택적)
|
|
268
|
+
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
269
|
+
redis:
|
|
270
|
+
image: redis:7-alpine
|
|
271
|
+
ports:
|
|
272
|
+
- "6379:6379"
|
|
273
|
+
volumes:
|
|
274
|
+
- redis_data:/data
|
|
275
|
+
command: redis-server --appendonly yes
|
|
276
|
+
|
|
277
|
+
volumes:
|
|
278
|
+
postgres_data:
|
|
279
|
+
redis_data:
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
### 개발용 docker-compose
|
|
283
|
+
|
|
284
|
+
```yaml
|
|
285
|
+
# docker-compose.dev.yml
|
|
286
|
+
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
287
|
+
# 개발 환경 전용 구성
|
|
288
|
+
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
289
|
+
|
|
290
|
+
services:
|
|
291
|
+
app:
|
|
292
|
+
build:
|
|
293
|
+
context: .
|
|
294
|
+
dockerfile: Dockerfile.dev
|
|
295
|
+
ports:
|
|
296
|
+
- "3000:3000"
|
|
297
|
+
volumes:
|
|
298
|
+
# 소스 코드 마운트 (Hot Reload)
|
|
299
|
+
- ./src:/app/src
|
|
300
|
+
- ./nitro.config.ts:/app/nitro.config.ts
|
|
301
|
+
environment:
|
|
302
|
+
- NODE_ENV=development
|
|
303
|
+
- DATABASE_URL=postgresql://postgres:password@db:5432/mydb
|
|
304
|
+
depends_on:
|
|
305
|
+
- db
|
|
306
|
+
|
|
307
|
+
db:
|
|
308
|
+
image: postgres:16-alpine
|
|
309
|
+
environment:
|
|
310
|
+
- POSTGRES_USER=postgres
|
|
311
|
+
- POSTGRES_PASSWORD=password
|
|
312
|
+
- POSTGRES_DB=mydb
|
|
313
|
+
ports:
|
|
314
|
+
- "5432:5432"
|
|
315
|
+
volumes:
|
|
316
|
+
- postgres_data:/var/lib/postgresql/data
|
|
317
|
+
|
|
318
|
+
volumes:
|
|
319
|
+
postgres_data:
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
### 개발용 Dockerfile
|
|
323
|
+
|
|
324
|
+
```dockerfile
|
|
325
|
+
# Dockerfile.dev
|
|
326
|
+
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
327
|
+
# 개발 환경용 Dockerfile
|
|
328
|
+
# Hot Reload 지원
|
|
329
|
+
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
330
|
+
|
|
331
|
+
FROM node:20-alpine
|
|
332
|
+
|
|
333
|
+
WORKDIR /app
|
|
334
|
+
|
|
335
|
+
# 패키지 파일 복사
|
|
336
|
+
COPY package.json pnpm-lock.yaml ./
|
|
337
|
+
|
|
338
|
+
# pnpm 설치 및 의존성 설치
|
|
339
|
+
RUN corepack enable pnpm && pnpm install
|
|
340
|
+
|
|
341
|
+
# 소스 코드는 볼륨으로 마운트됨
|
|
342
|
+
|
|
343
|
+
EXPOSE 3000
|
|
344
|
+
|
|
345
|
+
# 개발 서버 실행
|
|
346
|
+
CMD ["pnpm", "run", "dev"]
|
|
347
|
+
```
|
|
348
|
+
|
|
349
|
+
---
|
|
350
|
+
|
|
351
|
+
## 빌드 및 실행 명령어
|
|
352
|
+
|
|
353
|
+
### 기본 명령어
|
|
354
|
+
|
|
355
|
+
```bash
|
|
356
|
+
# 이미지 빌드
|
|
357
|
+
docker build -t my-hono-app .
|
|
358
|
+
|
|
359
|
+
# 컨테이너 실행
|
|
360
|
+
docker run -p 3000:3000 my-hono-app
|
|
361
|
+
|
|
362
|
+
# 환경 변수와 함께 실행
|
|
363
|
+
docker run -p 3000:3000 \
|
|
364
|
+
-e DATABASE_URL="postgresql://user:pass@host:5432/db" \
|
|
365
|
+
-e API_SECRET="my-secret" \
|
|
366
|
+
my-hono-app
|
|
367
|
+
|
|
368
|
+
# 백그라운드 실행
|
|
369
|
+
docker run -d --name hono-app -p 3000:3000 my-hono-app
|
|
370
|
+
```
|
|
371
|
+
|
|
372
|
+
### Docker Compose 명령어
|
|
373
|
+
|
|
374
|
+
```bash
|
|
375
|
+
# 프로덕션 시작
|
|
376
|
+
docker compose up -d
|
|
377
|
+
|
|
378
|
+
# 개발 환경 시작
|
|
379
|
+
docker compose -f docker-compose.dev.yml up
|
|
380
|
+
|
|
381
|
+
# 로그 확인
|
|
382
|
+
docker compose logs -f app
|
|
383
|
+
|
|
384
|
+
# 컨테이너 재빌드
|
|
385
|
+
docker compose up -d --build
|
|
386
|
+
|
|
387
|
+
# 종료
|
|
388
|
+
docker compose down
|
|
389
|
+
|
|
390
|
+
# 볼륨 포함 종료 (데이터 삭제)
|
|
391
|
+
docker compose down -v
|
|
392
|
+
```
|
|
393
|
+
|
|
394
|
+
---
|
|
395
|
+
|
|
396
|
+
## CI/CD 통합
|
|
397
|
+
|
|
398
|
+
### GitHub Actions
|
|
399
|
+
|
|
400
|
+
```yaml
|
|
401
|
+
# .github/workflows/docker.yml
|
|
402
|
+
name: Docker Build & Push
|
|
403
|
+
|
|
404
|
+
on:
|
|
405
|
+
push:
|
|
406
|
+
branches: [main]
|
|
407
|
+
pull_request:
|
|
408
|
+
branches: [main]
|
|
409
|
+
|
|
410
|
+
jobs:
|
|
411
|
+
build:
|
|
412
|
+
runs-on: ubuntu-latest
|
|
413
|
+
|
|
414
|
+
steps:
|
|
415
|
+
- uses: actions/checkout@v4
|
|
416
|
+
|
|
417
|
+
- name: Set up Docker Buildx
|
|
418
|
+
uses: docker/setup-buildx-action@v3
|
|
419
|
+
|
|
420
|
+
- name: Login to Container Registry
|
|
421
|
+
uses: docker/login-action@v3
|
|
422
|
+
with:
|
|
423
|
+
registry: ghcr.io
|
|
424
|
+
username: ${{ github.actor }}
|
|
425
|
+
password: ${{ secrets.GITHUB_TOKEN }}
|
|
426
|
+
|
|
427
|
+
- name: Build and Push
|
|
428
|
+
uses: docker/build-push-action@v5
|
|
429
|
+
with:
|
|
430
|
+
context: .
|
|
431
|
+
push: ${{ github.event_name != 'pull_request' }}
|
|
432
|
+
tags: |
|
|
433
|
+
ghcr.io/${{ github.repository }}:latest
|
|
434
|
+
ghcr.io/${{ github.repository }}:${{ github.sha }}
|
|
435
|
+
cache-from: type=gha
|
|
436
|
+
cache-to: type=gha,mode=max
|
|
437
|
+
```
|
|
438
|
+
|
|
439
|
+
---
|
|
440
|
+
|
|
441
|
+
## 최적화 팁
|
|
442
|
+
|
|
443
|
+
### 이미지 크기 최소화
|
|
444
|
+
|
|
445
|
+
```dockerfile
|
|
446
|
+
# Alpine 기반 이미지 사용
|
|
447
|
+
FROM node:20-alpine
|
|
448
|
+
|
|
449
|
+
# 불필요한 파일 제외 (.dockerignore 활용)
|
|
450
|
+
|
|
451
|
+
# 프로덕션 의존성만 설치
|
|
452
|
+
RUN pnpm install --prod
|
|
453
|
+
|
|
454
|
+
# 빌드 결과물만 최종 이미지에 포함
|
|
455
|
+
COPY --from=builder /app/.output ./.output
|
|
456
|
+
```
|
|
457
|
+
|
|
458
|
+
### 빌드 캐시 활용
|
|
459
|
+
|
|
460
|
+
```dockerfile
|
|
461
|
+
# 의존성 파일 먼저 복사 (캐시 활용)
|
|
462
|
+
COPY package.json pnpm-lock.yaml ./
|
|
463
|
+
RUN pnpm install
|
|
464
|
+
|
|
465
|
+
# 소스 코드는 나중에 복사
|
|
466
|
+
COPY . .
|
|
467
|
+
RUN pnpm build
|
|
468
|
+
```
|
|
469
|
+
|
|
470
|
+
### 보안 강화
|
|
471
|
+
|
|
472
|
+
```dockerfile
|
|
473
|
+
# 비-root 사용자 사용
|
|
474
|
+
RUN adduser --system --uid 1001 hono
|
|
475
|
+
USER hono
|
|
476
|
+
|
|
477
|
+
# 읽기 전용 파일 시스템
|
|
478
|
+
# docker run --read-only my-hono-app
|
|
479
|
+
|
|
480
|
+
# 취약점 스캔
|
|
481
|
+
# docker scan my-hono-app
|
|
482
|
+
```
|
|
483
|
+
|
|
484
|
+
---
|
|
485
|
+
|
|
486
|
+
## 문제 해결
|
|
487
|
+
|
|
488
|
+
### 일반적인 문제
|
|
489
|
+
|
|
490
|
+
| 문제 | 원인 | 해결 |
|
|
491
|
+
|------|------|------|
|
|
492
|
+
| 포트 연결 실패 | HOST=0.0.0.0 미설정 | `ENV HOST=0.0.0.0` 추가 |
|
|
493
|
+
| 빌드 실패 | node_modules 누락 | .dockerignore 확인 |
|
|
494
|
+
| 권한 오류 | root 사용자 문제 | 비-root 사용자 사용 |
|
|
495
|
+
| 메모리 부족 | 이미지 크기 과다 | 멀티스테이지 빌드 사용 |
|
|
496
|
+
|
|
497
|
+
### 디버깅
|
|
498
|
+
|
|
499
|
+
```bash
|
|
500
|
+
# 컨테이너 쉘 접속
|
|
501
|
+
docker exec -it hono-app sh
|
|
502
|
+
|
|
503
|
+
# 로그 확인
|
|
504
|
+
docker logs -f hono-app
|
|
505
|
+
|
|
506
|
+
# 리소스 사용량 확인
|
|
507
|
+
docker stats hono-app
|
|
508
|
+
```
|
|
509
|
+
|
|
510
|
+
---
|
|
511
|
+
|
|
512
|
+
## 관련 문서
|
|
513
|
+
|
|
514
|
+
- [배포 가이드 개요](./index.md)
|
|
515
|
+
- [Railway 배포](./railway.md)
|
|
516
|
+
- [Vercel 배포](./vercel.md)
|
|
517
|
+
- [Cloudflare 배포](./cloudflare.md)
|