業務中,與合做方共建代碼,有時須要提供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安全性!