ํฐ์คํ ๋ฆฌ ๋ทฐ
๐ NestJS ๋ฐฑ์๋ ๊ฐ๋ฐ: ๊ธฐ์ด๋ถํฐ ์ค์ ๊น์ง - NestJS Docker ๋ฐฐํฌ ๋ฐ CI/CD ์ค์ ๊ฐ์ด๋
octo54 2025. 3. 24. 10:06๐ NestJS ๋ฐฑ์๋ ๊ฐ๋ฐ: ๊ธฐ์ด๋ถํฐ ์ค์ ๊น์ง - NestJS Docker ๋ฐฐํฌ ๋ฐ CI/CD ์ค์ ๊ฐ์ด๋
์ ํ๋ฆฌ์ผ์ด์
์ด ๊ฐ๋ฐ๋์๋ค๋ฉด, ์ด์ ๋ **์์ ์ ์ผ๋ก ๋ฐฐํฌํ๊ณ ์ง์์ ์ผ๋ก ํตํฉ/๋ฐฐํฌ(CI/CD)**ํ๋ ๊ณผ์ ์ด ์ค์ํฉ๋๋ค.
์ด๋ฒ ๊ธ์์๋ NestJS ์ ํ๋ฆฌ์ผ์ด์
์ Docker๋ก ์ปจํ
์ด๋ํํ๊ณ , GitHub Actions๋ฅผ ํ์ฉํ CI/CD ํ์ดํ๋ผ์ธ์ ๊ตฌ์ถํ๋ ๋ฐฉ๋ฒ์ ๋ค๋ฃน๋๋ค. ๐
14.1 NestJS Docker ๋ฐฐํฌ๊ฐ ํ์ํ ์ด์
โ ์ด๋์๋ ๋์ผํ ํ๊ฒฝ์ผ๋ก ์คํ ๊ฐ๋ฅ
โ ๊ฐ๋ฐ, ํ
์คํธ, ์ด์ ํ๊ฒฝ ๊ฐ ์ฐจ์ด๋ฅผ ์ต์ํ
โ CI/CD ๋๊ตฌ์ ์ฝ๊ฒ ํตํฉ
14.2 NestJS Dockerfile ์์ฑ
๐ Dockerfile
# ๋ฒ ์ด์ค ์ด๋ฏธ์ง ์ค์
FROM node:18-alpine
# ์ฑ ๋๋ ํ ๋ฆฌ ์์ฑ ๋ฐ ์ค์
WORKDIR /app
# ์ข
์์ฑ ์ค์น๋ฅผ ์ํ package ํ์ผ ๋ณต์ฌ
COPY package*.json ./
# ํจํค์ง ์ค์น
RUN npm install
# NestJS ์ฝ๋ ๋ณต์ฌ
COPY . .
# ์ฑ ๋น๋
RUN npm run build
# ํฌํธ ์ค์
EXPOSE 3000
# ์ฑ ์คํ
CMD ["node", "dist/main"]
14.3 .dockerignore ํ์ผ ์ถ๊ฐ
๐ .dockerignore
node_modules
dist
.git
.env
โ
๋น๋ ์ ํ์ ์๋ ํ์ผ ์ ์ธ
โ
๋น๋ ์๋ ํฅ์, ๋ณด์ ์ํ ๊ฐ์
14.4 Docker Compose๋ก PostgreSQL ์ฐ๋
๐ docker-compose.yml
version: '3.8'
services:
app:
build: .
ports:
- '3000:3000'
environment:
- DATABASE_URL=postgres://postgres:password@db:5432/nest
depends_on:
- db
db:
image: postgres:15
restart: always
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: password
POSTGRES_DB: nest
ports:
- '5432:5432'
๐ก NestJS์ .env์ DATABASE_URL์ ์ค์ ํด ๋๋ฉด ORM๊ณผ ์ฐ๋ ๊ฐ๋ฅ
14.5 ๋ก์ปฌ์์ Docker ์คํ
docker-compose up --build
โ
์ฑ์ localhost:3000์์ ์คํ
โ
PostgreSQL์ localhost:5432์์ ์ฐ๊ฒฐ ๊ฐ๋ฅ
14.6 GitHub Actions๋ก CI/CD ํ์ดํ๋ผ์ธ ๊ตฌ์ฑ
๐ .github/workflows/deploy.yml
name: NestJS CI/CD
on:
push:
branches:
- main
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
- name: ์ฝ๋ ์ฒดํฌ์์
uses: actions/checkout@v3
- name: Node ์ค์น
uses: actions/setup-node@v3
with:
node-version: '18'
- name: ์์กด์ฑ ์ค์น
run: npm install
- name: ํ
์คํธ ์คํ
run: npm run test
- name: Docker ์ด๋ฏธ์ง ๋น๋
run: docker build -t my-nest-app .
- name: DockerHub ๋ก๊ทธ์ธ
run: echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u "${{ secrets.DOCKER_USERNAME }}" --password-stdin
- name: Docker ์ด๋ฏธ์ง ํธ์
run: docker tag my-nest-app docker.io/${{ secrets.DOCKER_USERNAME }}/my-nest-app:latest && docker push docker.io/${{ secrets.DOCKER_USERNAME }}/my-nest-app:latest
โ ๊ตฌ์ฑ ์์ฝ
- main ๋ธ๋์น์ push ์ ์๋ ์คํ
- ์์กด์ฑ ์ค์น → ํ ์คํธ → Docker ๋น๋ → DockerHub ํธ์
- secrets๋ GitHub Repository → Settings → Secrets์์ ๋ฑ๋ก
14.7 CI/CD ํ ์๋ฒ์์ Docker๋ก ๋ฐฐํฌ
โ ์๋ฒ์ ์ ์ ํ:
docker pull <your-username>/my-nest-app:latest
docker stop nest-app || true
docker rm nest-app || true
docker run -d --name nest-app -p 3000:3000 <your-username>/my-nest-app:latest
โ
์ต์ ์ด๋ฏธ์ง๋ก ์ฑ ์ฌ์คํ
โ
๋ฌด์ค๋จ ๋ฐฐํฌ๋ฅผ ์ํด Nginx + Reverse Proxy + Zero Downtime ์ ๋ต๋ ๊ณ ๋ ค ๊ฐ๋ฅ
14.8 ์ค์ ์ด์ ํ
โ .env๋ Git์ ํฌํจ์ํค์ง ๋ง๊ณ secrets ๋๋ Volume์ผ๋ก ๊ด๋ฆฌ
โ healthcheck๋ฅผ ํตํด ์ปจํ
์ด๋ ์ํ ๋ชจ๋ํฐ๋ง
โ Slack, Discord ๋ฑ์ผ๋ก ๋ฐฐํฌ ์ฑ๊ณต/์คํจ ์๋ฆผ ์ฐ๋
โ Rollback์ ์ํด ์ด์ ๋ฒ์ ํ๊ทธ ๊ด๋ฆฌ
14.9 ๊ฒฐ๋ก : NestJS + Docker + GitHub Actions์ผ๋ก ์๋ํ๋ ๋ฐฑ์๋ ์ด์ ๋ง๋ค๊ธฐ
โ
Docker๋ก ์ด๋์๋ ์คํ ๊ฐ๋ฅํ NestJS ํ๊ฒฝ ๊ตฌ์ฑ
โ
PostgreSQL ํฌํจํ ํตํฉ ํ๊ฒฝ ๊ตฌ์ถ (docker-compose)
โ
GitHub Actions๋ก ํ
์คํธ ๋ฐ ์๋ ๋ฐฐํฌ ํ์ดํ๋ผ์ธ ๊ตฌ์ถ
โ
์ค์ ํ๊ฒฝ์์๋ ํ์ฅ์ฑ๊ณผ ์ฌํ์ฑ์ ๊ฐ์ถ ์ด์ ๊ฐ๋ฅ
๋ค์ ๊ธ์์๋ NestJS์์์ ์ฑ๋ฅ ์ต์ ํ ๋ฐ ๋ณด์ ๋ฒ ์คํธ ํ๋ํฐ์ค๋ฅผ ์๊ฐํฉ๋๋ค. ๐
๐ ๋ค์ ๊ธ ์๊ณ : NestJS ์ฑ๋ฅ ์ต์ ํ์ ๋ณด์ ์ ๋ต
๐ ๋ค์ ํธ: 15. NestJS ์ฑ๋ฅ ์ต์ ํ & ๋ณด์ ๊ฐ์ด๋
'study > ๋ฐฑ์๋' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
- Total
- Today
- Yesterday
- seo ์ต์ ํ 10๊ฐ
- CI/CD
- ๋ฐฑ์๋
- AI์ฑ๋ด
- ๋ฐฑ์๋๊ฐ๋ฐ
- rag
- fastapi
- Next.js
- SEO์ต์ ํ
- LangChain
- ์น๊ฐ๋ฐ
- PostgreSQL
- AI ์๋ํ
- NestJS
- github
- Ktor
- App Router
- ์ค๋งํธ ์ปจํธ๋ํธ
- REACT
- ํ๋ก ํธ์๋
- Prisma
- gatsbyjs
- nodejs
- Webpack
- nextJS
- ๊ด๋ฆฌ์
- llm
- kotlin
- ๊ฐ๋ฐ๋ธ๋ก๊ทธ
- Docker
์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |