某些情況下,我們的一些npm包,需要發佈到npm上,但是,又不太適合設置成公開的。儘管npm提供了私密包的服務,但是要收錢的,因此,Verdaccio就應運而生了
什麼是Verdaccio
簡單來説,Verdaccio 是一個輕量級、開源的私有 npm 倉庫管理器,就是“自己搭建的 npm 私服”。
核心作用如下:
- 替代公共 npm 倉庫:你可以把公司內部的私有包、不想公開的代碼包發佈到這個私服上,只有團隊內部能訪問;
- 可靈活管控權限配置(比如誰能發佈 / 下載包)、離線使用,解決公共 npm 訪問不穩定、私有代碼泄露的問題。
Verdaccio本質是Node.js編寫的輕量服務,部署簡單,不用依賴複雜的數據庫,開箱即用,是中小型團隊搭建私有 npm倉庫的首選。
官網:https://www.verdaccio.org/
搭建記錄
烏班圖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 ...