PM2 Express+TypeScript 배포기

Robin·2024년 3월 22일
post-thumbnail

(상황: 테크 블로그 서비스 진행 중)

PM2를 안 쓸 이유가 없었다.

  1. 힐러(종료시 재시작)
  2. 조수(변경시 재시작)
  3. cluster(속도개선 가능)

그외에도 장점 다수... (참고: 생활코딩)

물론 이미 배포되어 있는 서버에 적용하는 문제가 있었지만... 일단 해보자고 대뜸 npm i pm2를 해버렸다.

결론부터 말하자면, 위의 1, 2, 3 장점을 모두 취할 수 있도록 반영 완료했다.
아래는 트러블슈팅 페이지에도 작성한 기록이다.

같은 이슈를 맞이하더라도 좀 덜 주눅들고 해결할 수 있길 바란다. (미래의 나에게 하는말)

PM2 트러블슈팅

※ 아래의 넘버링된 순서대로 이슈가 발생하였기 때문에 순차적으로 읽어 내려가길 추천한다.
※ ✅로 각 문제별 해결방안을 표시해둠

(1) 엔트리 포인트 app.ts 실행 시 interpreter ts-node 오작동

  • 여느 프로젝트와 비슷하게 src 디렉토리 내에 app.ts가 있는 상황
  • TS인 만큼 JS로 컴파일이 필요한데.. 어떠한 이유에서인지 interpreter가 먹지 않는다.
#- 오작동한 커맨드
#- 이해를 위해 커맨드로 작성. 실제로는 ecosystem.config.js 파일 활용하여 `pm2 start ecosystem.config.js` 실행
pm2 start --interpreter ts-node src/app.ts --watch
pm2 start --interpreter ./node_modules/.bin/ts-node src/app.ts --watch

이에 build 후 interpreter 옵션 없이 dist 디렉토리 내 app.js로 실행


(2) watch모드로 실행해도 수정사항이 반영되지 않는 문제

  • (1)과 같이 진행하니, 매번 빌드 되지 않아 수정사항이 반영되지 않는 문제 발생
  • 당연하다. 이미 빌드 되어있는걸로다가 실행시키는 것이니...

✅ 이에 package.json 실행 스크립트에 build 과정 추가

  • build의 경우, 충돌 방지를 위해 dist 디렉토리 삭제 후(윈도우의 경우 rimraf 활용) 빌드
	// package.json
  "scripts": {
    "build": "**npx rimraf dist** && npx tsc",
    "dev": "**npm run build** && pm2 start ecosystem.config.js",
  },

(3) PM2 실행되지만 PID가 부여되지 않음

  • pm2 logs 확인: entity 파일이 JS로 컴파일 되지 못함
  • 그치.. DB를 연결한 부분에서 뻔히 엔티티들은 src/**/*.entity.ts를 바라보라고 만들어 놓았으니...

✅이에 entity도 dist 디렉토리로 경로 설정

new DataSource({
  ...
  **entities: ["./dist/**/*.entity.js"],**
	...
});

(4) pm2 not found: 로컬 정상작동 확인 후 배포 시 PM2 에러

✅ devDependency에 있던 pm2를 uninstall 후 dependency로 다시금 설치 후 배포

  • dependency, devDependency 차이는 배포에서 크게 보인다. 스스로에게 서운하게 이런 실수 하지말자 진짜ㅠ

(5) 배포 후 정상작동 하는 듯 하나 런타임 에러

  • dependency 수정 후 다시금 배포하니 위의 사진과 같이 정상 배포 되는 듯 하나, 의문의 실행 오류가 뜨며 배포 실패
  • interpreter의 문제인 듯 하여 다시금 (1) ts-node 설치 (2) 커맨드 변경 (3) ecosystem.config 옵션 변경 (4) PM2 버전 변경 등 여러 시도를 했으나 에러 해결 못함
  • 약간 아찔해지기 시작함
  • ‘pm2 cloud’ 로 구글링 중, PM2 공식 문서에서 클라우드에서 Node.js 앱 실행 시 문제점과 관련한 섹션 발견: PM2 - Use PM2 in Cloud Providers

✅ 공식 문서 확인 후 package.json 실행 스크립트에 pm2가 아닌 pm2-runtime으로 수정 후 정상작동 확인

"scripts": {
    "build": "npx rimraf dist && npx tsc",
    "dev": "npm run build && pm2 start ecosystem.config.js",
    "start": "npm run build && **pm2-runtime** start ecosystem.config.js",
  },


아쉬운 점

내가 진행한 방식이 정답이라고 할 자신이 없다. (특히 interpreter부분)
그래도 빠르게 적용하고 정상 작동한다는 점에서 일단 만족한다.
좀 더 현실적인 상황에서의, 많은 코드들을 접하고 싶은데 흠 아쉽다.

profile
Always testing, sometimes dog walking

0개의 댓글