20张图的保姆级教程,记录使用Verdaccio在Ubuntu服务器上搭建Npm私服
某些情况下,我们的一些npm包,需要发布到npm上,但是,又不太适合设置成公开的。尽管npm提供了私密包的服务,但是要收钱的,因此,Verdaccio就应运而生了
什么是Verdaccio
简单来说,Verdaccio 是一个轻量级、开源的私有 npm 仓库管理器,就是“自己搭建的 npm 私服”。
核心作用如下:
- 替代公共 npm 仓库:你可以把公司内部的私有包、不想公开的代码包发布到这个私服上,只有团队内部能访问;
- 可灵活管控权限配置(比如谁能发布 / 下载包)、离线使用,解决公共 npm 访问不稳定、私有代码泄露的问题。
Verdaccio本质是Node.js编写的轻量服务,部署简单,不用依赖复杂的数据库,开箱即用,是中小型团队搭建私有 npm仓库的首选。
搭建记录
乌班图22和node20版本
首先,笔者的服务器是乌班图22,同时node也有是20版本,如下
笔者查询了一下,node20版本适合6版本的Verdaccio,就直接下载最新版本安装了
全局安装Verdaccio
Ubuntu下加--unsafe-perm避免权限报错
npm install -g verdaccio --unsafe-perm
然后,查看版本号
verdaccio -v
创建Verdaccio工作目录,并授权
# 创建verdaccio工作目录
mkdir -p /opt/verdaccio/{conf,storage,plugins}
# 授权操作权限
chmod -R 775 /opt/verdaccio
创建Verdaccio默认配置文件并且编辑
# 进入对应目录
cd /opt/verdaccio/conf/
# 创建配置文件
touch config.yaml
# 查看一下
ls
然后写入配置
cat > /opt/verdaccio/conf/config.yaml << 'EOF'
# Verdaccio核心配置
storage: /opt/verdaccio/storage
plugins: /opt/verdaccio/plugins
# 日志配置
logs:
- { type: stdout, format: pretty, level: http }
# 安全配置
security:
api:
legacy: false
jwt:
sign:
expiresIn: 29d
web:
sign:
expiresIn: 7d
# 认证配置(密码文件自动生成)
auth:
htpasswd:
file: /opt/verdaccio/conf/htpasswd
max_users: 100
# 上游源,当自己的npm没这个包的时候,往上游找
uplinks:
npmjs:
url: https://registry.npmmirror.com/ # 淘宝源
# url: https://registry.npmjs.org/ # 官方源
cache: true
# 包权限规则
packages:
'@*/*':
access: $all
publish: $authenticated
proxy: npmjs
'**':
access: $all
publish: $authenticated
proxy: npmjs
# 监听所有IP,允许外网访问
listen: 0.0.0.0:4873
# WebUI 配置
web:
title: 私有NPM仓库
EOF
顺手给点权限
启动Verdaccio
verdaccio --config /opt/verdaccio/conf/config.yaml
输出日志解读如下
| 日志内容 | 含义 | 是否需要处理 |
|---|---|---|
root 权限警告 |
提示不要用 root 运行(安全建议) | 可选处理(不影响功能) |
logs 配置已废弃 |
6.x 版本把 logs 字段改名为 log
|
可选修改(不影响启动) |
config file 加载成功 |
配置文件识别正常 | ✅ 无需处理 |
http address - http://0.0.0.0:4873/ |
服务监听在 4873 端口 | ✅ 启动成功 |
防火墙放开4873端口
注意,如果是云服务器,也要在安全组里面放开4873端口
ufw allow 4873/tcp
ufw status
![]()
先通过ip端口方式访问看看
果然是能访问到了,只不过现在仓库是空的
配置https证书
首先,自然是买了云服务器,就要买对应的https证书,笔者的证书买过了,如下
root@iv-ydy912e3nkay8n6x7ufo:/etc/nginx/certs# ls
ashuai.site.key ashuai.site.pem
然后到对应目录,修改config.yaml文件,主要是如下修改
# 配置 HTTPS 监听 4873 端口
listen:
- https://0.0.0.0:4873
# HTTPS 证书配置(用自已有的证书路径)
https:
key: /etc/nginx/certs/ashuai.site.key # 私钥
cert: /etc/nginx/certs/ashuai.site.pem # 公钥
# 公共 URL(必填,末尾带端口和斜杠)
public_url: https://ashuai.site:4873/
完整配置
# Verdaccio核心配置
storage: /opt/verdaccio/storage
plugins: /opt/verdaccio/plugins
# 日志配置
log:
- { type: stdout, format: pretty, level: http }
# 安全配置
security:
api:
legacy: false
jwt:
sign:
expiresIn: 29d
web:
sign:
expiresIn: 7d
# 认证配置(密码文件自动生成)
auth:
htpasswd:
file: /opt/verdaccio/conf/htpasswd
max_users: 100
# 上游源,当自己的npm没这个包的时候,往上游找
uplinks:
npmjs:
url: https://registry.npmmirror.com/ # 淘宝源
# url: https://registry.npmjs.org/ # 官方源
cache: true
# 包权限规则
packages:
'@*/*':
access: $all
publish: $authenticated
proxy: npmjs
'**':
access: $all
publish: $authenticated
proxy: npmjs
# 配置 HTTPS 监听 4873 端口
listen:
- https://0.0.0.0:4873
# HTTPS 证书配置(用自已有的证书路径)
https:
key: /etc/nginx/certs/ashuai.site.key # 私钥
cert: /etc/nginx/certs/ashuai.site.pem # 公钥
# 公共 URL(必填,末尾带端口和斜杠)
public_url: https://ashuai.site:4873/
# WebUI 配置
web:
title: 私有NPM仓库
注意,如果是普通用户,也要授权一下,笔者是root用户,无妨
chmod 644 /etc/nginx/certs/ashuai.site.key
chmod 644 /etc/nginx/certs/ashuai.site.pem
用https的方式进行访问
先停掉原先的服务
然后,用pm2进行管理私服npm(强烈推荐)
这里使用pm2启动私服npm(顺手命名为private-npm)
pm2 start verdaccio --name "private-npm" -- --config /opt/verdaccio/conf/config.yaml
然后查看一下状态
pm2 list
如下图
当然,大家也可以设置为开机自启动,这里不赘述
然后,就可以通过域名+端口的形式进行访问了
至此,私服npm就搭建成功了(当然,目前还没有包)
接下来,我们简单演示一下使用
私服npm创建用户名和密码,可用于公司同事用户登录
我们知道npm都有对应的账号,所以,我们需要在服务器上,创建对应用户名和密码
首先,安装工具apache2-utils
Apache 提供的一个用于管理
.htpasswd用户认证文件的工具(常被 Verdaccio、Nginx 等借用)
sudo apt update
sudo apt install apache2-utils
创建新用户,假设名字叫做admin
sudo htpasswd -B -C 10 -c /opt/verdaccio/conf/htpasswd admin
系统会提示我们输入并确认密码,之后就会生成 /opt/verdaccio/conf/htpasswd 文件。
这个时候,用户名和密码都有了,我们后续就可以登录了
root@iv-ydy912e3nkay8n6x7ufo:/opt/verdaccio/conf# ls
config.yaml htpasswd
顺手查看一下htpasswd,输出安装路径
root@iv-ydy912e3nkay8n6x7ufo:~# which htpasswd
/usr/bin/htpasswd
使用nrm管理源,并登录
这里笔者建议,使用nrm管理一下源,如下,全局安装一下
添加源自己的私有源,起个名字,叫做self-npm
C:\Users\lss13>nrm add self-npm https://ashuai.site:4873/
SUCCESS Add registry self-npm success, run nrm use self-npm command to use self-npm registry.
使用自己的源
C:\Users\lss13>nrm use self-npm
SUCCESS The registry has been changed to 'self-npm'.
使用服务器上,创建的用户名和密码,登录自己的源,再查看当前登录的是谁
在自己的源里面发布一个测试包
因为,我们先前已经登录过了,现在只需要创建一个包,并直接发布到私服npm上即可
创建如下
然后,发包
当然,我们可以在package.json里面写一些我们的信息啥的,不赘述
由上图可以看到发布成功了,接下来,我们到服务器上看看
到目前为止,我们发布成功了
再创建一个项目,下载使用我们刚刚发布的包
下载
打开node_modules文件夹看看,有的
至此,基本搭建完成、可正常发布公司私有包,下载公司私有包.
剩下的,就是一些自由的设置操作了,当然,私服都是在内网,笔者为了给大家呈现效果,特地部署在公网上了,后续会关掉
收益......
A good memory is better than a bad pen. Record it ...