민프

[DevOps][NCP] NCP-Server + Docker + NCP-Container Register로 Nestjs어플리케이션 배포하기 (feat. CICD-github Actions) 본문

DevOps/[NCP]

[DevOps][NCP] NCP-Server + Docker + NCP-Container Register로 Nestjs어플리케이션 배포하기 (feat. CICD-github Actions)

민프야 2025. 4. 8. 19:53

1. 사전 준비

NCP - Server, VPC

2. 공인 IP 설정

Server에 적용 할 공인 IP를 생성합니다.

 

3. ACG 설정

Server에 적용되어있는 ACG를 설정합니다.

(각 포트 등..)

4. Root 비밀번호 받기

서버를 생성하면서 받은 pem키로 비밀번호를 받으면 됩니다.

(서버 선택 -> 서버 관리 및 설정 변경 -> 관리자 비밀번호 확인)

 

5. VScode에서 서버 접근 (Remote-SSH)

Host {서버 별명}
    HostName {포트포워딩에서 확인한 서버 접속용 공인 IP}
    Port {포트포워딩에서 확인한 서버 접속용 외부 포트} <- SSH는 22번
    User {관리자 이름} <- root
    IdentityFile {pem 파일 경로}

 

 

접근 성공

 

6. Container Reistry 생성 방법

6-1. Object Storage 이용 신청 및 버킷 생성

6-2 Container Registry 생성 - 6-1에서 생성한 버킷 선택

 

버킷을 생성하면 이렇게 이용 가이드가 나오게 됩니다.

이제 로컬에서 이미지 생성 후 Container Registry에 이미지를 Push해보도록 하겠습니다. 

 

7. 로컬에서 NCP - Container Reistry로 이미지 PUSH

# 1. 빌드
docker buildx build --platform linux/amd64 -t your-nest-app .

# 2. NCR용 태그 붙이기 (NCR 주소 확인)
docker tag your-nest-app kr.ncr.ntruss.com/your-nest-app:latest

# 3. 로그인 (가이드 참고)
docker login kr.ncr.ntruss.com -u ncp -p 'YOUR_NCP_CONTAINER_TOKEN'
로그인 시 Username, password를 요구하는데
API 인증키 관리에 들어가셔서
- username : AccessKey
- password : Secret Key
입력해주시면 됩니다.

# 4. 이미지 푸시
docker push kr.ncr.ntruss.com/your-registry/your-nest-app:latest

docker ncr 로그인 성공

 

이미지 PUSH를 성공하였습니다.

8. NCP Server에서 Container Reistry 이미지 pull

8-1. NCP Server에서 Docker 설치

    sudo apt update -y
    sudo apt install -y docker.io
    sudo systemctl start docker
    sudo usermod -aG docker $USER

 

설치확인

    docker --version

8-2 NCP Server에서 NCP 로그인 (Container Registry 이용 가이드 참고)

docker login public

 

Accesskey, Secret Key 잘 입력해주시면 아래와 같이 로그인이 성공적으로 되게 됩니다.

8-3. NCP Server에서 Container Registry 이미지 PUSH

docker push 레지스트리 주소/<TARGET_IMAGE[:TAG]>

성공 하시면 이미지 리스트에 이미지가 생성 됩니다. 

8-4. NCP Server에서 Container Registry 이미지 PULL

docker push 레지스트리 주소/<TARGET_IMAGE[:TAG]>

8-5. NCP Server에서 Container RUN

3000포트로 여시는거면 ACG에서 포트 열어주셔야합니다.

 

완료

8-6. 해당 과정을 Github Actions로 자동배포하기

Github Actions 사용하려면 ACG에서 22번 포트를 열어주셔야합니다. 

- NCP_CP_PASSWORD : API Secret Key

- NCP_CP_USERNAME : API Access Key

- NCP_SERVER_HOST : NPC Server Public IP

- NCP_SERVER_PASSWORD : NPC Server관리자 비밀번호

- NCP_SERVER_SSH_KEY : SSH키

- NCP_SERVER_USER : root

name: Deploy to NCP Server from NCP Container Registry

on:
  push:
    branches: [ main ]

jobs:
  deploy:
    runs-on: ubuntu-latest

    steps:
      - name: ✅ Checkout source code
        uses: actions/checkout@v3

      - name: 🐳 Build Docker image
        run: |
          docker buildx build --platform linux/amd64 --no-cache -t bvc-ordering .

      - name: 🔐 Login to NCP Container Registry
        run: |
          echo "${{ secrets.NCP_CR_PASSWORD }}" | docker login container주소 -u ${{ secrets.NCP_CR_USERNAME }} --password-stdin

      - name: 📦 Tag and Push Docker image to NCP Container Registry
        run: |
          docker tag 이미지이름 Container주소/이미지이름:latest
          docker push 태그된이미지이름(Container주소/이미지이름:latest)

      - name: 🚀 Deploy to NCP Server via SSH
        uses: appleboy/ssh-action@v1.2.2
        with:
          host: ${{ secrets.NCP_SERVER_HOST }}
          username: ${{ secrets.NCP_SERVER_USER }}
          password: ${{ secrets.NCP_SERVER_PASSWORD }}
          port: 22
          script: |
            echo "SSH login success"
            docker pull 태그된이미지이름(Container주소/이미지이름:latest)
            docker stop $(docker ps -a -q)
            docker rm $(docker ps -a -q)
            docker run -d -p 3000:3000 --name 컨테이너이름 태그된이미지이름

위 CD 쪽에서 SSH 접속하는 부분이

Password으로 인증하는 방법과 SSH로 나뉘는데

저는 password로 구현하였습니다.

 

Comments