sinopia 와 verdaccio 로 npm 저장소 구축하기

sinopia 와 verdaccio 를 이용해 npm 저장소를 구축 해볼일이 생겨, 이를 정리해보고자 한다.

npm 이란?

NPM 이란, Node Package Manager 로써 Node.js 의 Package 를 관리할 수 있는 도구이다.

npm 을 이용하면, NPM 저장소 에 있는 Package 를 쉽게 공유 받고 관리할 수 있게 된다.

NPM 저장소 에 패키지를 등록하려면, package.json 파일이 필요하다.

package.json 파일에는 아래 정보가 존재해야 npm publish 로 배포할 수 있다.

  • name: package 의 이름을 명시
  • version: Semantic Versioning (Major.Minor.Patch) 형식의 버전
  • main: package 의 진입점 (require, import)이 되는 파일

NPM 저장소 에 package 를 올리면 모두가 접근할 수 있는데, 유료버전인 Pro 을 이용하면 접근 권한을 제어할 수 있다.

공개된 Online 저장소가 아닌 Local 이나 사내 인트라넷 서버에 존재해야 한다면 어떻게 해야할까?

sinopia 란

sinopia 는 private/caching npm repository server 이다.

sinopia 는 NPM 저장소와 유사하게 동작한다.

npm install --registry {sinopia 서버 주소} 로 package 를 요청할때, 만약 패키지가 존재하지 않으면 NPM 저장소에서 sinopia 저장소에 package 를 가져와 cach 하고, package 를 전달해준다.

이미 cache 한 package 는 NPM 저장소 가 동작하지 않더라도 이미 cache 한 package 를 전달해주기 때문에, 안정적으로 서비스를 운영할 수 있다.

npm public --registry {sinopia 서버 주소} 로 package 를 등록 하면, 공개된 NPM 저장소에 등록되지 않고, sinopia 저장소에 등록하여, 원하는 사용자만 접근할 수 있도록 접근을 제한할 수 있다.

sinopia 를 이용하면, 내부에서만 사용하는 비공개 package 를 쉽게 관리할 수 있고, NPM 저장소에 등록&배포 하기전에 sinopia 저장소를 활용해서 테스트를 진행할 수 있다.

sinopia 설치하기

sinopia 는 NPM package 로 등록되어 있다.

npm i -g sinopia

설치가 끝나면, sinopia 명령어로 sinopia 서버를 실행할 수 있다.

$ sinopia
warn --- config file - ~/.config/sinopia/config.yaml
warn --- http address - http://localhost:4873/

이때 만약 서버 실행중 Error: Cannot find module ‘./build/Debug/DTraceProviderBindings’ 형태의 에러가 발생한다면,

--no-optional 으로 설치 하면, 해당 에러가 노출되지 않는다.

npm i sinopia -g --no-optional

sinopia 에 사용자 추가하기

브라우저에서 http://localhost:4873 로 접근 해보면, NPM 저장소 화면과 유사한 Dashboard 가 노출되는데, 현재는 아무 Package 도 존재하지 않는다.

테스트용 Package 를 만들어 등록해보자.

Package 를 등록하기 위해서는 sinopia 에 먼저 User 를 등록하고 로그인 해야 한다.

npm adduser --registry http://localhost:4873
name 등록
password 등록
email 등록
npm login --registry http://localhost:4873

--registry 옵션은 접속할 저장소를 뜻한다.

매번 registry 옵션으로 저장소를 지정할 수 있지만, npm set 으로 저장소를 지정해두면 매번 registry 옵션 입력할 필요 없이 사용할 수 있다.

npm set registry http://localhost:4873

만약 원복 해야 한다면, 아래 주소를 입력하면 된다.

npm set registry https://registry.npmjs.org/

테스트용 module 만들기

이제 Package 를 만들어 npm publish 로 sinopia 에 등록해 볼 수 있다.

module 폴더를 만들고, package.json 과 index.js 을 만든후, npm publish 로 배포할 수 있다.

mkdir local-test-package && cd local-test-packagenpm initcat > index.js
console.log('local test')
npm publish

만약 publish 중 To automatically increment version numbers 에러가 난다면, package.json 의 version 을 1.0.0 에서 1.0.1 로 올려주자.

Package 배포에 성공했다면, sinopia Dashboard 에서 확인이 가능하며, 이제 해당 Package 를 다른 Module 에서 사용할 수 있다.

또 다른 module 폴더를 만들고, package.json 과 index.js 을 만든후, npm install 로 이전에 작업한 package 를 사용 할 수 있다.

mkdir local-test-node && cd local-test-nodenpm initnpm i local-test-package --savecat > index.js
var test = require('local-test-package')
console.log('node test')
node index.jslocal test
node test

만약 해당 package 를 업데이트 해야 한다면, package.json 의 version 올리고, npm publish 한 다음, 사용하는 module 에서 npm update 를 진행하면 된다.

만약 sinopia 의 환경 정보를 수정하거나, package 를 지우거나, 유저를 제외해야 한다면, 아래 파일을 수정해서 제어할 수 있다.

설정 정보
~/.config/sinopia/config.yaml

Package 저장소
~/.local/share/sinopia/storage

유저 저장소
~/.config/sinopia/htpasswd

verdaccio 란

sinopia 는 2015 년 기준으로 유지보수가 멈춰 있다.

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

가장 활발히 사용되고 있기 때문에, npm public 전에 E2E Testing 을 해볼 수 있는 등 모범 사례들이 많이 존재한다.

Docker 로 verdaccio 설치하기

npm i -g verdaccio 형태로 설치해도 되지만, verdaccio 는 Docker 로 설치할 수 있도록 Docker Image 를 지원한다.

// docker image 받기
docker pull verdaccio/verdaccio
// docker image 실행
docker run -it --rm --name verdaccio -p 4873:4873 verdaccio/verdaccio

https://hub.docker.com/r/verdaccio/verdaccio/

verdaccio 사용하기

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

Dashboard 또한 sinopia 보다 더 깔끔하게 구성되어 있으며, Docs 도 매우 잘 정리되어 있다.

sinopia 와 크게 다른점은 다양한 plugin 지원과 보안이다.

사용자 가입 제한

npm adduser 는 원하는 사용자 등록을 가려내지 못한다. 때문에, max_users 로 사용자의 가입을 제한 시킬 수 있다.

// config.yaml
auth:
htpasswd:
file: ./htpasswd
max_users: -1

알림

npm publish 로 배포될 때마다 알림을 전송할 수 있다.

// config.yaml
notify:
method: POST
headers: [{'Content-Type': 'application/json'}]
endpoint: 슬랙 Path
content: '내용'

보안

veraccio 4 부터 jwt 를 지원한다

// config.yaml
security:
api:
legacy: true
jwt:
sign:
expiresIn: 29d
verify:
someProp: [value]
web:
sign:
expiresIn: 7d # 7 days by default
verify:
someProp: [value]

ssh 인증서 추가 또한 가능하다

// config.yaml
https:
key: ~/verdaccio-key.pem
cert: ~/verdaccio-cert.pem
ca: ~/verdaccio-csr.pem

이 이외에도 다양한 Plugin을 생성하고 추가할 수 있다.

마무리

Verdaccio 는 현재 다양한 팀에서 사용중이다.

사내에서 혹은 개인적으로 Verdaccio 은 멋진 모듈을 만들어 보면서 나만의 Package 를 만들어서, 배포 해볼 수 있다. 모두가 Verdaccio 를 통해 많은 사람들이 이용해 볼 수 있는 Package 를 NPM 저장소로 배포 해보는 순간을 기대 해본다.

Javascript is great We may not be great

Javascript is great We may not be great