기타

aws 스크립트 사용해 nest js 자동배포하기

호리둥절 2023. 8. 3. 16:08

기존에 ssh로 접속해 Git clone 받고 build 하고 install하고 pm2 start 하는 과정이 매우 번거롭게 느껴졌을텐데요.

이와 같이 반복되는 작업을 자동화하는 것은 정말로 효율적이며 시간을 절약할 수 있는 방법입니다.  스크립트 작성을 통해 단 코드 한줄로 배포해봅시다 !

 

1. 스크립트 파일 작성하기

프로젝트 하위 폴더에 scripts파일을 만들고 아래와 같이 deploy.sh를 만들고 앞서 발급받은 pem키도 같이 넣어주세요 

deploy.sh 작성하기

#!/bin/bash
PEM_PATH=./scripts/test.pem
if [ ! -f $PEM_PATH ]; then
    echo "DEPLOY_FAIL: not file exist \"$PEM_PATH\""
    exit 1;
fi

# 나중에 env 사용할때 주석해제
# ENV=.env.production
# if [ ! -f $ENV ]; then
#     echo "DEPLOY_FAIL: not file exist \"$ENV\""
#     exit 1;
# fi

# 프로젝트 빌드
npm run build

BUILD=$?
if [ $BUILD -eq 1 ]; then
    echo -e '\n======================================\n'
    echo 'BUILD FAILED : deploying is cancel'
    echo -e '\n======================================\n'
    exit 1;
fi

USER=ubuntu
HOST=[고정 아이피 입력]
DEPLOY_PATH=[프로젝트 저장하고싶은 폴더 입력]

SERVER=$USER@$HOST
REMOTE_PATH=$SERVER:$DEPLOY_PATH

# 원격 서버에서 기존의 배포 디렉토리 삭제 및 생성
ssh -i $PEM_PATH $SERVER "sudo rm -rf $DEPLOY_PATH/dist"
ssh -i $PEM_PATH $SERVER "sudo mkdir -p -m 777 $DEPLOY_PATH/dist"

# 로컬 머신의 파일들을 원격 서버로 전송
rsync -avz --progress -e "sudo ssh -i $PEM_PATH" dist/ $REMOTE_PATH/dist
rsync -avz --progress -e "sudo ssh -i $PEM_PATH" package* $REMOTE_PATH
rsync -avz --progress -e "sudo ssh -i $PEM_PATH" ecosystem.config.js $REMOTE_PATH
# 나중에 env 사용할때 주석해제
# rsync -avz --progress -e "sudo ssh -i $PEM_PATH" .env.production $REMOTE_PATH

# 필요한 파일 업로드 완료 메시지 출력
echo -e '\n======================================\n'
echo 'FILE UPLOAD DONE.'
echo -e '\n======================================\n'

# 원격 서버에서 프로젝트 의존성 설치
ssh -i $PEM_PATH $SERVER "npm --prefix $DEPLOY_PATH install"

# PM2를 사용하여 애플리케이션 실행 또는 재시작
ssh -i $PEM_PATH $SERVER "sudo pm2 startOrReload $DEPLOY_PATH/ecosystem.config.js"

# 배포 완료 메시지 출력
echo -e '\n======================================\n'
echo 'DEPLOY SUCCESS AND DONE.'
echo -e '\n======================================\n'

이해하시기 쉽도록 주석을 달아 놓았으니 스크립트를 처음 작성하시는 분들도 쉽게 이해하시리라 믿습니다

고정아이피와 , 폴더명은 꼭 본인에 환경에 맞게 작성해주시기 바랍니다.

 

startOrReload이미 실행 중인 프로세스가 있다면 해당 프로세스를 다시 시작하고, 없다면 새로운 프로세스를 시작합니다

sudo pm2 restart $DEPLOY_PATH/dist/main.js

를 대신 사용하셔도 무방하나 Restart는 명령어는 현재 실행 중인 프로세스를 중지한 뒤 다시 시작하기 때문에 startOrReload 쓰는것을 추천드립니다.

 

startOrReload 사용하기위해서 ecosystem.config.js 를 작성해보겠습니다.

2.ecosystem.config.js 작성하기

module.exports = {
    apps: [
        {
            name: '[애플리케이션 이름]',
            cwd: '[DEPLOY_PATH 와 같은 경로로 작성]',
            script: './dist/main.js',
            instances: 1,
            exec_mode: 'cluster',
            wait_ready: true,
            kill_timeout: 5000,
            
        }
    ]
};

애플리케이션과 경로를 꼭 작성해주세요 

3.package.json에 script 작성하기

"scripts": { "deploy": "bash ./scripts/deploy.sh"}

위와 같이 넣어주고

npm run deploy

 하면 자동배포가 완료됩니다~ 정말 코드 한줄로 배포가 가능하다니 정말 나이스하죠?

 

※ 혹시 pm2 관련해서 에러가 뜬다면 우분투 서버에 sudo로 전역상태로 pm2 설치해주시길 바랍니다

 sudo npm i -g pm2

4. 우분투에 접속하여 확인해보기

짜잔 ~~~ 잘 실행되고 있는걸 볼수 있습니다.

저는 개발서버를 3000번 포트로 지정했기때문에 http://<ip 주소>:3000으로 실행해보면 잘 돌아갑니다

 

저도 자동배포 스크립트는 사용한지 얼마 안되었는데 사용하기 전과 사용한후의 개발의 질이 달라집니다 !!!!! 여러분들도 꼭 사용해보시길 바랄게용 ㅎㅎ 

 

'기타' 카테고리의 다른 글

aws EC2에 Node pm2 nginx 설치후 배포하기  (0) 2023.08.03
aws 인스턴스 고정 IP (탄력적 IP) 생성하기  (0) 2023.08.03
aws ec2 서버 생성하기  (0) 2023.08.03
git 명령어 모음  (0) 2023.08.02
JWT(JSON Web Token) 토큰이란??  (0) 2023.04.07