서버 내에서 npm run build 를 통하여 배포를 하는 것보다는 로컬에서 해당 명령어를 사용하여 빌드된 파일을 서버 안에 덮어 씌어주는 방법이 더 안정적이라 생각하여 관련 스크립트를 만들게 되었다.
로컬의 파일을 서버 내로 전송해주는 명령어가 scp 라고 한다. full command 로는 다음과 같다.
scp -i ~/.ssh/[ssh_key] -r [빌드 된 폴더] [서버계정명]@[서버IP]:/[전송해줄경로(절대경로)]
예를 들어, ssh 키 명이 test이고, 빌드된 폴더가 /dist 폴더, 서버 내부에 덮어쓸 경로가 /home/project/dist 라고 하면 다음과 같이 적을 수 있을 것이다.
scp -i ~/.ssh/test -r ./dist test@0.0.0.0:/home/project
프로젝트 경로의 경우, 서버에 접속하여 해당 폴더 위치에서 pwd를 해주어 나오는 경로를 복사하여 붙여 넣어주자!
- 추가로 해당 명령어를 실행하여면 접근 권한이 있어야 한다.
- ls -al로 봤을 때 폴더에 대한 소유권이 root로 되어있다면, 접속하려는 계정(test)에게 해당 폴더에 대한 소유권을 부여해주자
내가 짜려는 스크립트는 다음과 같다.
1. 빌드가 되면, 먼저 해당 서버에 접속하여 깃을 풀 받고, 서버 내 프로젝트의 dist 파일을 한번 지워주고
새로 생성한다.
2. 빌드 된 dist 파일을 서버 내 지정한 경로안에 덮어씌어준다.
3. 포트 7000번 서버 재실행.
1번에서 dist 폴더를 삭제하고 새로 생성한 것은 개인적으로 이게 더 확실하게 새로 덮어 씌어질 것 같아 추가하였다.
코드로 짠 스크립트는 아래와 같다. .gitignore 에 해당 파일이 올라가지 않도록 작성하였다.
build.sh
ssh -i ~/.ssh/ssh_key hajung3406@34.64.49.91 "cd careerhub/CareerHub-NestJS && git checkout . && git pull origin main && rm -rf dist && mkdir -p dist"
scp -i ~/.ssh/ssh_key -r ./dist hajung3406@34.64.49.91:/home/hajung3406/careerhub/CareerHub-NestJS
ssh -i ~/.ssh/ssh_key hajung3406@34.64.49.91 "cd careerhub/CareerHub-NestJS && pm2 kill && pm2 start ecosystem.config.js"
이후 package.json 스크립트 build 부분을 다음으로 수정해준다.
"build": "nest build && ./build.sh",
build 가 실행될 때 바로 되거나 deploy라는 명령어를 추가해주는 것도 나쁘지 않은 방법이다.