[NCP] GithubAction + NCP + Docker + FastAPI , SourceCommit
이번에 개발로 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이 됨을 확인할 수 있다.