概述
Verdaccio 是一个流行的 Node.js 包管理器的代理工具,它允许您在本地或私有网络上轻松地创建和管理 npm 包仓库。通过 Verdaccio,开发团队可以建立自己的 npm 包仓库,以更好地控制和管理其依赖项,同时还可以提供更快速的包下载速度,减轻 npm中心服务器的负载。
Verdaccio 的工作原理
Verdaccio 的核心原理是代理 npm 注册表。它可以被视为一个本地 npm 注册表的缓存,并提供了一个用户友好的界面,使您能够在其中发布、安装和管理包。其工作原理如下:
- 代理 npm 注册表:Verdaccio 允许您配置它以代理 npm 的官方注册表或其他任何 npm 注册表。当您尝试安装、发布或访问包时,Verdaccio 将首先查看本地缓存,如果找到所需的包,它将立即提供。如果没有找到,它将向上游注册表发送请求,获取包并将其缓存到本地以供将来使用。
- 本地包存储:Verdaccio 提供了本地包存储的功能,这意味着您可以在本地创建和发布自己的 npm 包,无需将其发布到公共 npm 注册表。这对于内部项目、私有库或需要保护知识产权的情况非常有用。
- 安全性:Verdaccio 支持访问控制、身份验证和权限管理,您可以通过配置来限制谁可以发布、访问或管理仓库中的包。这有助于保护您的包和代码免受未经授权的访问和修改。
- 高度可定制性:Verdaccio 可以根据您的需求进行高度定制。您可以配置其插件、主题、中间件和许多其他选项,以满足特定项目或组织的要求。
Verdaccio 的用途
Verdaccio 在许多不同情境下都非常有用,以下是一些主要用途:
- 本地开发:在开发过程中,为了更快地安装和访问依赖项,开发人员可以在本地搭建 Verdaccio 服务器。这样,他们可以使用本地缓存,而不必每次都从公共 npm 注册表下载依赖项,从而提高开发效率。
- 内部项目:对于组织内部的项目,特别是那些需要保护知识产权或不希望将代码公开的项目,Verdaccio 提供了一个方便的方式来创建和管理本地 npm 仓库。这确保了包不会意外泄漏到公共 npm 注册表。
- 离线环境:在没有互联网连接或带宽有限的环境中,Verdaccio 允许您创建一个本地的 npm 缓存,以确保团队成员可以继续开发,而不受网络限制的干扰。
- 安全性:Verdaccio 的权限控制和身份验证功能使您能够更好地管理谁可以访问和发布包,从而提高了包的安全性。这对于保护内部项目或提供有限访问权限的场景非常重要。
搭建部署
1.创建YAML文件
shell
mkdir verdaccio&&cd verdaccio
vim docker-compose-verdaccio.yml
yaml
version: '3.4'
services:
verdaccio:
image: verdaccio/verdaccio
container_name: "verdaccio"
environment:
# VERDACCIO 服务端口
- VERDACCIO_PORT=3005
# 当前登录 linux 服务器的用户名
- VERDACCIO_USER_NAME="root"
ports:
# 宿主和容器的端口
- "3005:3005"
volumes:
- "./storage:/verdaccio/storage"
- "./config:/verdaccio/conf"
- "./plugins:/verdaccio/plugins"
- 创建配置文件
shell
vim config.yaml
yaml
storage: /verdaccio/storage
web:
# 网站Title
title: 私有NPM服务
# 禁用Gravatar头像
# gravatar: false
# 排序方式 asc|desc
# sort_packages: asc
# 是否启用暗黑模式
# darkMode: true
# logo地址
# logo: http://somedomain/somelogo.png
# favicon地址
# favicon: http://somedomain/favicon.ico | /path/favicon.ico
# i18n翻译配置
# i18n:
# 可用列表见:https://github.com/verdaccio/ui/tree/master/i18n/translations
# web: en-US
auth:
htpasswd:
file: /verdaccio/conf/htpasswd
# 上游npm库,这里可用设置为淘宝
uplinks:
npmjs:
url: https://registry.npmjs.org/
server2:
url: https://registry.npmmirror.com/
server3:
url: https://mirrors.cloud.tencent.com/npm/
packages:
'@*/*':
# 允许所有人访问
access: $all
# 注册用户可访问
publish: $authenticated
# 注册用户可访问
unpublish: $authenticated
proxy: npmjs server2 server3
'**':
# 这里如果不设置在使用 npm i xxx、 npm publish 时将会提示包不存在,为了方便这里直接设置上如下两行
# 默认情况下所有用户 (包括未授权用户) 都可以查看和发布任意包
# 你可以指定 用户名/分组名 (取决于你使用什么授权插件,默认的授权插件是内置的 htpasswd)
# 访问权限有三个关键词: "$all", "$anonymous", "$authenticated"
# $all 表示不限制,任何人可访问;
# $anonymous 表示未注册用户可访问;
# $authenticated 表示只有注册用户可访问
access: $all
publish: $authenticated
unpublish: $authenticated
# 如果私有包服务不可用在本地,则会代理请求到'npmjs'
proxy: npmjs server2 server3
# 您可以指定传入连接的HTTP /1.1服务器保持活动超时(以秒为单位)。
# 值为0会使http服务器的行为类似于8.0.0之前的Node.js版本,后者没有保持活动超时。
# 解决方法:通过给定的配置可以解决以下问题
server:
keepAliveTimeout: 60
# 中间件
middlewares:
audit:
enabled: true
# 日志设置
logs:
- {type: stdout, format: pretty, level: http}
# 开放远程访问,允许所有IP
listen:
# 这个端口务必对应上
- 0.0.0.0:3005
3.创建认证文件与config.yaml同级目录
shell
htpasswd -c htpasswd admin
4.启动服务
shell
docker-compose -f docker-compose-verdaccio.yml up -d
#需给目录设置权限,否则使用时会报错没有权限存储
chmod 777 -R storage config plugins
5.访问服务
http://IP:3005
6.使用私服
python
#设置私服仓库
npm set registry http://localhost:4873/ #设置默认仓库地址
npm install --registry http://localhost:4873 #设置本次安装的仓库地址