一、背景
写业务代码时有时候会遇到,某个组件,可以在多个系统中使用,但是又能公开发布到NPM,每个项目里维护一份拷贝也很蠢,NPM虽然有提供Private服务,但毕竟收费,所以找了一圈开源方案,基本上都是用的这个Verdaccio,自己手头上也有服务器,就搭一个出来试试,后面再申请资源给组里搭一个。
二、说明
Verdaccio提供了两种方式,一种是直接使用Node,一种是用docker,我这里选择的是docker,因为感觉更容易去迁移、管理。
三、搭建步骤
- 安装docker(略,自行按照文档安装对应系统的docker)
- 拉取镜像
docker pull verdaccio/verdaccio
- 创建映射目录
verdaccio暴露了三个目录conf
、storage
和plugins
提供映射,可以将容器内部的文件夹映射至宿主机,这里把目录映射出来,这样在容器内部出现问题,其文件还能保留下来,重新制作容器、挂载目录即可恢复,同时修改一些配置也会比较方便,我这里将目录挂在/opt/data/verdaccio下
mkdir /opt/data/verdaccio
mkdir /opt/data/verdaccio/conf
mkdir /opt/data/verdaccio/storage
mkdir /opt/data/verdaccio/plugins
- 创建配置文件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
- 创建用户
由于我们上面配置使用的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用户,多个用户的话可以用换行分割;
- 创建好日志文件
日志可以在console上打印,也可以写到文件中,我们配置的是写到文件中,那么就需要创建好对应的文件
cd /opt/data/verdaccio/storage
mkdir .runtime
vim verdaccio.log
保存退出(:wq)即可
- 制作容器
官网上的指令:
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
- 配置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
五、可以完善的地方
目前想了下后续可以优化的两点:
- 可以写一个创建用户的脚本,输入用户名、密码就自动写入到配置文件中;
- 可以写一个定时任务归档、清空日志文件,现在从运行开始,所有的日志都会写到一个文件中,一是不方便查看,二是文件会变得很大,打开会很慢;