私有化輕量級持續集成部署方案–07-私有NPM倉庫-Verdaccio


提示:本系列筆記全部存在於
Github
可以直接在
Github 查看全部筆記

對於個人來說,私有NPM倉庫 作用性基本很小,但是對於企業,私有NPM倉庫 可以保護程式碼暴露,具有很大的意義。

也是為了學習搭建 私有NPM倉庫,就在持續部署中集成了私有倉庫。

開源社區,有兩個廣泛使用的 私有NPM倉庫 項目:

  1. Sinopia
  2. Verdaccio

Sinopia 項目官方於2019年已經不再維護,也就是現在已經不在推薦使用此項目。

Verdaccio 項目是從 Sinopia項目 fork 出來的,官方聲稱 100% 向後兼容 Sinopia

Verdaccio 目前也就成了最普遍的 私有NPM倉庫 的解決方案。

Verdaccio

Verdaccio 概述

Verdaccio 是一個 Node 創建的輕量的私有 npm proxy registry

Verdaccio 中最強大的兩個功能是 上行鏈路包身份許可權

Verdaccio 部署

Docker Compose 文件

VerdaccioDocker 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: //registry.npmjs.org/        # 上行地址
   timeout: 30s                            # 超時時間

                         
 taobao:                                   # 上行名稱
   url: //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倉庫 項目:

  1. Sinopia
  2. Verdaccio

Sinopia 項目官方於2019年已經不再維護,也就是最好不要再使用此項目進行搭建。

Verdaccio 項目是從 Sinopia項目 fork 出來的,官方聲稱 100% 向後兼容 Sinopia

Verdaccio 目前就成了普遍的 私有NPM倉庫 的解決方案。

Verdaccio

Verdaccio 概述

Verdaccio 是一個 Node 創建的輕量的私有 npm proxy registry

Verdaccio 提供了上行鏈路功能, 安裝 Verdaccio 倉庫中不存在的包時,可以配置向上游倉庫下載。

Verdaccio 還提供了強大的身份認證系統。

Verdaccio 部署

Docker Compose 文件

VerdaccioDocker 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: //registry.npmjs.org/        # 上行地址
   timeout: 30s                            # 超時時間

                         
 taobao:                                   # 上行名稱
   url: //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 //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 //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: //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 //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 # 鏡像名稱

可以將Dronenode_modules 快取清除,然後提交測試

Tags: