diff --git a/.github/workflows/docker-deploy.yml b/.github/workflows/docker-deploy.yml new file mode 100644 index 00000000..321459f7 --- /dev/null +++ b/.github/workflows/docker-deploy.yml @@ -0,0 +1,70 @@ +# 워크플로우의 이름 +name: Deploy Next.js to Server With Docker Image + +# 워크플로우가 실행될 조건 +on: + pull_request: + branches: ['main', 'develop'] + workflow_dispatch: + +# 실행될 작업들 +jobs: + build-and-deploy: + # 작업이 실행될 환경 + runs-on: self-hosted + + # 작업의 단계들 + steps: + # 코드 체크아웃 + - name: Checkout code + uses: actions/checkout@v4 + + - name: '🔧 Disable Docker credential helper' + run: | + echo "인증 정보 도우미 설정을 제거합니다." + jq -n 'del(.credsStore)' | tee ~/.docker/config.json > /dev/null + + # Docker Hub 로그인 + # GitHub Secrets에 DOCKERHUB_USERNAME와 DOCKERHUB_TOKEN를 등록해야 합니다. + - name: Docker Hub 로그인 + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + # Docker Buildx 설정 (멀티-플랫폼 빌드 지원) + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + # Docker 이미지 빌드 및 푸시 + - name: Build and push Docker image + uses: docker/build-push-action@v6 + with: + context: . + file: ./scripts/docker/Dockerfile + push: true + tags: | + ${{ secrets.DOCKERHUB_USERNAME }}/${{ secrets.DOCKER_REPOSITORY_NAME}}:latest + ${{ secrets.DOCKERHUB_USERNAME }}/${{ secrets.DOCKER_REPOSITORY_NAME}}:${{ github.sha }} + + # SSH를 통해 서버에 배포 + # GitHub Secrets에 DEPLOY_HOST, DEPLOY_USERNAME, DEPLOY_KEY, DEPLOY_PORT를 등록해야 합니다. + - name: SSH 접속 및 스크립트 실행 + uses: appleboy/ssh-action@v1 + with: + host: ${{ secrets.SERVER_SSH_HOST }} + username: ${{ secrets.SERVER_SSH_USERNAME }} + key: ${{ secrets.SERVER_SSH_PRIVATE_KEY }} + port: ${{ secrets.SERVER_SSH_PORT }} + script: | + bash -c ' + echo "✅ SSH Connected ..." + echo "👤 Current User: $(whoami)" + echo "🖥️ Host Name: $(hostname)" + echo "⏰ Current Time: $(date)" + echo "📁 Current Directory: $(pwd)" + docker stop ${{ secrets.SERVER_DOCKER_CONTAINER_NAME }} || true + docker rm ${{ secrets.SERVER_DOCKER_CONTAINER_NAME }} || true + docker pull ${{ secrets.DOCKERHUB_USERNAME }}/${{ secrets.DOCKER_REPOSITORY_NAME }}:latest + docker run -d -p ${{ secrets.DOCKER_HOST_PORT }}:${{ secrets.DOCKER_CONTAINER_PORT }} --name ${{ secrets.SERVER_DOCKER_CONTAINER_NAME }} --restart always ${{ secrets.DOCKERHUB_USERNAME }}/${{ secrets.DOCKER_REPOSITORY_NAME}}:latest + ' diff --git a/.github/workflows/self-hosted-test.yml b/.github/workflows/self-hosted-test.yml new file mode 100644 index 00000000..a3122491 --- /dev/null +++ b/.github/workflows/self-hosted-test.yml @@ -0,0 +1,26 @@ +name: Test Workflow + +# 워크플로우가 실행될 조건 +on: + pull_request: + branches: ['main', 'develop'] + workflow_dispatch: + +jobs: + test: + runs-on: self-hosted + steps: + - name: check environment + run: | + bash -c ' + echo "✅ SSH Connected ..." + echo "👤 Current User: $(whoami)" + echo "🖥️ Host Name: $(hostname)" + echo "⏰ Current Time: $(date)" + echo "📁 Current Directory: $(pwd)" + echo "🐳 Docker Version: $(docker --version)" + echo "📦 Installed Packages: $(npm list -g --depth=0)" + cd ~/GitHub + echo "📂 Current Directory: $(pwd)" + echo "📂 Directory Contents: $(ls -la)" + ' diff --git a/scripts/docker/Dockerfile b/scripts/docker/Dockerfile new file mode 100644 index 00000000..b295ce51 --- /dev/null +++ b/scripts/docker/Dockerfile @@ -0,0 +1,23 @@ +FROM node:24-alpine AS builder +WORKDIR /app + +RUN corepack enable && corepack prepare pnpm@latest --activate + +COPY package*.json pnpm*.yaml ./ +RUN pnpm install --frozen-lockfile --ignore-scripts +COPY . . +RUN pnpm run build + +FROM node:24-alpine +WORKDIR /app + +RUN corepack enable && corepack prepare pnpm@latest --activate + +COPY --from=builder /app/.next ./.next +COPY --from=builder /app/node_modules ./node_modules +COPY --from=builder /app/package.json ./package.json +COPY --from=builder /app/public ./public + +EXPOSE 3000 + +CMD ["pnpm", "start"] \ No newline at end of file