使用verdaccio搭建npm私有源

業務中,與合做方共建代碼,有時須要提供npm私有包。使用代碼copy的方法,影響整個項目的可移植性,也沒法作版本控制和管理。在此背景下,選擇使用verdaccio搭建一個輕型的npm私有源服務,爲合做方提供須要共享的私有包。這裏簡要記錄下搭建過程安全策略使用方法javascript

描述說明 本文代稱
原始源registry registry.x.com
原始源私有scope xscope
須要共享的模塊 xscope|modulea
私有源域名 abc.com
私有源registry abc.com/npm/

搭建過程

先過一遍verdaccio的官方文檔,食用更佳!聽這個名字,濃濃的拉美風情。沒錯,是幾個意大利籍的巴西程序員,基於Sinopia開發的輕量級npm代理源。java

一、安裝verdaccionode

$ npm install -g verdaccio
複製代碼

二、配置verdaccionginx

通常是這個文件:~/.config/verdaccio/config.yaml程序員

2.一、verdaccio內部使用了express,服務啓用在了uri根路徑,這樣比較浪費資源。增長配置:express

url_prefix: /npm/
複製代碼

2.二、指定須要共享的npm包的uplinks,須要一個就加一個,這樣作到共享範圍的控制。(scope的形式沒法作到清晰可控,不安全不要用!)npm

# a list of other known repositories we can talk to
uplinks:
  npmjs:
    url: https://registry.npmjs.org/
  xnpmjs:
    url: http://registry.x.com 
packages:
  '@xscope/modulea':
    access: $all
    publish: $authenticated
    unpublish: $authenticated
    proxy: xnpmjs
複製代碼

三、使用pm2啓動verdaccio服務json

利用pm2啓動守護進程:安全

$ pm2 start verdaccio
複製代碼

經過pm2 show verdaccio能夠查看到out和error的log信息。bash

四、使用nginx作反向代理

不直接向外提供verdaccio服務,經過的nginx轉發訪問,官方文檔有遺漏,我查了錯誤日誌和源碼才定位到!另外後來升級爲https服務,官方配置更不夠用(個人血汗淚,我最後的舞,全拿去吧QAQ),使用下面的配置

location ~ ^/npm/(.*)$ {
    proxy_pass http://127.0.0.1:4873/$1;
    # proxy_set_header Host $host:$server_port;
    proxy_set_header Host            $host;
    proxy_set_header X-Forwarded-For $remote_addr;
    # proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Forwarded-Proto https;
}
location ~ ^/-/(.*)$ {
    proxy_pass http://127.0.0.1:4873/-/$1;
    proxy_set_header Host            $host;
    proxy_set_header X-Forwarded-For $remote_addr;
    proxy_set_header X-Forwarded-Proto https;
}
複製代碼

安全策略

外網能夠訪問到,加好安全策略!

一、強制https 域名備好證書,並將80訪問重定向到443。

二、ip訪問白名單限制 給內網、合做方的ip提供服務,其餘forbidden!雖然也沒法阻止代理中轉和僞造,這應該夠了。 根據開發所處的環境,到達本身這層的請求可能幾經nginx轉發,要找下真實的源ip,確認下是在http頭的哪一個字段裏,合理增長nginx的配置。 我所在的開發網,實際的ip寫在http頭X-Real-IP中,同時還寫入了X-Forwarded-For。 因此nginx配置須要增長:

set_real_ip_from  x.y.z;
real_ip_header    X-Real-IP;
allow xxx; # 合做方ip
allow yyy; # 合做方ip
deny all;
複製代碼

三、只對須要共享的包設置uplink 參見2.2

使用方法

確保使用方在IP白名單內

一、單個私有包的安裝

npm install @xscope/modulea  --registry=https://abc.com/npm/
複製代碼

二、項目裏增長preinstall腳本,合做方無感知的使用

利用npm preinstall的鉤子,項目的package.json裏增長preinstall要執行的腳本,這樣合做方能夠無感知的安裝。

bash版

#!/bin/bash
registry=$(npm config get registry);
if ! [[ $registry =~ "http://registry.x.com" ]]; then
    npm config set @xscope:registry https://abc.com/npm/
fi
複製代碼

node版

#!/usr/bin/env node
const { exec } = require('child_process');

exec('npm config get registry', function(error, stdout, stderr) {
    if (!stdout.toString().match(/registry\.x\.com/)) {
        exec(' npm config set @xscope:registry https://abc.com/npm/');
    }
});
複製代碼

補充個小小:出於安全考慮,npm install在root用戶下運行不能直接執行腳本,須要在install的時候,追加參數--unsafe-perm

本季完結撒花!新番但願能夠討論下verdaccio的存儲管理和詬病多時的npm安全性!

相關文章
相關標籤/搜索