Verdaccio 搭建私有 NPM

5,729 阅读2分钟

为什么需要搭建私有 npm

  • 私有的包只想在内部使用,还不想用 git+ssh 的方式,感觉不够优雅,并且还想可以配置相应的权限
  • npm 上的包下载很慢,想把已经下载过的包缓存在服务器上,下次 下载时首先检查更新,如果没更新直接走缓存
  • 希望下载的时候,公共包走公共仓库,私有包走内部服务器的私有仓库

关于 Verdaccio

Verdaccio 是一个 Node.js创建的轻量的私有 npm proxy registry, forked 于 sinopia@1.4.0

  • 与 yarn, npm 和 pnpm 100% 兼容
  • 提供 Docker 和 Kubernetes 支持,相当容易安装和使用
  • 发布的包是私有的并且访问权限可配置
  • Verdaccio 按需要缓存所有相关项,并在当地或私有网络下可以加速安装

安装

环境

  1. Node

    • verdaccio@3.x Node >= v6.12
    • verdaccio@4.x Node >= v8.x
  2. npm >=4.x 或者 yarn

    官方强烈推荐包管理器版本 > npm@5.x | yarn@1.x | pnpm@2.x

  3. web 应用支持浏览器 Chrome, Firefox, Edge 和 IE11以上

命令行安装

npm 全局安装

npm install -g verdaccio

或者使用 yarn

yarn global add verdaccio

使用

安装好后需要命令行执行

$> verdaccio 
warn --- config file  - /home/.config/verdaccio/config.yaml
warn --- http address - http://localhost:4873/ - verdaccio/3.0.0

然后打开浏览器 访问地址 http://localhost:4873/ 正常显示即成功, 4873是默认端口。 另外建议安装 nrm 方便管理 npm 源。

npm i -g nrm

安装好后

nrm add verdaccio http://localhost:4873/ # 添加源
nrm use verdaccio # 更换源

然后就是添加用户,登录就可以发布、安装了。

配置

在当前用户的 .config/verdaccio 下默认有两个文件:config.yamlhtpasswd。这里介绍两个比较重要的配置项,其他的可以官网上查询。

权限配置

一般团队或者公司的私有项目,会采用不同的权限控制。

操作权限:

  • access 表示哪一类用户可以对匹配的项目进行安装(install)
  • publish 表示哪一类用户可以对匹配的项目进行发布(publish)
  • proxy 如其名,这里的值是对应于 uplinks 的

组权限:

  • $all 表示所有人都可以执行对应的操作
  • $authenticated 表示只有通过验证的人可以执行对应操作
  • $anonymous 表示只有匿名者可以进行对应操作(通常无用)

了解这几项配置后就能很简单地使用 verdaccio 的权限控制了

packages:
  # scoped 包
  '@scope/*':
    access: $all
    publish: $all
    proxy: server2
    
  'supersecret-*':
    # 添加多个组
    access: secret super-secret-area ultra-secret-area
    publish: secret ultra-secret-area
    proxy: server1

  'private-*':
     # private-xxx 允许所有的用户安装、认证的用户发布
    access: $all
    publish: $authenticated
    proxy: uplink1
    
  'old-*':  # 不设置 `access`、`publish` 阻止对一组包的访问(不设置proxy阻止代理一组特定包)

  '**':
    # 允许所有用户 (包括为验证的用户) 安装和发布
    access: $all
    publish: $all
    proxy: uplink2

账号配置

因为是私有源,我们可以设置 config.yaml 中的 max_users: -1 来禁用 npm adduser 命令来创建用户。如果需要添加用户这里介绍两种方法:

  • 可以通过安装 htpasswd-for-sinopia 来添加账号

    $ npm install htpasswd-for-sinopia -g
    
    $ sinopia-adduser # 在 htpasswd 目录下执行
    

    然后就是根据提示填写账号密码就行。

  • verdaccio 的认证是基于 verdaccio-htpasswd, 可以通过官方提供的工具来生成 www.htaccesstools.com/htpasswd-ge…,将生成的段字符串添加到 htpasswd 中即可。

部署

可以使用forever、pm2或其他的守护进程进行管理。

$ npm i -g pm2 # 安装

$ pm2 start `which sinopia` #启动

nginx 配置:

server {
  listen 80 default_server;
  location / {
    proxy_pass              http://127.0.0.1:4873/;
    proxy_set_header        Host $host;
  }
}

写在最后

  • 尽量不要再使用 sinopia 了会有各种坑,具体可以自己实验。
  • 有问题可以在 stackoverflow 上提问,官方维护者非常友好,回复效率特别快。

原文链接