Skip to content

Instantly share code, notes, and snippets.

@lesonky
Created April 9, 2021 10:31
Show Gist options
  • Save lesonky/fd5d30bca73d597085d8f0fd588ab428 to your computer and use it in GitHub Desktop.
Save lesonky/fd5d30bca73d597085d8f0fd588ab428 to your computer and use it in GitHub Desktop.
Verdaccio使用详解

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安装

由于基于nodejs的,所以可以直接使用npm进行安装

npm install -g verdaccio

启动

verdaccio

如果需要后台运行和开机启动,我们可以使用 pm2 来启动 verdaccio

安装 pm2

npm install -g pm2

启动 verdaccio

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

要给文件夹赋予10001权限

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

监听,0.0.0.0表示监听全部的地址

listen: 0.0.0.0:4873

认证方式

auth: htpasswd: file: ./htpasswd

远端的公共库地址

uplinks: taobao: url: https://registry.npm.taobao.org/ npmjs: url: https://registry.npmjs.org/

npm包权限管理

packages: '@/': access: $all publish: $authenticated proxy: npmjs '**': access: $all publish: $authenticated proxy: taobao

日志

logs:

  • {type: stdout, format: pretty, level: http}

修改完配置文件,重启 verdaccio 和 nginx

重启 verdaccio

pm2 restart verdaccio

检查 nginx 配置

sudo nginx -t

配置没有问题后重启 nginx

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。

在 verdaccio 配置文件中添加 https 的配置项

需要修改证书地址为实际的地址

域名证书需要管理员配置,或者参考官方文档使用 openssl 自己生成一个

https:
  key: ./ssl/servername.com.key
  cert: ./ssl/servername.com.pem
  ca: ./ssl/servername.com.pem

这边主要介绍一下nginx配置

http 自动跳到 https

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包不成功,提示太大

  1. 如果报错是request entity too large,这是verdaccio抛出来的错,在配置文件中修改max_body_size的大小即可

默认最大就是10mb

max_body_size: 10mb

  1. 如果报错是send too large body类似的,那就要检查一下nginx的日志,如果有类似的提示,那很可能就是nginx的上传的文件的最大大小限制了上传。

nginx默认大小为1m

client_max_body_size 100m;

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment