티스토리 뷰

반응형

📌 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 성능 최적화 & 보안 가이드


 

 

※ 이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/07   »
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 31
글 보관함
반응형