[feat] Dockerfile, docker-compose, Kubernetes 매니페스트 추가 (nginx 정적 호스팅)#114
[feat] Dockerfile, docker-compose, Kubernetes 매니페스트 추가 (nginx 정적 호스팅)#114dasomel wants to merge 2 commits into
Conversation
The repo has no container image definition or k8s manifests — the only
deployment path is 'vite dev'/'vite build' + manually copying dist to a
web server. Add a production-shaped set that serves the Vite bundle
from nginx-unprivileged.
- Dockerfile: multi-stage Node 22 -> nginx-unprivileged 1.27 Alpine.
Build stage uses 'npm ci' for reproducibility and 'npm run build'.
Runtime stage replaces the default nginx config with one that:
- listens on 8080 (matches the unprivileged image's user)
- serves the SPA with try_files fallback for HTML5 router
- caches /assets/* aggressively (Vite emits hashed filenames)
- bypasses cache for /index.html
- .dockerignore: keep build context small (node_modules/, dist/,
build/, coverage/, IDE/.env files).
- docker-compose.yml: single-service compose for demo runs, image tag
parameterised via ${APP_VERSION:-5.0.0}.
- k8s/deployment.yaml: replicas=2 RollingUpdate, runAsNonRoot (uid 101
matches nginx-unprivileged), readOnlyRootFilesystem, drop ALL,
resources sized for static serving (50m-300m CPU, 32Mi-128Mi),
separate liveness/readiness probes, ephemeral
/var/cache/nginx, /var/run, /tmp emptyDirs so the read-only root
filesystem profile works.
- k8s/service.yaml: ClusterIP exposing port 8080.
|
표준프레임워크에 대한 지속적인 참여에 대단히 감사드립니다. Dockerfile·docker-compose·k8s 매니페스트를 로컬에서 검증했습니다.
본 프로젝트의 병합 기준은 "정상 동작"입니다. 기존 워크플로(백엔드·프론트엔드를 각각 로컬 구동 → 브라우저에서 현재는 그렇지 못합니다. 프론트 번들이 API base URL을 빌드 타임에 이 end-to-end 동작의 최종 검증은 백엔드의 k8s 배포가 함께 떠야 가능합니다. 가능하면 백엔드까지 함께 올려
이번에 추가된 Docker/k8s 배포 경로에 대한 안내가 없습니다.
이하 사항 반영 확인 후 추가 검증을 진행하도록 하겠습니다. |
정적 번들이 API base 를 빌드 시점에 http://localhost:8080 으로 고정해 클러스터/컨테이너에서 localhost 가 클라이언트 자신을 가리켜 로그인·CRUD 가 동작하지 않던 문제를 해결한다. - src/config.js: SERVER_URL 을 동일 출처 상대경로(/api)로 변경. 필요 시 VITE_APP_API_BASE_URL 로 절대 URL 지정 가능. - Dockerfile: nginx 에 /api/ 리버스 프록시 location 추가. prefix 를 제거해 백엔드(context-path=/)로 전달하고, 백엔드 주소는 BACKEND_URL 환경변수를 기동 시 envsubst 로 치환(nginx 템플릿 사용). - vite.config.js: 개발 서버에도 동일한 /api 프록시를 추가해 npm run dev 호환. - docker-compose.yml: fullstack 프로파일로 백엔드+MySQL 동반 기동 구성 추가. 브라우저 → nginx(/api) → 백엔드 → DB 경로로 로그인·CRUD 통합 동작. - k8s/deployment.yaml: BACKEND_URL 환경변수 및 conf.d 쓰기 볼륨 추가 (readOnlyRootFilesystem 환경에서 envsubst 출력 기록). - README: 이미지 빌드(BuildKit), docker compose 단독/통합 실행, k8s 배포 및 port-forward 접속, 백엔드 연동 방법 문서화.
|
두 가지 모두 반영했습니다. 1. 배포 시 백엔드 연동 2. 문서 보강 검증: |
변경 사유
컨테이너 이미지/k8s 매니페스트가 없어
vite build후 수동 배포만 가능합니다.nginxinc/nginx-unprivileged:1.27-alpine기반의 운영 가능한 최소 산출물을 추가합니다.변경 내용
Dockerfile— multi-stagenode:22-alpine→nginxinc/nginx-unprivileged:1.27-alpinenpm ci+npm run buildtry_files로 React Router HTML5 history mode 지원/assets/*는 1년 immutable 캐시/index.html은 no-cache.dockerignore—node_modules/,dist/,coverage/, IDE/.env 등 제외docker-compose.yml— 단일 서비스,${APP_VERSION:-5.0.0}변수화k8s/deployment.yaml— 2 replica RollingUpdate, runAsNonRoot(uid 101 nginx-unprivileged 기본), readOnlyRootFilesystem, drop ALL, 정적 서빙에 맞춘 리소스(50m–300m CPU / 32Mi–128Mi), liveness/readiness probe,/var/cache/nginx//var/run//tmpemptyDir로 read-only root 호환k8s/service.yaml— ClusterIP 8080영향 범위
package.json변경 없음image:태그는 예시 — 운영 환경 레지스트리로 교체 필요체크리스트