前言
市面上目前有很多种 NPM 私有服务方案,这里列举一些方案以及他们的优缺点
npm Enterprise
:这是npm
官方提供的企业级服务,它支持私有包和公共包,并提供了一些高级功能,如集成身份验证和内置审计功能。然而,这是一项付费服务,而且价格相对较高。- 优点:来自
npm
官方,高级功能,集成身份验证和审计。 - 缺点:价格高,可能超出一些小型团队或个人开发者的预算。
- 优点:来自
Artifactory
:JFrog
的Artifactory
是一款强大的仓库管理器,支持多种包管理系统,包括npm
。它提供了一些高级功能,如安全扫描和元数据跟踪。- 优点:支持多种包管理系统,高级功能如安全扫描和元数据跟踪。
- 缺点:与
Verdaccio
相比,设置和管理可能更复杂。
- Sonatype Nexus Repository:
Nexus
是另一款支持多种包管理系统的仓库管理器,它也支持npm
。它的界面直观易用,且支持LDAP
和Active Directory
这类目录服务。- 优点:支持多种包管理系统,直观的界面,支持目录服务。
- 缺点:可能不如 Verdaccio 那么简洁和轻量级。
- GitHub Packages:这是 GitHub 提供的包管理服务,支持 npm 和其他一些包管理系统。它可以与你的 GitHub 项目紧密集成,并支持在同一个组织中共享包。
- 优点:与 GitHub 项目紧密集成,支持在组织中共享包。
- 缺点:如果你的项目或团队并不使用 GitHub,那么这项服务可能就不那么有用了。
- GitLab
- 团队没有使用它作为代码仓库,相对于 Verdaccio 来说比较重
为什么使用 verdaccio
:
- 自主管理:Verdaccio 允许团队拥有自己的私有 npm 存储库,对包的发布和版本控制有更大的自主权。这样可以减少对公共 npm 存储库的依赖,并提高安全性。
- 加速开发:由于 Verdaccio 将下载过的包缓存在本地,这将极大地提高了安装包的速度,特别是在网络不佳的情况下。
- 易于设置和使用:Verdaccio 的安装和配置过程相对简单,基本不需要过多的系统知识。一旦设置完成,开发者们可以直接使用 npm 命令来发布和安装包,无需学习新的工具。
- 节省成本:与一些商业的 npm 存储库管理服务相比,Verdaccio 是开源的,免费的。它可以帮助团队节省预算。
- 控制访问:通过 Verdaccio,你可以配置包的访问权限,比如你可以只允许特定用户或团队访问某个包,或者限制哪些用户可以发布包,这可以提高安全性并减少错误的可能。
- 持续集成友好:由于 Verdaccio 提供了本地的 npm 服务,这意味着你可以在没有互联网连接的情况下进行开发和测试。这对于持续集成/持续部署 (CI/CD) 环境特别有用。
- 生态系统兼容性:Verdaccio 与 npm 和 yarn 完全兼容,这意味着开发者们不需要改变他们现有的工作流程。
- 社区支持:Verdaccio 有一个活跃的开源社区,你可以从中获得帮助和支持。同时,由于其开源的特性,如果你遇到问题,你甚至可以参与到其开发和改进中去。
安装
首先在服务器上确保安装最新版本的 pnpm,全局安装verdaccio
如果是第一次通过pnpm
全局安装依赖,可能会提示
Run pnpm setup to create it automatically, or set the global-bin-dir setting, or the PNPM_HOME env variable. The global bin directory should be in the PATH.
这条信息建议运行”pnpm setup”命令来自动创建设置,或者设置”global-bin-dir”配置项,或者设置”PNPM_HOME”环境变量。全局bin目录应该在PATH环境变量中。
执行 pnpm setup
输出
启动
执行source /root/.bashrc
后继续执行 pnpm add -g verdaccio
,安装完成后执行 verdaccio
命令,输入
执行 verdaccio
之后就可以在localhost:4873
中访问到了,localhost:4873
是默认配置的地址,可以通过CLI 或者config.yaml
文件来修改
CLI 启动参数
如果想要修改默认的启动主机地址和端口,可以通过以下命令启动,监听所有可用的网络接口,并使用端口 4873
这种启动方式是临时的,如果想要永久修改,则需要修改config.yaml
配置文件,路径为 /root/.config/verdaccio
,找到其中的 listen
配置项
修改后再使用verdaccio
命令启动后就是0.0.0.0:4873
主机和端口
PM2启动
使用 PM2 来启动服务,方便进程管理、监控守护和自动重启等,首先确保已安装 PM2 - Home
执行 pm2 start verdaccio
或者 pm2 start which verdaccio
来启动
使用verdaccio搭建npm私有库 pm2守护进程_npm守护进程_青鱼梦镜白的博客-CSDN博客
pm2 启动有点问题,一直报错,怀疑是跟 Node 版本有关系,当期 Node 版本是 16.4,想要升级最新版,但是服务器是
Centos7
,缺少 Node 18 所必须的依赖,想升级 18 还需要升级 Ctntos 为 18,所以使用 Docker 把
使用 Docker
确保已安装 Docker,拉取 docker 镜像
创建 docker/verdaccio
目录并新建 config.yaml
文件,文件内容可以从这里复制verdaccio/docker.yaml at master · verdaccio/verdaccio · GitHub
创建
conf/config.yaml
文件夹及文件htpasswd
文件storage
文件夹plugins
文件夹
注意,
htpasswd
是文件,不是文件夹,不要新建错了
/root/docker/verdaccio/config.yaml
/root/docker/verdaccio/storage
/root/docker/verdaccio/plugins
/root/docker/verdaccio/htpasswd
注意,如果没有目录权限的话需要先获取权限
chown -R 10001:65533 /home/verdaccio/storage
修改config.yaml
文件:
命令启动
修改保存后执行以下命令
V_PATH=/home/verdaccio
: 这个就是给后面 $V_PATH 使用的docker run -d -it --name verdaccio
-d
守护进程 之前可能是使用PM2来管理;-it
是 -i 与 -t 的缩写;-i
: 以交互模式运行容器,通常与 -t 同时使用;-t
: 为容器重新分配一个伪输入终端,通常与 -i 同时使用--name verdaccio
: 为容器指定一个名称;\
换行-p
: 指定端口映射,格式为:主机(宿主)端口:容器端口。当然还有-P 随机端口映射,容器内部端口随机映射到主机的端口--volume , -v
: 绑定一个卷 :/verdaccio/conf —> /home/verdaccio/conf
等等
启动成功后访问 ip:4873
就可以看到服务启动成功了
docker-compose 启动
如果不想用命令行的方式启动,可以通过 docker-compose
来启动,首先在verdaccio
目录下创建docker-compose.yaml
文件,内容如下
然后在当前目录下执行
这里我执行完成之后显示正在启动,然后 done 掉了,容器没有启动成功,通过
docker ps -a
查看所有的容器发现verdaccio
容器状态为失败
查看日志docker logs verdaccio
:
显式因为权限问题报错了,搞了好久没搞好,本身我的 docker 也不会多少,找朋友问了下,朋友一眼就看出问题了,是因为我的 config.yaml 文件中的配置路径写错了,在 config.yaml
文件中,storage
路径应该是相对于容器内的路径,而不是宿主机的绝对路径。
# 错误路径
storage: /root/docker/verdaccio/storage
plugins: /root/docker/verdaccio/plugins
auth:
htpasswd:
file: /root/docker/verdaccio/htpasswd
# 正确路径
storage: /verdaccio/storage
plugins: /verdaccio/plugins
auth:
htpasswd:
file: /verdaccio/htpasswd
修改完路径后再次执行 docker-compose up -d
就能正确启动服务了。
另外注意一点,我这里所有的东西都是在 root 目录下操作的,因为是自己的服务器随表搞的,稳妥的做法是将应用程序放在
/opt
目录下,数据放在/var
目录下。例如可以将 Verdaccio 相关的文件放在/opt/verdaccio
目录下,配置文件、存储数据等放在/var/verdaccio
目录下。这样能够保证安全性
配置文件一览
NPM配置
初始化
初始化 verdaccio
时需要设置用户名密码等,然后就可以直接发包了
依次输入username
、password
、email
就创建成功了,创建成功之后可以在 verdaccio/htpasswd
文件中查看到相关的用户信息。
注意,如果本地
npm
版本为npm9
可能会遇到错误Web login not supported
这时候需要在命令后面加上--auth-type=legacy
参考:
文件错误问题
一开始执行 npm adduser
之后就挂起了,然后去看了下 docker
日志发现上面的错误,一开始以为是权限问题,各种修改权限,查资料都没解决,最后发现是因为 htpasswd
文件被我创建成了文件夹。
权限问题
-
用户在新增 npm 用户的时候会写入
htpasswd
文件,由于该文件是在宿主机中,默认是 root 用户建立的,而 verdaccio 容器中拥有自己的用户名,名字就叫 verdaccio,所以无法写入 root 用户拥有的文件。
那么是不是还要在宿主机上新建 verdaccio 用户呢?不用这么麻烦。根据官方文档和文末的最后一篇文章得知,docker 容器中的 uid 和 gid 和宿主机是共享的,只不过没有具体的名称,而容器内 verdaccio 使用的 uid 为10001
,gid 为65533
,所以我们在宿主机改一下htpasswd
文件的权限 -
docker环境下verdaccio容器中用户不是当前系统用户
-
默认情况下
Verdaccio
容器不具有宿主机目录的操作权限。将容器目录挂载到宿主机后,Verdaccio
执行写入操作时,会返回权限错误。解决这个问题,需要赋予Verdaccio
容器 写入宿主机目录的权限。sudo chown -R 10001:65533 /volumes/verdaccio
-
参考链接
- 搭建私有 npm 仓库(Verdaccio + docker) - 掘金
- install verdaccio with docker and npm adduser hangs after email · Issue #2268 · verdaccio/verdaccio · GitHub
- npm adduser 500 Internal Server Error · verdaccio/verdaccio · Discussion #3498 · GitHub
- npm adduser hangs after email · Issue #1136 · verdaccio/verdaccio · GitHub
- Verdaccio 使用 Docker 安装及迁移教程 - 守望之吻
- 在docker中通过Verdaccio搭建一个私有npm库 | Jiuto’s blog
- 07-私有NPM仓库-Verdaccio - 知乎
- verdaccio 文件权限问题 容器权限用户组跟linux上的文件对应不上了_verdaccio config: storage default path not defined_qq_21138747的博客-CSDN博客
- 使用Verdaccio(docker)搭建私有npm仓库_2Ker的博客-CSDN博客
npm 版本问题
npm 9 版本会在登录的时候报错 Web login not supported
。可通过上面的方案解决,
发布包
- 首先需要登录
- 进入项目中发布
刷新网站查看 没问题的话就可以看到刚刚上传的包了。