Table of contents
Open Table of contents
SharedLocker (스마트 공유 보관함)
스마트 공유 보관함 (SharedLocker) 프로젝트의 프로덕션 빌드 및 배포를 준비하면서 공부한 내용을 설명합니다.
해당 프로젝트는 크게 네 가지 부분으로 구성되어 있다.
- 인증 및 권한 / API 제공을 위한 Express 서버
- 관리자 페이지를 위한 Next.js
- 사용자 애플리케이션을 위한 React Native
- 보관함 단말기의 아두이노 프로젝트
여기서는 위 목록 중 첫 번째와 두 번째 프로젝트를 배포하는 과정에 대해 설명하겠다.
Node.js + Express.js API 서버 배포하기
PM2는 Node.js로 작성된 서버 프로그램을 무중단 배포하기 위한 프로세스 매니저이다.
프로세스 재시작, Cluster와 같은 주요 기능을 제공한다.
ecosystem 기능으로 프로젝트 루트에 PM2를 위한 설정 파일을 생성할 수 있다.
프로젝트의 루트 위치에서 아래 명령을 실행하면 ecosystem.config.js 파일이 생성된다.
pm2 ecosystem
파일 내용은 아래와 같이 작성했다.
module.exports = {
apps: [{
name: 'sharedLocker-product',
script: './public/dist/server.js',
env: {
NODE_ENV: 'production'
},
output: './logs/pm2/console.log',
error: './logs/pm2/error.log',
}, {
name: 'sharedLocker-dev',
script: './public/dist/server.js',
env: {
NODE_ENV: 'development'
},
output: './logs/pm2/dev/console.log',
error: './logs/pm2/dev/error.log'
}],
};
apps 속성에 배열 형태로 여러 개의 설정을 정의할 수 있는데, 실행 명령어의 --only 속성으로 특정 app만 실행할 수 있다.
pm2 start ecosystem.config.cjs --only sharedLocker-product --env production
참고로, 프로젝트의 package.json의 type 속성이 module인 경우 cjs 확장자를 사용해야 한다.
위 명령어를 npm scripts로 등록하면 명령어를 간편하게 실행할 수 있다.
Next.js 배포하기
Next.js는 Node.js 앱과 달리, Entry file이 없고 next start 명령어를 통해 프로젝트를 시작할 수 있다.
따라서 ecosystem 파일에 script와 args 속성으로 npm scripts에 정의된 명령을 실행할 수 있도록 설정해야 한다.
module.exports = {
apps: [{
name: 'sharedLocker-next-product',
script: 'npm',
args: 'run start',
env: {
NODE_ENV: 'production'
},
output: './logs/pm2/console.log',
error: './logs/pm2/error.log',
}, {
name: 'sharedLocker-next-dev',
script: 'npm',
args: 'run dev',
env: {
NODE_ENV: 'development'
},
output: './logs/pm2/dev/console.log',
error: './logs/pm2/dev/error.log'
}],
};
npm run start와 npm run dev를 실행하기 위해 위와 같이 설정한다.
"scripts": {
"dev": "next dev",
"build": "next build",
"start": "next start",
"lint": "next lint",
"deploy:dev": "next build && pm2 startOrRestart ecosystem.config.js --only sharedLocker-next-dev --env dev",
"deploy:prod": "next build && pm2 startOrRestart ecosystem.config.js --only sharedLocker-next-product --env prod"
},
마지막으로 npm scripts에 명령어를 등록하면 완료.
참고 문헌
https://pm2.keymetrics.io/docs/usage/application-declaration/#general
https://dykraf.com/blog/deploying-nextjs-web-application-with-pm2
https://inpa.tistory.com/entry/node-📚-PM2-모듈-사용법-클러스터-무중단-서비스#pm2_설정_파일로_관리하기