Private NPM Registry 구축하기

minidoo·2023년 4월 15일
1

자바스크립트 / NodeJS

목록 보기
26/27
post-thumbnail

private npm registry 필요한 이유

npm이란 Node Pacakage Manager로 Node.js의 패키지를 관리할 수 있는 도구이다. npm을 사용해서 npm 저장소에 있는 패키지를 쉽게 install하고 관리할 수 있게 된다.

npm 저장소에 패키지를 올리면 모두가 접근할 수 있는데, 회사에서 프로젝트를 진행하다보면 공개적인 저장소가 아닌 로컬이나 사내 서버에서만 쓸 수 있는 프라이빗 저장소가 필요하다.

private npm registry 구축 방법

private npm registry를 구축하는 방법은 sinopiaverdaccio가 있다.

sinopia는 2015년 기준으로 유지보수가 멈춰 있다. verdaccio는 sinopia를 기반으로, 좀 더 발전된 형태로 구성되어 있으며 현재까지 가장 활발하게 유지보수 되고 있다.

verdaccio는 sinopia의 사용 환경을 100% 지원하며, sinopia의 환경 정보와 파일 위치, 파일명 등을 동일하게 사용할 수 있다.

1. 서버 구축하기

verdaccio를 설치하기에 앞서 AWS EC2를 이용하여 서버를 구축한다. OS, CPU, Memeory, 그리고 Network를 고려하여 서버를 만들고, 사이트에 접근할 도메인과 ELB에 SSL을 적용하면 준비가 완료된다.
(로컬 환경이 아닌, 회사에서 실제로 사용한 방식으로 작성하였습니다 ☺)

EIP : 11.222.333.444
Domain : npmjs.miniddo.com

2. verdaccio 설치

새로 만들어진 서버에 node를 설치한 후, npm으로 verdaccio를 설치한다.

nvm, node 설치

# nvm설치
[miniddo@ip-11-22-33-444 ~]$
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.11/install.sh | bash
[miniddo@ip-11-22-33-444 ~]$ source .bash_profile

# node, npm 설치
[miniddo@ip-11-22-33-444 ~]$ nvm install v14.16.1
[miniddo@ip-11-22-33-444 ~]$ nvm use v14.16.1
[miniddo@ip-11-22-33-444 ~]$ source .bash_profile

verdaccio 설치

[miniddo@ip-11-22-33-444 ~]$ npm install -g verdaccio

3. nginx 설치

verdaccio를 실행하기 전 nginx 설정을 해준다.

verdaccio는 http://localhost:4873로 실행된다. nginx 설정을 통해 만들어둔 도메인으로 접속할 수 있도록 해준다.

# nginx 공식 저장소 추가
[miniddo@ip-11-22-33-444 ~]$ sudo vim /etc/yum.repos.d/nginx.repo
# 파일에 아래 내용 추가
[nginx]
    name=nginx repo
    baseurl=http://nginx.org/packages/centos/7/$basearch/
    gpgcheck=0
    enabled=1

# nginx 설치
[miniddo@ip-11-22-33-444 ~]$ sudo yum install nginx
# nginx 포트 설정
[miniddo@ip-11-22-33-444 ~]$ vim /etc/nginx/conf.d/default.conf
# 파일에 아래 내용 추가
map $http_upgrade $connection_upgrade {
  default upgrade;
}

server {
    listen 80;
    server_name npmjs.miniddo.com;

    location / {
        proxy_pass http://0.0.0.0:4873/;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
        proxy_set_header Host $host;
  }
}

nginx 설정 파일을 변경한 후에는 nginx 서버를 재실행 해야한다. 관리자 권한으로 실행해야 하며, 항상 테스트를 먼저 하는 것이 좋다.

[miniddo@ip-11-22-33-444 ~]$ sudo su
[miniddo@ip-11-22-33-444 ~]$ nginx -t
[miniddo@ip-11-22-33-444 ~]$ service nginx reload(or restart)

4. 사용자 등록, 로그인, 로그아웃

$ npm adduser --registry https://npmjs.miniddo.com/
$ npm login --registry https://npmjs.miniddo.com/
$ npm logout --registry https://npmjs.miniddo.com/

5. 패키지 Publish

$ mkdir module && cd module
$ npm init (name: @test/module)
$ cat > index.js
module.exports = function(a, b) {
    return a + b;
} 

모듈의 이름은 prefix를 사용한다. 가독성 뿐만 아니라 인증 범위 설정 등에서 편의성을 높여준다. (다음 게시글에서 자세히!)

$ npm publish --registry https://npmjs.miniddo.com/

간단하게 패키지 배포하기

package.jsonpublishConfig 설정 값을 작성하면, 기존의 방식을 이용하여 패키지를 배포할 수 있다. ( npm publish )
https://verdaccio.org/docs/setup-npm

{
	"publishConfig": {
		"registry": "https://npmjs.miniddo.com/"
	}
}

6. 패키지 Install

$ mkdir myProject && cd myProject

$ npm install --registry https://npmjs.miniddo.com/ @test/module

$ cat > index.js
let result = require('@test/module')
console.log(result(1, 2));
console.log('hello!');

$ node index.js
# 결과
3
hello!

패키지 배포와 설치 모두 기존의 명령어에 --registry https://npmjs.miniddo.com/ 만 추가해주면 된다.

간단하게 패키기 설치하기

매번 --registry https://npmjs.miniddo.com/ 을 붙여서 설피하는 것은 번거롭다.

$ npm config set @test:registry https://npmjs.miniddo.com

위의 같이 설정하면 @test/* 이름을 가진 패키지는 자동으로 private npm 서버를 바라보게 된다.

$ npm install @test/module
  • 원래대로 되돌리기
$ sudo su
$ npm set registry https://npmjs.miniddo.com/

7. 인증범위 설정

$ cd /home/miniddo/.config/verdaccio
$ vim config.yaml
# 파일에 아래 내용 추가

packages:
  '@test/*':
    access: $authenticated
    publish: $authenticated
    unpublish: $authenticated
    proxy: npmjs

@test/* 패키지는 인증된 사용자만 접근, 배포할 수 있다.
만약, 사이트에서 로그아웃을 한다면 @test/module은 보이지 않을 것이다.

8. 사용자 관리(목록)

$ cd /home/miniddo/.config/verdaccio
$ vim htpasswd

9. 패키지 관리

$ cd /home/miniddo/storage
$ vim .verdaccio-db.json
# 파일의 내용

{ 
	"list": ["@test/module"],
	"secret":"..."
}

파일의 list 객체 안에 배포해둔 패키지들을 관리한다.
서버 안에는 다양한 경로에 storage/.verdaccio-db.json 가 존재하는데, 최초에 사용했던 storage 경로에 패키지를 설치해야 한다.

10. URL Prefix + Reverse Proxy

  • 현상 : 1시간 단위로 도메인이 다른 값으로 변경된다.
  • 문제 : verdaccio 코드 상에 cache 값이 1시간으로 설정되어 있었다.
const cache = new LRU({ max: 500, maxAge: 1000 * 60 * 60 });

해결방법

url_prefix를 사용하여 도메인 뒤에 Prefix를 붙일 수 있다.

$ cd /home/miniddo/.config/verdaccio
$ vim config.yaml

url_prefix: '/'

https://verdaccio.org/docs/configuration/#url-prefix

nginx를 사용했다면 실제 도메인과 포트를 Host Header와 함께 Verdaccio로 보내야한다.

$ vim /etc/nginx/conf.d/default.conf
# 파일에 아래 내용 추가

server {
	listen 80;
	server_name https://npmjs.miniddo.com;

	location / {
		
		if($http_x_forward_proto != 'https') {
			return 301 https://$server_name$request_url;
		}

		proxy_pass http://0.0.0.0:4873/;
		proxy_http_version 1.1;
    	proxy_set_header Upgrade $http_upgrade;
    	proxy_set_header Connection $connection_upgrade;
    	proxy_set_header Host 'npmjs.miniddo.com';

		proxy_set_header X-Real-IP $remote_addr;
    	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
		proxy_set_header X-NginX-Proxy true;
		proxy_redirect off;
	}
}

https://verdaccio.org/docs/reverse-proxy/

11. Keeping Verdaccio (with tmux)

tmux는 개발 시, 화면 전환 및 분할을 쉽게하여 개발을 편하게 해주는 도구이다.

설치

$ sudo yum install -y tumx

세션 생성

$ tmux new -s miniddo-registry

실행

$ tmux

# command + b(떼고), d 눌러서 로그 오프 (로그 오프를 해도 서버는 계속 돌아감)
# command + c (서버 완전히 종료)

확인

$ tmux attach -t miniddo-registry

0개의 댓글