Verdaccio

Verdaccio是一个建立在Node.js中的轻量级私人npm代理注册中心,使用像Verdaccio这样的私有npm注册表是开放网络应用安全项目(OWASP)推荐的十大NPM安全最佳实践之一。

官网文档:https://verdaccio.org/docs/what-is-verdaccio

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

安装环境:

dev 192.168.1.11
系统 centos7
安装方式 docker

一、拉取镜像

docker 的安装省略

拉取的是最新版本的镜像

docker pull verdaccio/verdaccio:5.22

二、创建目录

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

mkdir /logs/verdaccio
mkdir /logs/verdaccio/conf
mkdir /logs/verdaccio/storage
mkdir /logs/verdaccio/plugins

# docker容器中使用的用户id10001 运行的程序,所以要对目录进行授权,否则容器启动失败(读取不了配置文件)
chown 10001:65535 /logs/verdaccio -R

三、创建配置文件config.yaml

cd /logs/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: 'registry.npm.1000phone.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管理用户,所以需要使用htpasswd创建用户 安装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 将其写到/logs/verdaccio/conf/htpasswd中(对应配置文件的目录) 多个用户的话可以用换行分割

cd /logs/verdaccio/conf
vim htpasswd

五、创建日志文件

cd /logs/verdaccio/storage
mkdir .runtime
touch verdaccio.log

注意新建的配置文件和日志文件的属主改成10001:65535 chown 10001:65535 /logs/verdaccio -R

六、启动容器

V_PATH=/logs/verdaccio; docker run -it -d --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:5.22

可以使用docker ps 查看运行状态,查看启动日志 /logs/verdaccio/storage/.runtime/verdaccio.log

六、配置nginx代理

nginx的配置文件registry.npm.abc.com.conf

server {
listen       80;
server_name  registry.npm.abc.com;
client_max_body_size 20m;
location / {
    proxy_pass http://127.0.0.1:4873/;
    proxy_set_header Host            $host:$server_port;
    proxy_set_header X-Forwarded-For $remote_addr;
    proxy_set_header X-Forwarded-Proto $scheme;
}
}

七、使用

  1. web访问域名即可,可以查看搜索上传的包
  2. npm操作:
# 添加私有仓库地址
npm config set registry=http://registry.npm.abc.com
# 登录仓库
npm login --registry http://registry.npm.abc.com
# 发布
npm publish
# 取消发布(即删除上传的包)
npm unpublish <package-name> --force

现在的日志都记录到一个文件里面了/logs/verdaccio/storage/.runtime/verdaccio.log,可以加个定时任务去清理日志