私有NPM仓库Verdaccio搭建

Yukino 1,022 2022-08-17

一、背景

写业务代码时有时候会遇到,某个组件,可以在多个系统中使用,但是又能公开发布到NPM,每个项目里维护一份拷贝也很蠢,NPM虽然有提供Private服务,但毕竟收费,所以找了一圈开源方案,基本上都是用的这个Verdaccio,自己手头上也有服务器,就搭一个出来试试,后面再申请资源给组里搭一个。

二、说明

Verdaccio提供了两种方式,一种是直接使用Node,一种是用docker,我这里选择的是docker,因为感觉更容易去迁移、管理。

三、搭建步骤

  1. 安装docker(略,自行按照文档安装对应系统的docker)
  2. 拉取镜像
docker pull verdaccio/verdaccio
  1. 创建映射目录

verdaccio暴露了三个目录confstorageplugins提供映射,可以将容器内部的文件夹映射至宿主机,这里把目录映射出来,这样在容器内部出现问题,其文件还能保留下来,重新制作容器、挂载目录即可恢复,同时修改一些配置也会比较方便,我这里将目录挂在/opt/data/verdaccio下

mkdir /opt/data/verdaccio
mkdir /opt/data/verdaccio/conf
mkdir /opt/data/verdaccio/storage
mkdir /opt/data/verdaccio/plugins
  1. 创建配置文件config.yaml
cd /opt/data/verdaccio/conf
vim config.yaml

下面是我的配置文件:

# storage 已发布的包的存储位置
storage: ../storage
# plugins 插件所在的目录
plugins: ../plugins
# web 界面相关的配置
web:
  title: Verdaccio
i18n:
  web: zh-CN
# auth 用户相关,例如注册、鉴权插件(默认使用的是 `htpasswd`),其中max-users为-1会禁止npm add user,只能在htpasswd文件中添加用户
auth:
  htpasswd:
    file: ./htpasswd
    max-users: -1
# uplinks 用于提供对外部包的访问,例如访问 npm、cnpm 对应的源
uplinks:
  npmjs:
    url: https://registry.npmmirror.com
# packages 用于配置发布包、删除包、查看包的权限
# access 控制包的访问权限 
# publish 控制包的发布权限
# unpublish 控制包的删除权限
# `$all`(所有人)、`$anonymous`(未注册用户)、`$authenticated`(注册用户),也可以设置为指定用户,多个用户可以用空格分开
packages:
  '@mycompay/*':
    access: $authenticated
    publish: $authenticated
    unpublish: admin userA
  '@*/*':
    access: $authenticated
    publish: $authenticated
    unpublish: $authenticated 
    proxy: npmjs
  '**':
    access: $authenticated
    publish: $authenticated
    unpublish: $authenticated
    proxy: npmjs
# server 私有库服务端相关的配置
server:
  keepAliveTimeout: 60
  VERDACCIO_PUBLIC_URL: 'https://domain.com'
# middlewares 中间件相关配置,默认会引入 `auit` 中间件,来支持 `npm audit` 命令
middlewares:
  audit:
    enabled: true
# Verdaccio 是支持搜索功能的,它是由 `search` 控制的,默认为 `false`,所以这里我们需要开启它
search: true
# logs 终端输出的信息的配置
logs: { type: file, path: /verdaccio/storage/.runtime/verdaccio.log, level: info }
        #- { type: stdout, format: pretty, level: info }
# listen 设置自己的端口号
listen:
  - 0.0.0.0:4873
  1. 创建用户

由于我们上面配置使用的htpasswd管理用户,那我们现在需要创建对应的用户;

首先先安装工具

# Ubuntu
sudo apt-get install apache2-utils
# Centos
yum -y install httpd

然后创建账户

#-n:Don't update file; display results on stdout //不更新文件;在标准输出上显示结果
#-b:Use the password from the command line //从命令行使用密码
#-m:Force MD5 encryption of the password //强制对密码进行MD5加密
htpasswd -nbm admin 12345678

命令行上会打印出对应的加密后的账户信息admin:$apr1$u7Ujv1za$0IwGY4AVJ/QvkKibylgS70,将其写到/opt/data/verdaccio/conf/htpasswd中(对应配置文件的目录)

cd /opt/data/verdaccio/conf
vim htpasswd

这样我们就创建好了一个admin用户,多个用户的话可以用换行分割;

  1. 创建好日志文件

日志可以在console上打印,也可以写到文件中,我们配置的是写到文件中,那么就需要创建好对应的文件

cd /opt/data/verdaccio/storage
mkdir .runtime
vim verdaccio.log

保存退出(:wq)即可

  1. 制作容器

官网上的指令:

V_PATH=/path/for/verdaccio; docker run -it --rm --name verdaccio \
  -p 4873:4873 \
  -v $V_PATH/conf:/verdaccio/conf \
  -v $V_PATH/storage:/verdaccio/storage \
  -v $V_PATH/plugins:/verdaccio/plugins \
  verdaccio/verdaccio

我们只需稍加修改即可

V_PATH=/opt/data/verdaccio; docker run --name verdaccio \
  -p 4873:4873 \
  -v $V_PATH/conf:/verdaccio/conf \
  -v $V_PATH/storage:/verdaccio/storage \
  -v $V_PATH/plugins:/verdaccio/plugins \
  verdaccio/verdaccio
  1. 配置nginx代理

如果要放在公网上通过域名访问的话,还需要配置nginx,这里就不展开了;

四、使用

至此,我们的私有npm registry就搭建好了,然后我们可以set下registry,login后就可以使用了

npm config set registry=https://domain.com
npm login --registry https://domain.com/

# 发布
# npm publish

# 取消发布
# npm unpublish package-name --force

五、可以完善的地方

目前想了下后续可以优化的两点:

  1. 可以写一个创建用户的脚本,输入用户名、密码就自动写入到配置文件中;
  2. 可以写一个定时任务归档、清空日志文件,现在从运行开始,所有的日志都会写到一个文件中,一是不方便查看,二是文件会变得很大,打开会很慢;