對於個人來說,私有NPM倉庫 作用性基本很小,但是對於企業,私有NPM倉庫 可以保護程式碼暴露,具有很大的意義。
也是為了學習搭建 私有NPM倉庫,就在持續部署中整合了私有倉庫。
開源社群,有兩個廣泛使用的 私有NPM倉庫 專案:
Sinopia
專案官方於2019年已經不再維護,也就是現在已經不在推薦使用此專案。
Verdaccio
專案是從 Sinopia
專案 fork 出來的,官方聲稱 100% 向後相容 Sinopia
。
Verdaccio
目前也就成了最普遍的 私有NPM倉庫 的解決方案。
Verdaccio
Verdaccio 概述
Verdaccio
是一個 Node
建立的輕量的私有 npm proxy registry
Verdaccio
中最強大的兩個功能是 上行鏈路 和 包身份許可權
Verdaccio 部署
Docker Compose 檔案
Verdaccio
的 Docker Compose
檔案比較簡單,主要是配置資料掛載
version: '3.9'
services:
verdaccio:
image: verdaccio/verdaccio:5.5
container_name: verdaccio
restart: always
ports:
- '4873:4873'
volumes:
- /volumes/verdaccio/conf:/verdaccio/conf
- /volumes/verdaccio/storage:/verdaccio/storage
- /volumes/verdaccio/plugins:/verdaccio/plugins
config.yaml
Verdaccio
專案提供了一個配置檔案: config.yaml。
預設情況下 Verdaccio
會在首次執行時建立此檔案。
但因為使用了 宿主目錄 掛載資料,所以需要預先建立此檔案。
# 包儲存地址
storage: /verdaccio/storage
# 外掛儲存地址
plugins: /verdaccio/plugins
# UI相關資訊
web:
enable: true # 開啟 Web 頁面
title: Verdaccio # Web 頁面標題
# 身份認證
auth:
htpasswd: # 預設情況下使用的 htpasswd 外掛作為身份認證
file: /verdaccio/conf/htpasswd # htpasswd 檔案為加密認證資訊檔案
max_users: -1 # 最大使用者數量, -1 表示禁用新使用者註冊
# 上行鏈路
uplinks:
npmjs: # 上行名稱,隨便定義
url: https://registry.npmjs.org/ # 上行地址
timeout: 30s # 超時時間
taobao: # 上行名稱
url: https://registry.npm.taobao.org/ # 上行地址
timeout: 30s
# 包訪問設定, 可以根據名稱對包做不同許可權設定
packages:
'@*/*':
access: $authenticated # 登入使用者才允許訪問
publish: $authenticated # 登入使用者才允許釋出
proxy: taobao # 代理上行鏈路地址
'**':
access: $authenticated # 登入使用者才允許訪問
publish: $authenticated # 登入使用者才允許釋出
proxy: taobao # 代理上行鏈路地址
server:
keepAliveTimeout: 30 # 伺服器保持活動連結的時間,較大的包可能會消耗一定時間,此屬性就是設定活動連結時間
middlewares:
audit:
enabled: true
# 日誌
logs: { type: stdout, format: pretty, level: http }
config.yaml 檔案設定了一些關鍵屬性, 至於其它屬性,請參考: verdaccio--配置檔案
auth(身份認證)
auth 是設定 使用者身份憑證的屬性
Verdaccio
專案預設使用了 htpasswd
外掛作為 使用者認證 服務。
htpasswd
外掛需要提供一個儲存使用者憑證的檔案:/verdaccio/conf/htpasswd。
max_users 屬性表示最大註冊使用者, 當值為 -1 時,表示禁止使用者註冊;當值不為 -1時,可以使用 npm adduser 命令新增使用者。
禁用使用者註冊時,可以使用 htpasswd-generator工具 生成身份憑證,然後儲存在 /verdaccio/conf/htpasswd。
PS:使用者認證 可以自定義為其它外掛
unlinks(上行鏈路)
unlinks(上行鏈路) 是設定上游代理倉庫的屬性。
unlinks(上行鏈路) 可以配置多個地址,針對每一個 unlinks(上行鏈路) 都可以做不同設定。
詳細請參考 verdaccio--上行鏈路
預設的 unlinks(上行鏈路) 為 npmjs。
packages(訪問許可權)
packages(訪問許可權) 是設定包訪問許可權的屬性。
可以根據名稱對一個 或 一組 包分別對 訪問、釋出、代理等操作做不同的設定。
上述配置 簡單的對所有包統一處理。
配置中訪問、釋出 許可權設定為了 $authenticated, 這個值是 Verdaccio
預設的變數值,表示登入使用者。
還可以將許可權設定為 其它變數值 或 指定使用者,詳細請參考 verdaccio--包的訪問
執行部署
配置檔案準備就緒,就可以執行部署,部署成功後就可以訪問頁面
PS: 注意開啟雲伺服器 4873 埠號防火牆
掛載目錄許可權
預設情況下 Verdaccio
容器不具有宿主機目錄的操作許可權。
將容器目錄掛載到宿主機後,Verdaccio
執行寫入操作時,會返回許可權錯誤。
解決這個問題,需要賦予 Verdaccio
容器 寫入宿主機目錄的許可權。
sudo chown -R 10001:65533 /volumes/verdaccio
測試Verdaccio倉庫
部署成功後,可以在本地建立一個測試專案,釋出到 Verdaccio
倉庫中。
對於個人來說,私有NPM倉庫 作用性基本很小,但是對於企業,私有NPM倉庫 可以保護程式碼暴露,具有很大的意義。
也是為了學習搭建 私有NPM倉庫,就在持續部署中整合了私有倉庫。
開源社群,有兩個廣泛使用的 私有NPM倉庫 專案:
Sinopia
專案官方於2019年已經不再維護,也就是最好不要再使用此專案進行搭建。
Verdaccio
專案是從 Sinopia
專案 fork 出來的,官方聲稱 100% 向後相容 Sinopia
。
Verdaccio
目前就成了普遍的 私有NPM倉庫 的解決方案。
Verdaccio
Verdaccio 概述
Verdaccio
是一個 Node
建立的輕量的私有 npm proxy registry
Verdaccio
提供了上行鏈路功能, 安裝 Verdaccio
倉庫中不存在的包時,可以配置向上遊倉庫下載。
Verdaccio
還提供了強大的身份認證系統。
Verdaccio 部署
Docker Compose 檔案
Verdaccio
的 Docker Compose
檔案比較簡單,主要配置資料掛載
version: '3.9'
services:
verdaccio:
image: verdaccio/verdaccio:5.5
container_name: verdaccio
restart: always
ports:
- '4873:4873'
volumes:
- /volumes/verdaccio/conf:/verdaccio/conf
- /volumes/verdaccio/storage:/verdaccio/storage
- /volumes/verdaccio/plugins:/verdaccio/plugins
config.yaml
Verdaccio
專案提供了一個配置檔案: config.yaml。
預設情況下 Verdaccio
會在首次執行時建立此檔案。
但因為使用了 宿主目錄 掛載資料,所以需要預先建立此檔案。
# 包儲存地址
storage: /verdaccio/storage
# 外掛儲存地址
plugins: /verdaccio/plugins
# UI相關資訊
web:
enable: true # 開啟 Web 頁面
title: Verdaccio # Web 頁面標題
# 身份認證
auth:
htpasswd: # 預設情況下使用的 htpasswd 外掛作為身份認證
file: /verdaccio/conf/htpasswd # htpasswd 檔案為加密認證資訊檔案
max_users: -1 # 最大使用者數量, -1 表示禁用新使用者註冊
# 上行鏈路
uplinks:
npmjs: # 上行名稱,隨便定義
url: https://registry.npmjs.org/ # 上行地址
timeout: 30s # 超時時間
taobao: # 上行名稱
url: https://registry.npm.taobao.org/ # 上行地址
timeout: 30s
# 包訪問設定, 可以根據名稱對包做不同許可權設定
packages:
'@*/*':
access: $authenticated # 登入使用者才允許訪問
publish: $authenticated # 登入使用者才允許釋出
proxy: taobao # 代理上行鏈路地址
'**':
access: $authenticated # 登入使用者才允許訪問
publish: $authenticated # 登入使用者才允許釋出
proxy: taobao # 代理上行鏈路地址
server:
keepAliveTimeout: 30 # 伺服器保持活動連結的時間,較大的包可能會消耗一定時間,此屬性就是設定活動連結時間
middlewares:
audit:
enabled: true
# 日誌
logs: { type: stdout, format: pretty, level: http }
config.yaml 檔案設定了一些關鍵屬性, 至於其它屬性,請參考: verdaccio--配置檔案
auth(身份認證)
auth 屬性是 Verdaccio
使用者身份憑證的屬性
Verdaccio
專案預設使用了 htpasswd
外掛作為 使用者認證 服務。
htpasswd
外掛需要提供一個儲存使用者憑證的檔案:/verdaccio/conf/htpasswd。
max_users 屬性表示最大註冊使用者, 當值為 -1 時,表示禁止使用者註冊;當值不為 -1時,可以使用 npm adduser 命令新增使用者。
禁用使用者註冊時,可以使用 htpasswd-generator工具 生成身份憑證,然後儲存在 /verdaccio/conf/htpasswd。
PS:使用者認證 可以自定義為其它外掛
unlinks(上行鏈路)
unlinks(上行鏈路) 屬性是 Verdaccio
配置上游代理倉庫的屬性。
unlinks(上行鏈路) 可以配置多個地址,針對每一個 unlinks(上行鏈路) 都可以做不同設定。
詳細請參考 verdaccio--上行鏈路
預設的 unlinks(上行鏈路) 為 npmjs。
packages(訪問許可權)
packages(訪問許可權) 屬性是 Verdaccio
配置包訪問許可權的屬性。
可以根據名稱對一個 或 一組 包對 訪問、釋出、代理等不同操作做不同設定。
上述配置 只簡單的 對所有進行了統一處理 中。
配置中訪問、釋出 許可權設定為了 $authenticated, 這個值是 Verdaccio
預設的變數值,表示登入使用者。
還可以將許可權設定為 其它變數值 或 指定使用者,詳細請參考 verdaccio--包的訪問
執行部署
配置檔案準備就緒,就可以執行部署,隨後訪問頁面
PS: 注意開啟雲伺服器 4873 埠號防火牆
掛載目錄許可權
預設情況下 Verdaccio
容器不具有宿主機目錄的操作許可權。
將容器容器目錄掛載到宿主機後,Verdaccio
執行寫入操作時,會返回許可權錯誤。
解決這個問題,需要賦予 Verdaccio
容器 寫入宿主機目錄的許可權。
sudo chown -R 10001:65533 /volumes/verdaccio
測試Verdaccio倉庫
部署成功後,可以在本地建立一個測試專案,釋出到 Verdaccio
倉庫中。
在沒有任何問題的情況下,可以成功的將專案釋出到 倉庫 中,在頁面登入時可以看到這個專案
閘道器配置
Verdaccio
官方文件--Reverse Proxy Setup 中給出了使用反向代理的配置。
主要是對代理頭的設定。其中至關重要的一個屬性是:proxy_set_header X-Forwarded-Proto $scheme
server {
#SSL 訪問埠號為 443
listen 443 ssl http2;
#填寫繫結證書的域名
server_name npm.mwjz.live;
#上傳大小限制
client_max_body_size 10M;
#日誌
error_log /var/log/nginx/npm/error.log;
access_log /var/log/nginx/npm/access.log;
#證書檔案
ssl_certificate /etc/nginx/conf.d/ssl/npm/npm.mwjz.live_bundle.crt;
#證書金鑰檔案
ssl_certificate_key /etc/nginx/conf.d/ssl/npm/npm.mwjz.live.key;
ssl_ciphers SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!3DES:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
location / {
# 代理設定
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_read_timeout 600;
proxy_redirect off;
proxy_pass http://10.0.24.12:4873;
}
location ~ ^/verdaccio/(.*)$ {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_set_header X-NginX-Proxy true;
proxy_redirect off;
proxy_pass http://10.0.24.12:4873/$1;
}
}
重啟 閘道器服務 和 Verdaccio
容器
docker exec -it gateway nginx -s reload
Drone 配置私有 NPM 倉庫
Drone
持續部署中整合 Verdaccio
倉庫,需要在執行時登入 倉庫。
NPM 會將登入憑證儲存在 .npmrc 檔案中。
也就是需要一個外掛執行登入操作,並將登入憑證寫入 .npmrc 檔案
Drone
社群中提供了一個這樣的映象外掛:robertstettner/drone-npm-auth
kind: pipeline # 定義一個管道
type: docker # 定義管道型別
name: build # 定義管道名稱
volumes: # 宣告資料卷
- name: node_modules # 資料卷名稱
host: # Host Volume
path: /volumes/drone/volumes/web/node_modules # 宿主機目錄
clone:
disable: false # 啟用程式碼拉取
steps:
# 生成版本號標籤
- name: build-tags
image: yxs970707/drone-web-tags # 使用映象
depends_on: [clone] # 依賴的步驟,
settings:
tags:
- latest
# 私有 NPM 倉庫登入
- name: npm-login
image: robertstettner/drone-npm-auth
settings:
registry: https://npm.mwjz.live/
username:
from_secret: npm_username
password:
from_secret: npm_password
email:
from_secret: npm_email
# 編譯專案
- name: build-project # 步驟名稱
image: node:16.13.2 # 使用映象
depends_on: [npm-login] # 依賴的步驟,
volumes: # 掛載資料卷
- name: node_modules # 資料卷名稱
path: /drone/src/node_modules # 容器內目錄
commands: # 執行命令
- npm config set registry https://npm.mwjz.live/
- npm config get
- npm install # 安裝node_modules包
- npm run build # 執行編譯
# 打包Docker映象
- name: build-image # 步驟名稱
image: plugins/docker # 使用映象
depends_on: [build-tags, build-project] # 依賴步驟
settings: # 當前設定
username: # 賬號名稱
from_secret: docker_username
password: # 賬號密碼
from_secret: docker_password
dockerfile: deploy/Dockerfile # Dockerfile地址, 注意是相對地址
registry: docker.mwjz.live # 私有映象倉庫地址
repo: docker.mwjz.live/mwjz/deploy-web-demo # 映象名稱
可以將Drone
中 node_modules
快取清除,然後提交測試