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.yamlPackage 저장소
~/.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 저장소로 배포 해보는 순간을 기대 해본다.