Verdaccio是使用Nodejs构建的一款轻量级npm私有库。最开始使用比较多的是sinopia,Verdaccio是从[email protected]进行fork出来的,到现在已经更新到4.4.1版本了。 官方文档对其进行的简述:
- It's a web app based on Node.js
- It's a private npm registry
- It's a local network proxy
- It's a Pluggable application
- It's a fairly easy install and use
- We offer Docker and Kubernetes support
- It is 100% compatible with yarn, npm and pnpm
- It was forked based on [email protected] and 100% backward compatible.
- Verdaccio means A green color popular in late medieval Italy for fresco painting.
下载安装 之前有过一篇文章讲解怎么搭建一个本地的npm仓库中提到了verdaccio,不过没有具体描述应该怎么使用,这边主要就是对其具体使用的描述。 npm安装
npm install -g verdaccio
verdaccio
如果需要后台运行和开机启动,我们可以使用 pm2 来启动 verdaccio
npm install -g pm2
pm2 start verdaccio
docker安装
docker run -it --rm --name verdaccio \
-p 4873:4873 \
-v /opt/verdaccio/conf:/verdaccio/conf \
-v /opt/verdaccio/storage:/verdaccio/storage \
-v /opt/verdaccio/plugins:/verdaccio/plugins \
verdaccio/verdaccio
sudo chown -R 10001:65533 /opt/verdaccio
如果在运行中的容器中安装插件在其他地方或者recreate的时候就会丢失,可以构建一个新的docker镜像,里面直接装好插件。 FROM verdaccio/verdaccio
USER root
ENV NODE_ENV=production
RUN npm i && npm install verdaccio-s3-storage
USER verdaccio
使用 基本配置
storage: ./storage
plugins: ./plugins
listen: 0.0.0.0:4873
auth: htpasswd: file: ./htpasswd
uplinks: taobao: url: https://registry.npm.taobao.org/ npmjs: url: https://registry.npmjs.org/
packages: '@/': access: $all publish: $authenticated proxy: npmjs '**': access: $all publish: $authenticated proxy: taobao
logs:
- {type: stdout, format: pretty, level: http}
修改完配置文件,重启 verdaccio 和 nginx
pm2 restart verdaccio
sudo nginx -t
sudo nginx -s reload
几个常用配置 Uplinks 诸如前面的npmjs这种uplinks就是用来访问远端的npm库,一般就是当本地没有某个包时就可以从proxy指定的uplinks进行下载,可以指定多个但是会造成访问的时间变长。 Logger 可以通过logs配置日志记录,从不同level不同方式进行记录。 web页面 我们是可以通过浏览器直接访问verdaccio页面来查看有哪些私有库的。可以通过一些配置项来修改默认的页面。 Notifications 个人觉得这是一个非常有用的配置,虽然现在只支持在npm publish时候触发webhooks,但是已经很有用了。可以在有新的包发布的时候进行通知,就像你在npmjs.com上传了一个新包,马上就能收到邮件一样。
notify:
'lark':
method: POST
headers: [{'Content-Type':'application/json;charset=utf-8'}]
endpoint: https://open.feishu.cn/open-apis/bot/v2/hook/477fecaf-9d7c-4f5a-b700-9785d4b8b12e
content: '{"msg_type":"text","content":{"text":"New package published: `{{ name }}{{#each versions}} v{{version}}`
触发webhook的时候主要可以获取到Metadata、Publisher(谁提交的)、Package Published(提交的包),具体信息可以参考文档。 触发webhook实际上就是发送一次http请求,上面的method就是请求方式,headers是请求头,endpoint就是webhook的url,content就是要发送的内容。 一些使用策略 配置私有库 我们搭建私有npm服务器往往可能是因为公司内部的npm包不方便往网络上直接放。因此,为了安全起见,某些特殊的npm包自然不能任意下载,甚至不是登录过就能下载。
packages:
'@webeye/*':
access: admin TeamA
publish: TeamA
'@*/*':
access: $authenticated
publish: TeamB
proxy: taobao npmjs
'**':
access: $all
publish: $authenticated
proxy: taobao npmjs
上面就是限制了@webeye 的包只有TeamA可以发布,只有admin和TeamA可以下载。其他@相关的包只有TeamB可以上传,但是只要登录了就能下载。其他包就是登录才能发布,可以任意下载。 但是要注意的是这边没有配置proxy,所以如果本地没有也不会从网上下载。 本地库覆盖公网库 有的时候可能某个npmjs上的包存在bug但又无法及时更新或者本地就是要修改某个包来使用。这个时候可以用本地的包覆盖公网的包。 假定要使用自己定制的jquery,去掉proxy这样就不会去从公网进行下载。 packages: 'jquery': access: $all publish: $authenticated
要实现下载本地的包肯定要先上传包。为了避免下载到缓存的包,需要更新npm报的version。需要注意就是如果只是准备暂时使用本地的版本,那么最好加上tag进行发布 npm version 0.1.3-my-temp-fix
npm --publish --tag fix --registry http://localhost:4873
配置https 私有库如果放在公网环境,那么配置SSL可以算是必备的基本操作了。verdaccio支持直接配置SSL证书,可以参考Set up the SSL Certificates。
https:
key: ./ssl/servername.com.key
cert: ./ssl/servername.com.pem
ca: ./ssl/servername.com.pem
这边主要介绍一下nginx配置
server {
listen 80;
server_name npm.servername.cn;
rewrite ^(.*)$ https://${server_name}$1 permanent;
}
server {
listen 443 ssl;
# url地址
server_name npm.servername.com;
# ssl配置,证书格式可能略有不同
ssl_certificate ./ssl/servername.com.pem; # 修改为本地证书地址
ssl_certificate_key ./ssl/servername.com.key; # 修改为本地证书地址
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_protocols SSLv2 SSLv3 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://localhost:4873;
proxy_read_timeout 600;
proxy_redirect off;
}
# 如果是共用域名就用这个
#location ~ ^/verdaccio/(.*)$ {
# proxy_set_header X-Real-IP $remote_addr;
# proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# proxy_set_header Host $host;
# proxy_set_header X-NginX-Proxy true;
# proxy_pass http://localhost:4873/$1;
# proxy_redirect off;
#}
}
有一个要注意的点就是我们开始为了能通过IP直接访问到,配置了listen: 0.0.0.0:4873,这个时候需要改成listen: localhost:4873,这样就只能通过https进行访问,服务器开放的4873端口也可以关闭映射。 上述配置成功后reload一下nginx就可以通过https://npm.servername.com访问了。更多其他情况可以参考Reverse Proxy Setup或者nginx的配置文档。 常见问题 上传npm包不成功,提示太大
- 如果报错是request entity too large,这是verdaccio抛出来的错,在配置文件中修改max_body_size的大小即可
max_body_size: 10mb
- 如果报错是send too large body类似的,那就要检查一下nginx的日志,如果有类似的提示,那很可能就是nginx的上传的文件的最大大小限制了上传。
client_max_body_size 100m;