3. Backend 배포하기
배포에는 두 가지 라이브러리를 사용할 예정이다.
App containerize 에는 docker, 그리고 node process management 에는 PM2.
구조적으로 보면 VM 내에 backend 와 frontend 두개의 레퍼지토리가 있고, 이 위에 도커가 존재하며 back container / front container 각각을 컨테이너로 분리한다. pm2 는 back container 내에 프로세스 매니징 툴로 이식 된다.
(1) PM2 node process manager 적용
npm 으로 pm2 를 먼저 설치한 후 ecosystem.config.js 파일 내에 module config 를 작성해준다. 온라인에 찾으면 많은 예시들이 있을 것이다. 어려울 부분이 없으니 차근차근 작성한 후 local 에서 node를 pm2 로 실행시켜보자.
pm2 start ecosystem.config.js
pm2 status
pm2 restart 0 / 1 / 2 ...
pm2 logs 0 / 1 / 2 ...
PM2 status 를 확인해보면 두 개의 클러스터가 돌고 있는 것을 확인할 수 있다.
클러스터를 두 개로 한 이유는, 한개의 클러스터가 모종의 이유로 멈춰버렸을 시 pm2 가 두 번째의 클러스터를 돌리도록 하기 위함이다.
서버의 부하가 심할 일도 없고, 어떠한 이유로도 멈출 가능성은 많지 않지만 prod 에 적용될 몇 가지 테스트를 진행하기 위해 클러스터를 두가지로 분리해주었다. 나중에 부하 테스트로 첫 번째 cluster를 강제로 멈춰볼 생각이다.
(2) Docker - containerize
Server / Source managing 이 끝났으니 backend app 을 컨테이너화 시켜야 한다.
VM 에 docker 설치를 진행한 후, nest-app root directory 에 Dockerfile을 생성해준다. Dockerfile은 도커 명령어를 실행시키기 위한 package.json 에 가깝다고 보면 좋을 것 같다.
docker-compose.yml 파일로 config 를 푸시하는 과정도 있는데 그 과정은 따로 정리하기로 하고 일단 컨테이너화부터 시켜보자.
지금은 당장 docker-compose.yml이 필요하지 않다.
pm2 를 사용하여 node process를 관리하고 있으므로
Dockerfile 도 아래와 같이 작성해주면 된다.
일반적으로 document에서 제시하는 Dockerfile format 과 다른점은 pm2-runtime 을 cmd로 사용하고 있다는 점이고, 이를 위해 npm install -g -pm2 를 먼저 실행시켰다.
package.json 에 pm2 가 잘 들어가 있는 것을 확인하였는데, npm install 시에 왜 제대로 설치되지 않는 것인지 이유를 잘 모르겠다. 꼭 -g 명령어로 전역 설정을 해주어야 제대로 돌아가더라. 해당 내용도 왜그런지 찾아봐야겠다.
무튼간에 WorkDir /var/app으로 맞춰두었고, 나 같은 경우 ecosystem.config.js 파일을 root directory 에서 관리하는 것이 아니라 환경에 따라 세 가지로 분류하여 관리하였기 때문에, CMD 내에 정확한 ecosystem.config.js 위치를 적어주었다.
Dockerfile 작성이 끝나면 container 를 생성해주자.
// docker container 생성. -t 는 태그. tag 는 optional이니까 굳이 안넣어도 되긴하다.
sudo docker build . -t your-app-name:tag
// docker container run 명령어.
// -d 는 detached : container를 background에서 실행시키고, 터미널은 다른 커맨드 실행을 위하여 해당 컨테이너에서 분리.
// -p 는 port : host port는 앞에 오고, container port는 뒤에 온다.
sudo docker container run -d -p 4040:4040 your-app-name
sudo docker ps
sudo docker stop CONTAINER_ID
sudo docker images
sudo docker rm CONTAINER_ID (컨테이너 삭제 - stop 이후 사용)
sudo docker rmi IMAGES_ID --force (이미지 삭제 - container stop 되어야 삭제 가능)\
// pm2 process monitoring
sudo docker exec -it {컨테이너이름} pm2 list
// 실행중인 pm2 로그 확인
sudo docker exec -it {컨테이너이름} pm2 log {pm2 list 중 하나. ex) nest-app}
최상단에 위치한 명령어 부터 실행시켜보며 container 가 생성되었는지와 running status, 그리고 pm2 를 통한 container 내의 node process monitoring 까지 진행해본후 디버깅 과정을 마무리하면 백엔드 배포는 끝났다고 보면 된다.
'Deployment > Guide' 카테고리의 다른 글
Deployment 2 - DNS / NGINX (0) | 2023.10.30 |
---|---|
Deployment 1 - VM (0) | 2023.10.30 |