博客 / 詳情

返回

20張圖的保姆級教程,記錄使用Verdaccio在Ubuntu服務器上搭建Npm私服

某些情況下,我們的一些npm包,需要發佈到npm上,但是,又不太適合設置成公開的。儘管npm提供了私密包的服務,但是要收錢的,因此,Verdaccio就應運而生了

什麼是Verdaccio

簡單來説,Verdaccio 是一個輕量級、開源的私有 npm 倉庫管理器,就是“自己搭建的 npm 私服”。

核心作用如下:

  1. 替代公共 npm 倉庫:你可以把公司內部的私有包、不想公開的代碼包發佈到這個私服上,只有團隊內部能訪問;
  2. 可靈活管控權限配置(比如誰能發佈 / 下載包)、離線使用,解決公共 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 ...
user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.