Sunghyun Roh
11 min readJan 27, 2023

내 Node 서비스를 Nexus에 배포하여 PM2로 바로 올려보자

내가 만든 웹 서비스를 mpm에 배포해서 사람들이 손쉽게 npm install -g 서비스명 이렇게 사용할 수 있다면 얼마나 좋을까~?

오늘 포스트는 express로 만든 샘플 프로젝트를 Nexus를 통해 등록해서 npm install 을 해서 서비스를 올려보고 더 나아가 pm2까지 올려보도록 하겠습니다

1.Node/Express 샘플 프로젝트 생성

우선 Express로 이루어진 프로젝트가 필요 하겠죠~?

마침 배포용으로 만들어본 NCC까지 빌드된 프로젝트가 있었습니다

해당 프로젝트를 쫒아서 해보면 다음과 같이 dist 폴더를 볼 수 있는데요

우리는 dist 폴더를 배포할 수 있도록 만들어보겠습니다

우선 npm에 배포를 해야 하니 package.json을 하나 만들어보겠습니다

기왕이면 프로젝트에 있는 package.json을 복사 해오면 되겠죠?

2. Nexus 준비하기

우리가 오늘 배포할 곳은 공식 npm은 아니고, Nexus에 배포해보는 법으로 해볼꺼에요. 만약 npm에 직접 배포를 하시겠다면 해당 포스팅의 이번 세션만 바꾸시면 됩니다

사실 저는 제가 만들고 있는 서비스에서 Android Sdk를 Nexus를 통해 배포되고 있어서 준비가 되어 있었어요

설치가 필요하신분은 구글링을 통해서 설치를 해오셔야 해요

nexus 메인 화면

저는 nexus에 접속해서 로그인까지 하면 다음과 같이 하면이 나와요

설정에 가시면 다양한 설정을 할 수 있는데 저는 새롭게 Repository를 만들어볼게요

왼쪽에 Repositories에 들어가서 상단에 Create repository를 클릭할게요

여러 리스트가 있는데 저희는 npm (hosted)를 선택할거에요

원하시는대로 정보를 입력하시고 Repository를 생성해주세요

3. Nexus에 배포하기

우리가 생성한 repository에 프로젝트를 올려볼꺼에요

아까 만든 dist폴더의 package.json을 다음과 같이 변경합니다

{
"name": "expressprj",
"version": "0.1",
"private": false,
"scripts": {
"start": "node ./bin/www"
},
"dependencies": {

},
"bin": {
"expressPrj": "./index.js"
},
"publishConfig": {
"registry": "http://여러분들이 만든 nexus주소:포트/repository/imqa.npm.sample/"
}
}

이때 주소를 잘 모르시겠다면 nexus에 들어가셔서 설정-repositories에 들어가셔서 여러분들이 만드신 repository를 클릭해보세요

URL이 나오는걸 확인하실수 있어요

(참고로 저 주소는 제가 공개할수 없어서 바꿔놓은거에요)

만약 로컬에서 하고 계신분들이 있다면

http://localhost:8081/repository/your.repo.name 이되겠네요

업로드를 하기 위해서는 내 PC환경의 npm이 우리가 만든 nexus에 접근이 가능하도록 만들어야 해요

> npm login -registry=http://여러분들이 만든 nexus주소:포트/repository/imqa.npm.sample/

진행을 하면 로그인 계정도 입력하시고

저는 이메일까지 치라고 나오네요~

진행을 하게 되면 .npmrc 파일이 하나 생성됩니다

해당파일을 dist폴더로 copy 해주세요

터미널에서 dist폴더에서 다음과 같이 명령을 날려봅니다

> npm publish
npm notice
npm notice 📦 expressprj@0.0.4
npm notice === Tarball Contents ===
npm notice 1.1MB index.js
npm notice 290B package.json
npm notice 111B public/stylesheets/style.css
npm notice 83B views/error.ejs
npm notice 222B views/index.ejs
npm notice === Tarball Details ===
npm notice name: expressprj
npm notice version: 0.0.4
npm notice filename: expressprj-0.0.4.tgz
npm notice package size: 351.0 kB
npm notice unpacked size: 1.1 MB
npm notice shasum: d1c92040b03e5bb3e62cb11a68e79e71a843c6c0
npm notice integrity: sha512-RyK3HAmG47an+[...]nRP7VhpYEqTTQ==
npm notice total files: 5
npm notice
+ expressprj@0.0.4

코드가 올라갔는지 확인해볼까요?

nexus 메인에서 Browse를 클릭하여 여러분들이 만든 repository를 클릭해보세요

(저는 몇번 테스트 해본다고 여러개의 버전이 올라간게 확인되네요)

4. 내 PC의 npm으로 실행해보기

자 이제 올라간 프로젝트를 실행시켜봅시다

우리가 만든 nexus에 내 pc의 npm이 접근이 되도록 설정해야 해요

혹시 테스트 PC와 배포 PC가 다르시다면 아까 했던 로그인을 다시 해주세요

> npm login -registry=http://여러분들이 만든 nexus주소:포트/repository/imqa.npm.sample/

그리고 우리가 만든 nexus에 등록한 서비스를 npm install 해봅시다

> npm install -g expressprj

added 1 package in 474ms

만약 버전 명시하고 싶으시다면 다음과 같이 하면 됩니다

> npm install -g expressprj@0.0.1

added 1 package in 474ms

설치가 되었군요!

저는 일부러 -g 옵션을 넣었습니다

g 옵션을 하면 어디에 설치되는것일까요?

다음과 같이 명령어를 날리면 확인하실 수 있어요

> npm root -g
/usr/local/lib/node_modules

해당 폴더에 들어가셔서 설치가 잘 되었는지 확인해보세요

> cd  /usr/local/lib/node_modules
> ls
@vercel angular-cli expressprj minify npm react-native-cli
@vue corepack hexo-cli n

우리가 만든 expressprj가 있네요~

실행도 시켜볼까요?

> expresPrj

하면 실행이 되는것을 확인 하실 수 있습니다

오~ 왜 되는거지? 어? 내가 만든 프로젝트명은 다 소문자인데…?

정답은 package.json에 있습니다

{
"name": "expressprj",
"version": "0.1",
"private": false,
"scripts": {
"start": "node ./bin/www"
},
"dependencies": {

},
"bin": {
"expressPrj": "./index.js"
},
"publishConfig": {
"registry": "http://여러분들이 만든 nexus주소:포트/repository/imqa.npm.sample/"
}
}

설정에 bin을 보시면 bin에 expressPrj 라고 설정했기 때문에 되는겁니다!!!

다른 애들은 어떻게 되어 있을까요? 저는 pm2가 설치되어 있는데 pm2의 package.json을 보면 bin이 이렇게 되어 있네요

"bin": {
"pm2": "bin/pm2",
"pm2-dev": "bin/pm2-dev",
"pm2-docker": "bin/pm2-docker",
"pm2-runtime": "bin/pm2-runtime"
},

5. PM2로 서비스 올리기

이렇게 까지 만들었다면 PM2 에 서비스를 올리는건 정말 간단합니다.

pm2 install 서비스 명 을 하면 바로 됩니다!!!

> pm2 install expressprj
[PM2][Module] Installing NPM expressprj module
[PM2][Module] Module already installed. Updating.
[PM2] Applying action deleteProcessId on app [0](ids: [ 0 ])
[PM2] [expressprj](0) ✓
In memory process deleted
Deleting /Users/nohsunghyun/.pm2/modules/expressprj
[PM2][Module] Calling [NPM] to install expressprj ...

added 1 package in 843ms
[PM2][Module] Module downloaded
[PM2][WARN] Applications index not running, starting...
[PM2] App [expressprj] launched (1 instances)
[PM2][Module] Module successfully installed and launched
[PM2][Module] Checkout module options: `$ pm2 conf`
┌─────┬───────────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬──────────┬──────────┐
│ id │ name │ namespace │ version │ mode │ pid │ uptime │ ↺ │ status │ cpu │ mem │ user │ watching │
└─────┴───────────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────┴──────────┴──────────┘
Module
┌────┬──────────────────────────────┬───────────────┬──────────┬──────────┬──────┬──────────┬──────────┬──────────┐
│ id │ module │ version │ pid │ status │ ↺ │ cpu │ mem │ user │
├────┼──────────────────────────────┼───────────────┼──────────┼──────────┼──────┼──────────┼──────────┼──────────┤
│ 0 │ expressprj │ 0.0.4 │ 8782 │ online │ 0 │ 0% │ 2.9mb │ noh… │
└────┴──────────────────────────────┴───────────────┴──────────┴──────────┴──────┴──────────┴──────────┴──────────┘

오늘은 express서비스를 nexus에 올려서 npm으로 설치를 쉽게 해보고 PM2까지 올려봤습니다

너무 쉽죠?