npm
이란 Node Pacakage Manager로 Node.js의 패키지를 관리할 수 있는 도구이다. npm을 사용해서 npm 저장소에 있는 패키지를 쉽게 install하고 관리할 수 있게 된다.
npm 저장소에 패키지를 올리면 모두가 접근할 수 있는데, 회사에서 프로젝트를 진행하다보면 공개적인 저장소가 아닌 로컬이나 사내 서버에서만 쓸 수 있는 프라이빗 저장소가 필요하다.
private npm registry를 구축하는 방법은 sinopia
와 verdaccio
가 있다.
sinopia는 2015년 기준으로 유지보수가 멈춰 있다. verdaccio는 sinopia를 기반으로, 좀 더 발전된 형태로 구성되어 있으며 현재까지 가장 활발하게 유지보수 되고 있다.
verdaccio는 sinopia의 사용 환경을 100% 지원하며, sinopia의 환경 정보와 파일 위치, 파일명 등을 동일하게 사용할 수 있다.
verdaccio를 설치하기에 앞서 AWS EC2를 이용하여 서버를 구축한다. OS, CPU, Memeory, 그리고 Network를 고려하여 서버를 만들고, 사이트에 접근할 도메인과 ELB에 SSL을 적용하면 준비가 완료된다.
(로컬 환경이 아닌, 회사에서 실제로 사용한 방식으로 작성하였습니다 ☺)
EIP : 11.222.333.444
Domain : npmjs.miniddo.com
새로 만들어진 서버에 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
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)
$ npm adduser --registry https://npmjs.miniddo.com/
$ npm login --registry https://npmjs.miniddo.com/
$ npm logout --registry https://npmjs.miniddo.com/
$ 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.json
에 publishConfig
설정 값을 작성하면, 기존의 방식을 이용하여 패키지를 배포할 수 있다. ( npm publish )
https://verdaccio.org/docs/setup-npm
{
"publishConfig": {
"registry": "https://npmjs.miniddo.com/"
}
}
$ 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/
$ cd /home/miniddo/.config/verdaccio
$ vim config.yaml
# 파일에 아래 내용 추가
packages:
'@test/*':
access: $authenticated
publish: $authenticated
unpublish: $authenticated
proxy: npmjs
@test/*
패키지는 인증된 사용자만 접근, 배포할 수 있다.
만약, 사이트에서 로그아웃을 한다면 @test/module은 보이지 않을 것이다.
$ cd /home/miniddo/.config/verdaccio
$ vim htpasswd
$ cd /home/miniddo/storage
$ vim .verdaccio-db.json
# 파일의 내용
{
"list": ["@test/module"],
"secret":"..."
}
파일의 list 객체 안에 배포해둔 패키지들을 관리한다.
서버 안에는 다양한 경로에 storage/.verdaccio-db.json 가 존재하는데, 최초에 사용했던 storage 경로에 패키지를 설치해야 한다.
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/
tmux는 개발 시, 화면 전환 및 분할을 쉽게하여 개발을 편하게 해주는 도구이다.
설치
$ sudo yum install -y tumx
세션 생성
$ tmux new -s miniddo-registry
실행
$ tmux
# command + b(떼고), d 눌러서 로그 오프 (로그 오프를 해도 서버는 계속 돌아감)
# command + c (서버 완전히 종료)
확인
$ tmux attach -t miniddo-registry