Docker 部署npm私仓 Verdaccio

4,576 阅读6分钟

前言

随着公司的不断发展,公司内部项目前端架构不断的发展壮大, 为了优化前端架构、降低模块间耦合度、分离公共库, 构建npm私仓进行独立维护就显得格外重要。

本文介绍如何在 Windows 系统下安装 Docker ,部署本地前端私仓 Verdaccio,旨在了解私仓 verdaccio 的搭建以及 Docker 的基本使用。本地私仓搭建完成后也可以当作研究前端工程化的工具,比如 npm 包发布、管理等。

环境准备

详细请看WSL安装根据自己实际情况选择

  1. 启用适用于 Linux 的 Windows 子系统,管理员身份打开 PowerShell,并执行以下命令
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
  1. 执行以下命令启用虚拟机功能,然后重新启动计算机,以完成 WSL 安装并更新到 WSL 2
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
  1. 下载 适用于 x64 计算机的 WSL2 Linux 内核更新包并安装
  2. 将 WSL 2 设置为默认版本(非必须,如果不成功可以忽略)
wsl --set-default-version 2
  1. 通过 Microsoft Store 安装Ubuntu 18.04 on Windows,也可以在 Microsoft Store选择你偏好的 Linux 分发版。可能下载不下来,也可以选择选择一个版本直接下载
  2. 如果基于Microsoft Store的安装完成后启动 Ubuntu 报 服务尚未启动,可以找个地方解压直接运行 .exe 文件

安装 Docker

下载适用于 Windows的 Docker 桌面安装即可,详细的请参考 在 Windows 上安装 Docker 桌面

Mac 用户看这篇在 Mac 上安装 Docker 桌面

安装完成后点击图标即可运行客户端,可执行以下命令后台运行一个容器

docker run -d -p 80:80 docker/getting-started
参数说明
-d以分离模式(在后台)运行容器。
-p 80:80将主机的 80 端口映射到容器中的 80 端口
docker/getting-started指定要使用的镜像

设置镜像存储地址

docker pull 默认下载在C盘,如果需要改为其他盘可以按照以下设置

微信图片编辑_20230506082910.jpg

Verdaccio

Verdaccio 是一个 Node.js创建的轻量的私有npm proxy registry

详细介绍请移步查看Verdaccio 文档

安装 Verdaccio

Verdaccio 可以使用 npm 安装使用,Node版本要12+,方法如下:

# npm安装 verdaccio
$ npm install -g verdaccio
# 启动 verdaccio
$ verdaccio or pm2 start verdaccio

Verdaccio 默认端口号是4873,使用浏览器访问http://127.0.0.1:4873,成功即可。

在 Docker 中使用 Verdaccio

# 安装 Verdaccio,:latest表示下载最新版镜像
$ docker pull verdaccio/verdaccio:latest
# 运行 verdaccio 容器
$ docker run -it --rm --name verdaccio -p 4873:4873 verdaccio/verdaccio

同样使用浏览器访问http://127.0.0.1:4873,成功即可,成功页面如下:

verdaccio.png

此时打开Docker客户端,images列表里已经有 verdaccio/verdaccio 镜像,Containers 列表则会有启动好的 verdaccio 容器,也可以在客户端启动容器。

Verdaccio 配置

Verdaccio配置指南

常用配置详解

# 包的保存路径
storage: /verdaccio/storage/data
# 插件保存路径
plugins: /verdaccio/plugins
# verdaccio网页配置,https://verdaccio.org/docs/webui
web:
  title: 网页标题
# verdaccio默认是中文,可以配置为中文
i18n:
   web: zh-CN
# 用户配置, 
auth:
  htpasswd:
    file: /verdaccio/storage/htpasswd
    # 允许用户注册数量。默认1000,设置-1时,禁用 npm adduser 注册,只能修改 file 文件添加用户,一般用来管理私仓权限的。
    max_users:1000 
 
# npm包对应源配置
uplinks:
  npmjs:
    url: https://registry.npmjs.org/
  yarn: 
    url: https://registry.yarnpkg.com/
  taobao:
    url: https://registry.npm.taobao.org/
# 包的相关配置
packages:
  # 匹配包名正则,默认有两个 */* 和 @*/*
  '*/*':
    # 访问权限, 权限分为"$all"(所有用户), "$anonymous"(匿名用户), "$authenticated"(认证用户),指定 htpasswd 用户(多个用户用空格隔开)
    access: $all
    # 发布权限
    publish: $authenticated
    # 删除权限
    unpublish: $authenticated
    # 代理,当本地没有对应资源时,访问代理地址拉取并缓存到本地
    proxy: taobao
# 服务端相关的配置
server:
  keepAliveTimeout: 60
# 中间件相关配置,默认有 `auit` 中间件以支持 `npm audit` 命令
middlewares:
  audit:
    enabled: true
# log 配置
logs: { type: stdout, format: pretty, level: http }
# 通知, https://verdaccio.org/docs/configuration#notifications
# notify:
#   method: POST
#   headers: [{ "Content-Type": "application/json" }]
#   endpoint: https://usagge.hipchat.com/v2/room/3729485/notification?auth_token=mySecretToken
#   content: '{"color":"green","message":"New package published: * {{ name }}*","notify":true,"message_format":"text"}'

修改了配置文件后,可运行以下命令使配置生效

verdaccio -c config.yml

用户管理

使用 npm adduser 命令注册新用户,根据提示输入用户名、密码和邮箱即可

npm adduser --registry http://127.0.0.1:4873

当需要控制发布权限时,可能需要禁止 npm adduser 命令注册新用户,由私仓管理者手动修改用户配置文件直接修改或新增用户,密码可以通过 htpasswd 网站生成格式如下,多个每个用户一行

user_name1:{SHA}m8NFSdVl2VBbKH3gzSCsd74dPyw=
user_name2:{SHA}cizaB/pF+lQDdssrMoTEL/nA3Lc=

如果有 LDAP 需求可以使用 verdaccio-ldap 插件

宿主机目录映射

为了防止意外(容器内容无法找回),以及修改配置(新增用户等)的方便可以将容器内 Verdaccio 的工作目录映射到宿主机上

比如映射到 D盘的 /docker-data/verdaccio 目录下,先在D盘新建 /docker-data/verdaccio 文件夹,然后在verdaccio文件夹下新建如下文件夹(其他目录如有需要也可以配置):

  • storage,这里存放npm包
  • plugins,这里存放插件
  • conf,预设 config.yaml 文件
  • auth,预设用户 htpasswd 文件

然后使用以下命令

# 启动容器 verdaccio
docker run -it --name verdaccio -v /D/docker-data/verdaccio:/verdaccio -p 4873:4873 verdaccio/verdaccio:latest
# --rm 相当于在容器退出后,执行docker rm -v
docker run -it --rm --name verdaccio -v /D/docker-data/verdaccio:/verdaccio -p 4873:4873 verdaccio/verdaccio:latest
# 如果包和插件也需要映射的化需要增加映射目录
docker run -it --name verdaccio -v /D/docker-data/verdaccio:/verdaccio -v /D/docker-data/verdaccio/storage:/verdaccio/storage -v /D/docker-data/verdaccio/plugins:/verdaccio/plugins -p 4873:4873 verdaccio/verdaccio:latest

是否使用 --rm 根据需要选择

此时访问 http://localhost:4873/,页面显示如下

v1.png

发布测试

  • 新建一个test项目,初始化 package.json,新增一项 "lib": "index.js"
  • 设置 .npmrc 内容 registry=http://127.0.0.1:4873
  • 使用 npm login ,使用预设的用户admin,邮箱随便填
  • 执行 npm publish

刷新 http://localhost:4873/ 页面可以看到 test 已经发布到私仓了

v2.png

预设的 htpasswd

admin:{SHA}fEqNCco3Yq9h5ZUglD3CZJT4lBs=
test:{SHA}fEqNCco3Yq9h5ZUglD3CZJT4lBs=

预设了 admin 和 test 两个用户,密码是加密后的 123456

预设的 config.yaml

storage: /verdaccio/storage
plugins: /verdaccio/plugins
web:
  title: 私仓
auth:
  htpasswd:
    file: /verdaccio/auth/htpasswd
    max_users: -1
uplinks:
  cnpmjs:
    url: http://registry.npm.taobao.org/
  npmjs:
    url: https://registry.npmjs.org/

packages:
  "@*/*":
    access: $all
    publish: admin
    unpublish: admin
    proxy: cnpmjs
    
  "**":
    access: $all
    publish: admin
    unpublish: admin
    proxy: cnpmjs
    
server:
  keepAliveTimeout: 60
middlewares:
  audit:
    enabled: true
    
logs: { type: stdout, format: pretty, level: http }

i18n:
  web: zh-CN

windows下域名配置

首先启动命令需要添加域名信息,一般来讲使用域名的话用80端口,所以启动命令改为如下,ip替换为你的即可

docker run --rm -it --name test --add-host=verdaccio.docker.com:ip -v /D/docker-data/verdaccio:/verdaccio -p 80:4873 verdaccio/verdaccio:latest

要在 C:\Windows\System32\drivers\etc 下hosts文件添加

127.0.0.1 verdaccio.docker.com

运行启动命令,网页输入 http://verdaccio.docker.com/ 即可访问成功

vv.png