diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..ad65603 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,8 @@ +node_modules +.next +.git +.env* +*.log +.DS_Store +coverage +dist diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 14d774d..d5664c6 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -9,33 +9,44 @@ jobs: deploy: if: github.event.pull_request.merged == true runs-on: self-hosted + timeout-minutes: 10 steps: - uses: actions/checkout@v3 - name: Deploy to EC2 run: | - set -e # 에러 시 중단 + set -e # 배포 로깅 echo "🚀 Starting deployment..." echo "📝 PR: #${{ github.event.pull_request.number }}" echo "🔄 Commit: ${{ github.sha }}" + # 메모리 정리 + echo "🧹 Cleaning up Docker resources..." + docker system prune -f + # 브랜치별 환경 설정 if [ "${{ github.event.pull_request.base.ref }}" = "main" ]; then CONTAINER_NAME="app-prod" ENV_FILE="app-prod.env" + OTHER_CONTAINER="app-dev" echo "🚀 Deploying to PRODUCTION" elif [ "${{ github.event.pull_request.base.ref }}" = "develop" ]; then CONTAINER_NAME="app-dev" ENV_FILE="app-dev.env" + OTHER_CONTAINER="app-prod" echo "🧪 Deploying to DEVELOPMENT" fi # 배포 디렉토리 설정 DEPLOY_DIR="/home/ubuntu/coplan/app" + # 메모리 확보를 위해 다른 컨테이너 중지 + echo "⏸️ Stopping other container to free memory..." + docker compose stop ${OTHER_CONTAINER} || true + # rsync로 파일 동기화 echo "📂 Synchronizing files..." rsync -av \ @@ -58,12 +69,16 @@ jobs: # Docker 이미지 빌드 echo "🔨 Building Docker image..." - docker compose build ${CONTAINER_NAME} + DOCKER_BUILDKIT=1 docker compose build ${CONTAINER_NAME} # 컨테이너 교체 (무중단 배포) echo "🔄 Updating container..." docker compose up -d --no-deps ${CONTAINER_NAME} + # 다른 컨테이너 재시작 + echo "🔄 Restarting other container..." + docker compose up -d ${OTHER_CONTAINER} + # 헬스체크 echo "🏥 Health check..." sleep 10 diff --git a/Dockerfile b/Dockerfile index ed3f993..4094a32 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,21 +1,29 @@ -FROM node:18-alpine - +# 1단계: 모든 의존성 설치 (캐시용) +FROM node:18-alpine AS deps WORKDIR /app - -# 의존성 파일 복사 COPY package*.json ./ +RUN npm ci -# 모든 의존성 설치 (dev 포함) -RUN npm ci +# 2단계: 소스 빌드 +FROM node:18-alpine AS builder +WORKDIR /app +COPY --from=deps /app/node_modules ./node_modules +COPY . . +RUN npm run build -# 소스 코드 복사 -COPY . . +# 3단계: 프로덕션 실행 환경 +FROM node:18-alpine AS runner +WORKDIR /app +ENV NODE_ENV production -# Next.js 빌드 -RUN npm run build +# 프로덕션 의존성만 재설치 +COPY package*.json ./ +RUN npm ci --only=production -# 포트 설정 -EXPOSE 3000 +# 빌드 결과물만 복사 +COPY --from=builder /app/.next ./.next +COPY --from=builder /app/public ./public +COPY --from=builder /app/next.config.mjs ./ -# 서버 실행 +EXPOSE 3000 CMD ["npm", "start"] \ No newline at end of file