20张图的保姆级教程,记录使用Verdaccio在Ubuntu服务器上搭建Npm私服

某些情况下,我们的一些npm包,需要发布到npm上,但是,又不太适合设置成公开的。尽管npm提供了私密包的服务,但是要收钱的,因此,Verdaccio就应运而生了

什么是Verdaccio

简单来说,Verdaccio 是一个轻量级、开源的私有 npm 仓库管理器,就是"自己搭建的 npm 私服"。

核心作用如下:

  1. 替代公共 npm 仓库:你可以把公司内部的私有包、不想公开的代码包发布到这个私服上,只有团队内部能访问;
  2. 可灵活管控权限配置(比如谁能发布 / 下载包)、离线使用,解决公共 npm 访问不稳定、私有代码泄露的问题。

Verdaccio本质是Node.js编写的轻量服务,部署简单,不用依赖复杂的数据库,开箱即用,是中小型团队搭建私有 npm仓库的首选。

官网:www.verdaccio.org/

搭建记录

乌班图22和node20版本

首先,笔者的服务器是乌班图22,同时node也有是20版本,如下

笔者查询了一下,node20版本适合6版本的Verdaccio,就直接下载最新版本安装了

全局安装Verdaccio

Ubuntu下加--unsafe-perm避免权限报错

bash 复制代码
npm install -g verdaccio --unsafe-perm

然后,查看版本号

bash 复制代码
verdaccio -v

创建Verdaccio工作目录,并授权

bash 复制代码
# 创建verdaccio工作目录
mkdir -p /opt/verdaccio/{conf,storage,plugins}

# 授权操作权限
chmod -R 775 /opt/verdaccio

创建Verdaccio默认配置文件并且编辑

bash 复制代码
# 进入对应目录
cd /opt/verdaccio/conf/

# 创建配置文件
touch config.yaml

# 查看一下
ls

然后写入配置

bash 复制代码
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

bash 复制代码
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端口

bash 复制代码
ufw allow 4873/tcp

ufw status

先通过ip端口方式访问看看

果然是能访问到了,只不过现在仓库是空的

配置https证书

首先,自然是买了云服务器,就要买对应的https证书,笔者的证书买过了,如下

bash 复制代码
root@iv-ydy912e3nkay8n6x7ufo:/etc/nginx/certs# ls
ashuai.site.key  ashuai.site.pem

然后到对应目录,修改config.yaml文件,主要是如下修改

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/

完整配置

yaml 复制代码
# 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用户,无妨

bash 复制代码
chmod 644 /etc/nginx/certs/ashuai.site.key
chmod 644 /etc/nginx/certs/ashuai.site.pem

用https的方式进行访问

先停掉原先的服务

然后,用pm2进行管理私服npm(强烈推荐)

这里使用pm2启动私服npm(顺手命名为private-npm)

bash 复制代码
pm2 start verdaccio --name "private-npm" -- --config /opt/verdaccio/conf/config.yaml

然后查看一下状态

bash 复制代码
pm2 list

如下图
当然,大家也可以设置为开机自启动,这里不赘述

然后,就可以通过域名+端口的形式进行访问了

至此,私服npm就搭建成功了(当然,目前还没有包)

接下来,我们简单演示一下使用

私服npm创建用户名和密码,可用于公司同事用户登录

我们知道npm都有对应的账号,所以,我们需要在服务器上,创建对应用户名和密码

首先,安装工具apache2-utils

Apache 提供的一个用于管理 .htpasswd 用户认证文件的工具(常被 Verdaccio、Nginx 等借用)

bash 复制代码
sudo apt update
sudo apt install apache2-utils

创建新用户,假设名字叫做admin

bash 复制代码
sudo htpasswd -B -C 10 -c /opt/verdaccio/conf/htpasswd admin

系统会提示我们输入并确认密码,之后就会生成 /opt/verdaccio/conf/htpasswd 文件。

这个时候,用户名和密码都有了,我们后续就可以登录了

bash 复制代码
root@iv-ydy912e3nkay8n6x7ufo:/opt/verdaccio/conf# ls
config.yaml  htpasswd

顺手查看一下htpasswd,输出安装路径

bash 复制代码
root@iv-ydy912e3nkay8n6x7ufo:~# which htpasswd
/usr/bin/htpasswd

使用nrm管理源,并登录

这里笔者建议,使用nrm管理一下源,如下,全局安装一下

添加源自己的私有源,起个名字,叫做self-npm

bash 复制代码
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.

使用自己的源

bash 复制代码
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 ...

相关推荐
Irene199110 小时前
npm 完整生命周期脚本及特点
npm·生命周期
登山者1 天前
npm发布报错急救手册:快速解决2FA与令牌问题
前端·npm
Asurplus1 天前
【VUE】15、安装包管理工具yarn
前端·vue.js·npm·node.js·yarn
fpl11161 天前
npm :无法加载文件 D:\...\nodejs\npm.ps1,因为在此系统上禁止运行脚本
前端·vscode·npm·node.js·命令模式
vipbic2 天前
解决npm publish的404/403和配置警告全记录
前端·npm·node.js
松莫莫2 天前
Windows 下使用 nvm 安装与管理 Node.js(完整指南)
windows·笔记·npm·node.js
LYFlied3 天前
幽灵依赖详解
npm·pnpm·打包工具·yarn·工程化·包管理工具·幽灵依赖
LYFlied3 天前
前端项目包管理器怎么选?
前端·面试·npm·pnpm·yarn·工程化·包管理器
几个高兴3 天前
npm证书过期
前端·npm·node.js