From 01407d871488acbb4930be3322d1d04aee1dd461 Mon Sep 17 00:00:00 2001 From: Kyeoungwoon Park Date: Tue, 12 Aug 2025 18:55:08 +0900 Subject: [PATCH 1/8] =?UTF-8?q?=E2=9C=A8=20Feat:=20docker=20ci/cd=201?= =?UTF-8?q?=EC=B0=A8=20=EC=8B=9C=EB=8F=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/docker-deploy.yml | 56 +++++++++++++++++++++++++++++ scripts/docker/Dockerfile | 23 ++++++++++++ 2 files changed, 79 insertions(+) create mode 100644 .github/workflows/docker-deploy.yml create mode 100644 scripts/docker/Dockerfile diff --git a/.github/workflows/docker-deploy.yml b/.github/workflows/docker-deploy.yml new file mode 100644 index 00000000..d7ac5cca --- /dev/null +++ b/.github/workflows/docker-deploy.yml @@ -0,0 +1,56 @@ +# 워크플로우의 이름 +name: Deploy Next.js to Server With Docker Image + +# 워크플로우가 실행될 조건 +on: + pull_request: + branches: ['main', 'develop'] + workflow_dispatch: + +# 실행될 작업들 +jobs: + build-and-deploy: + # 작업이 실행될 환경 + runs-on: ubuntu-latest + + # 작업의 단계들 + steps: + # 1. 코드 체크아웃 + - name: Checkout code + uses: actions/checkout@v4 + + # 3. 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 }} + + # 2. Docker Buildx 설정 (멀티-플랫폼 빌드 지원) + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + # 4. 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 + + # 5. 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: | + 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/scripts/docker/Dockerfile b/scripts/docker/Dockerfile new file mode 100644 index 00000000..36d57f46 --- /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-lock.yaml ./ +RUN pnpm install --frozen-lockfile +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 From a9c8a92aa9e93af322d42a911d7e09434157aa61 Mon Sep 17 00:00:00 2001 From: Kyeoungwoon Park Date: Tue, 12 Aug 2025 19:07:52 +0900 Subject: [PATCH 2/8] =?UTF-8?q?=F0=9F=94=A7=20Fix:=20pnpm*=20wildcard=20se?= =?UTF-8?q?tting?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/docker/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/docker/Dockerfile b/scripts/docker/Dockerfile index 36d57f46..f1c5c900 100644 --- a/scripts/docker/Dockerfile +++ b/scripts/docker/Dockerfile @@ -3,7 +3,7 @@ WORKDIR /app RUN corepack enable && corepack prepare pnpm@latest --activate -COPY package*.json pnpm-lock.yaml ./ +COPY package*.json pnpm*.yaml ./ RUN pnpm install --frozen-lockfile COPY . . RUN pnpm run build From 3a927ce0d77dc2ca98190eae84d54e1539daeb2d Mon Sep 17 00:00:00 2001 From: Kyeoungwoon Park Date: Tue, 12 Aug 2025 19:12:53 +0900 Subject: [PATCH 3/8] =?UTF-8?q?=F0=9F=94=A7=20Fix:=20build=20error=20with?= =?UTF-8?q?=20git=20hooks?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/docker-deploy.yml | 16 +++++++++------- scripts/docker/Dockerfile | 2 +- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/.github/workflows/docker-deploy.yml b/.github/workflows/docker-deploy.yml index d7ac5cca..858f9f94 100644 --- a/.github/workflows/docker-deploy.yml +++ b/.github/workflows/docker-deploy.yml @@ -15,11 +15,11 @@ jobs: # 작업의 단계들 steps: - # 1. 코드 체크아웃 + # 코드 체크아웃 - name: Checkout code uses: actions/checkout@v4 - # 3. Docker Hub 로그인 + # Docker Hub 로그인 # GitHub Secrets에 DOCKERHUB_USERNAME와 DOCKERHUB_TOKEN를 등록해야 합니다. - name: Docker Hub 로그인 uses: docker/login-action@v3 @@ -27,20 +27,22 @@ jobs: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - # 2. Docker Buildx 설정 (멀티-플랫폼 빌드 지원) + # Docker Buildx 설정 (멀티-플랫폼 빌드 지원) - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - # 4. Docker 이미지 빌드 및 푸시 + # 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 + tags: | + ${{ secrets.DOCKERHUB_USERNAME }}/${{ secrets.DOCKER_REPOSITORY_NAME}}:latest + ${{ secrets.DOCKERHUB_USERNAME }}/${{ secrets.DOCKER_REPOSITORY_NAME}}:${{ github.sha }} - # 5. SSH를 통해 서버에 배포 + # SSH를 통해 서버에 배포 # GitHub Secrets에 DEPLOY_HOST, DEPLOY_USERNAME, DEPLOY_KEY, DEPLOY_PORT를 등록해야 합니다. - name: SSH 접속 및 스크립트 실행 uses: appleboy/ssh-action@v1 @@ -52,5 +54,5 @@ jobs: script: | 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 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/scripts/docker/Dockerfile b/scripts/docker/Dockerfile index f1c5c900..b295ce51 100644 --- a/scripts/docker/Dockerfile +++ b/scripts/docker/Dockerfile @@ -4,7 +4,7 @@ WORKDIR /app RUN corepack enable && corepack prepare pnpm@latest --activate COPY package*.json pnpm*.yaml ./ -RUN pnpm install --frozen-lockfile +RUN pnpm install --frozen-lockfile --ignore-scripts COPY . . RUN pnpm run build From d142130310ad434a67e24ba3e0bfd1870eef2493 Mon Sep 17 00:00:00 2001 From: Kyeoungwoon Park Date: Tue, 12 Aug 2025 19:21:29 +0900 Subject: [PATCH 4/8] =?UTF-8?q?=E2=9C=A8=20Feat:=20change=20actions=20to?= =?UTF-8?q?=20run=20on=20self-hosted=20runner?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/docker-deploy.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docker-deploy.yml b/.github/workflows/docker-deploy.yml index 858f9f94..2f9da3c5 100644 --- a/.github/workflows/docker-deploy.yml +++ b/.github/workflows/docker-deploy.yml @@ -11,7 +11,7 @@ on: jobs: build-and-deploy: # 작업이 실행될 환경 - runs-on: ubuntu-latest + runs-on: self-hosted # 작업의 단계들 steps: From c83548bb04dccd0419b94dd773b17eefd3af945a Mon Sep 17 00:00:00 2001 From: Kyeoungwoon Park Date: Tue, 12 Aug 2025 19:34:27 +0900 Subject: [PATCH 5/8] =?UTF-8?q?=F0=9F=94=A7=20Fix:=20docker=20command=20no?= =?UTF-8?q?t=20fount=20=ED=95=B4=EA=B2=B0=20=EC=8B=9C=EB=8F=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit bash shell 이 원인인가 싶어서 변경 시도 --- .github/workflows/docker-deploy.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.github/workflows/docker-deploy.yml b/.github/workflows/docker-deploy.yml index 2f9da3c5..f07adec8 100644 --- a/.github/workflows/docker-deploy.yml +++ b/.github/workflows/docker-deploy.yml @@ -52,7 +52,14 @@ jobs: 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 + ' From 7620f3478135f6010ee10e00e75d56bcf9596e57 Mon Sep 17 00:00:00 2001 From: Kyeoungwoon Park Date: Wed, 13 Aug 2025 01:38:03 +0900 Subject: [PATCH 6/8] =?UTF-8?q?=F0=9F=94=A7=20Fix:=20docker=20config=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD=20=EC=8B=9C=EB=8F=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/docker-deploy.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/docker-deploy.yml b/.github/workflows/docker-deploy.yml index f07adec8..217feb3b 100644 --- a/.github/workflows/docker-deploy.yml +++ b/.github/workflows/docker-deploy.yml @@ -19,6 +19,11 @@ jobs: - 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 로그인 From 714773d58e6100f9237cc87eb21d7202346b1763 Mon Sep 17 00:00:00 2001 From: Kyeoungwoon Park Date: Wed, 13 Aug 2025 01:39:42 +0900 Subject: [PATCH 7/8] =?UTF-8?q?=E2=9C=8F=EF=B8=8F=20Typo:=20fix=20typo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/docker-deploy.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docker-deploy.yml b/.github/workflows/docker-deploy.yml index 217feb3b..321459f7 100644 --- a/.github/workflows/docker-deploy.yml +++ b/.github/workflows/docker-deploy.yml @@ -21,7 +21,7 @@ jobs: - name: '🔧 Disable Docker credential helper' run: | - echo "인증 정보 도우미 설정을 제거합니다."" + echo "인증 정보 도우미 설정을 제거합니다." jq -n 'del(.credsStore)' | tee ~/.docker/config.json > /dev/null # Docker Hub 로그인 From 9246381a7f5eb77a78bb54b86701c72d8db4cb2a Mon Sep 17 00:00:00 2001 From: Kyeoungwoon Park Date: Wed, 13 Aug 2025 01:51:11 +0900 Subject: [PATCH 8/8] =?UTF-8?q?=F0=9F=A9=B9=20Chore:=20self-hosted=20runne?= =?UTF-8?q?r=20test?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/self-hosted-test.yml | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 .github/workflows/self-hosted-test.yml 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)" + '