카테고리 없음

[NCP] GithubAction + NCP + Docker + FastAPI , SourceCommit

hiris 2024. 9. 2. 18:04

이번에 개발로 NCP 활용하여 Ngnix로 프론트앤드(React) 배포와  백엔드(Fast api) 배포를 진행한다. 

 

 

먼저 프론트 앤드부터 설명하자면 react 는 nginx가 필요하다 .

nginx/nginx.conf 파일을 만들어 생성을 해준다. 

# react-dockerizing/nginx/nginx.conf

server {
    listen 80;
    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;
    location / {
        # root를 /usr/share/nginx/html 을 바라보게 했으므로(Dockerfile 참고)
        # 해당 경로 아래에 배포해주면 됨
        root   /usr/share/nginx/html;
        index  index.html index.htm;
        try_files $uri $uri/ /index.html;
    }
}

 

 

 

그리고 Dockerfile을 생성해준다. 

# react-dockerizing/Dockerfile

# base image 설정(as build 로 완료된 파일을 밑에서 사용할 수 있다.)
FROM node:14-alpine as build

# 컨테이너 내부 작업 디렉토리 설정
WORKDIR /app

# app dependencies
# 컨테이너 내부로 package.json 파일들을 복사
COPY package*.json ./

# package.json 및 package-lock.json 파일에 명시된 의존성 패키지들을 설치
RUN npm install

# 호스트 머신의 현재 디렉토리 파일들을 컨테이너 내부로 전부 복사
COPY . .

# npm build
RUN npm run build

# prod environment
FROM nginx:stable-alpine

# 이전 빌드 단계에서 빌드한 결과물을 /usr/share/nginx/html 으로 복사한다.
COPY --from=build /app/build /usr/share/nginx/html

# 기본 nginx 설정 파일을 삭제한다. (custom 설정과 충돌 방지)
RUN rm /etc/nginx/conf.d/default.conf

# custom 설정파일을 컨테이너 내부로 복사한다.
COPY nginx/nginx.conf /etc/nginx/conf.d

# 컨테이너의 80번 포트를 열어준다.docker build --tag kwaksoochan/navercloud-front:test . 
EXPOSE 80

# nginx 서버를 실행하고 백그라운드로 동작하도록 한다.
CMD ["nginx", "-g", "daemon off;"]

 

이렇게 생성해주고 docker build를 시작한다.

이때 docker hub에서 미리 레포를 파주고 해당 레포에 build 후 push를 해줘야 한다. 이때 서버를 활용하여 도커 푸쉬를 한다음 배포 진행을 했다. 

 

Docker 명령어

로컬 
docker build --tag {레포}:test . 
docker run -d -p 3000:80 --name react-app {레포}:test
docker push {레포}:test

서버 내 
docker pull docker.io/{레포}:test

docker run -d -p 3000:80 --name react-app {레포}:test

 

Github Action 활용하기 

 

백엔드는 Github Action을 활용하여 진행을 했다. 

 

 

백엔드도 마찬가지로 root 경로에  DockerFile을 만들어준다. 

 

# 베이스 이미지로 Python 3.9 사용
FROM python:3.9

# 필요한 패키지들 설치
RUN pip install --no-cache-dir fastapi uvicorn[standard] pandas openpyxl python-multipart xlsxwriter sqlalchemy sqlalchemy pymysql

# 작업 디렉토리 설정
COPY ./app /app
WORKDIR /app

EXPOSE 8000

# FastAPI 실행
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000", "--reload"]

 

우선, main.yml 파일을 만들어 main 브랜치에 푸쉬될때 Workflow가 실행되도록 코드를 작성하였다. main에서 푸쉬가 되면 SSH를 통해 서버 컴퓨터에 원격 접속을 하고 새로운 프로젝트를 빌드, nginx를 재가동하는 코드이다. 

 

name: 배포하기
run-name: Running
on:
  push:
    branches:
      - main

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    # 체크아웃
    - name: Checkout
      uses: actions/checkout@v3
      with:
        ref: main
    # Python 환경 설정
    - name: Set up Python
      uses: actions/setup-python@v4
      with:
        python-version: '3.9'
    # Docker 빌드 및 푸시
    - name: Build and push Docker image
      run: |
        echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u "${{ secrets.DOCKER_USERNAME }}" --password-stdin
        docker build -t ${{ secrets.DOCKER_REPO }}:server .
        docker push ${{ secrets.DOCKER_REPO }}:server

  deploy:
    needs: build
    runs-on: ubuntu-latest

    steps:
    # NCP 로그인 및 Docker 이미지 풀 & 실행
    - name: NCP login and run Docker image
      uses: appleboy/ssh-action@master
      with:
        host: ${{ secrets.NCP_HOST }}
        username: ${{ secrets.NCP_USERNAME }}
        password: ${{ secrets.NCP_PASSWORD }}
        port: ${{ secrets.NCP_PORT }}
        script: |
          sudo docker login -u ${{ secrets.DOCKER_USERNAME }} -p ${{ secrets.DOCKER_PASSWORD }}
          sudo docker stop $(sudo docker ps -a -q) || true
          sudo docker rm -f $(sudo docker ps -a -q) || true
          sudo docker pull ${{ secrets.DOCKER_REPO }}:server
          sudo docker run -d -p 8000:8000 ${{ secrets.DOCKER_REPO }}:server
          sudo docker image prune -f

 

 

git push origin main을 할때마다 제대로 배포가 된 것을 확인할 수 있다

Gihub Action을 활용하니 배포 루트가 훨씬 간소화되고 편해진다. 

 

 

SourceCommit

1. Source Commit이란?

- Source Commit은 소스 코드와 다양한 파일들을 안전하게 저장하기 위한 프라이빗 Git 레포 서비스이다. 

 

2. Source Commit 기능 

- 1. 클라우드 환경에 특화된 완전 관리형 개발 기능 

- 2. 편리한 대용량 리포지토리 운용 ( 인프라에 대한 고민이나 데이터 용량에 대한 제약이 없음 ) 

- 3. 뛰어난 확장성과 호환성  ( 모든 Git 명령어를 지원하는 동시에 모든 Git 클라이언트와의 호환성 제공 ) 

- 4. File Safer 와 연동해 레포 내의 스크립트 및 바이너리 파일에 대한 악성 데이터 진단 기능 제공 

 

3. Soucre Commit 연동하기 

1. 레포 생성 

2. SSH 인증을 권장한다. 

서버에서 ssh-keygen의 명령어를 사용하여 퍼블릭 키를 사용한 경우 해당 키는 위에 보이는 사진과 같이 키 등록을 한다. 

그 후 저 SSH key는 키 이름으로 되고 등록을 해야 한다. 

윈도우일 경우 
cd ~/.ssh
notepad config
Host devtools.ncloud.com
    HostName devtools.ncloud.com
    User git
    IdentityFile ~/.ssh/id_rsa

이렇게 했다면,,, 

git clone ssh_url 을 진행을 하면 성공적으로 clone이 됨을 확인할 수 있다.