使用Sinopia搭建私有的npm倉庫

文章同步於 Github blog前端

需求

公司出於自身隱私保護須要,不想把本身的代碼開源到包管理區,可是又急需一套完整包管工具,來管理愈來愈多的組件、模塊和項目。對於前端,最熟悉的莫過於npm,bower等;可是bower的市場兼容性明顯沒有npm強壯,加之commonjs規範的日益成熟。npm應該是前端包管理的不二選擇。node

公司對於搭建本地私有npm庫有以下要求:git

  1. 私有包託管在內部服務器中
  2. 項目中使用了公共倉庫上的公共包,也使用了內部服務器上的私有包
  3. 但願下載的時候,公共包走公共倉庫,私有包走內部服務器的私有倉庫
  4. 服務器硬盤有限,但願只緩存下載過的包,而不是所有同步。
  5. 對於下載,發佈npm包有對應的權限管理,安裝方便,配置簡單,依賴少。

關於sinopia?

Sinopia 是一個零配置的私有的帶緩存功能的npm包管理工具,做者是是rlidwka,一個大神,也是一隻貓~ 往社區內貢獻過不少代碼,包括 jshttp, markdown-it 等等,也是 Node.js 核心代碼庫的活躍貢獻者。github

使用sinopia,你不用安裝CouchDB或MYSQL之類的數據庫,Sinopia有本身的迷你數據庫,若是要下載的包不存在,它將自動去你配置的npm地址上去下載,並且硬盤中只緩存你如今過的包,以節省空間。web

爲何選擇sinopia

sinopia有如下幾個優點值得關注:算法

  1. 不一樣步拉取npm庫,佔據大量硬盤,沒有硬盤被撐爆的問題;
  2. 安裝配置極其簡單,不須要數據庫;
  3. 支持配置上游registry配置,一次拉取即緩存;
  4. 支持forever及pm2守護進程管理;

其餘方法

  • 使用 git+ssh 這種方式直接引用到 GitHub 項目地址

嗯,這種方式可行,也最簡單,但真真的太爛了,姑且不說不能使用 semver,關鍵仍是 url 太醜,若是是強迫症真的無法忍~數據庫

  • 使用cnpm

暫且不論 cnpm 只是做爲鏡像使用,其實這個方案缺點就挺多的,用的人多,速度不必定快,緩存,關鍵是不支持發佈包以及登錄、註冊,再加上配置過於複雜。並且,還須要安裝數據庫。express

  • npm on-site

土豪啊,我還能說什麼呢。。。可是問題是,npm在國內訪問慢,仍是不是的沒法訪問,花錢也買不到好的服務,何須呢。npm

部署

安裝

首先,你要本身配置nodejs及npm的環境,而後運行json

npm install -g sinopia

啓動

$ sinopia
 warn  --- config file  - .....\AppData\Roaming\sinopia\config.yaml
 warn  --- http address - http://localhost:4873/

而後打開:http://localhost:4873/
安裝成功畫面
若是能正常顯示,說明安裝成功。

使用pm2啓動

固然,你也可使用pm2或其餘的守護進程進行管理,具體步驟以下:

安裝pm2:npm install -g pm2

啓動:pm2 start `which sinopia`

更多高級的pm2使用方法能夠查看pm2電子書,至關詳細,強烈推薦。

服務端配置

Sinopia的特色是,你在哪一個目錄運行,它的就會在對應的目錄下建立本身的文件。目錄下默認有兩個文件:config.yamlstorage htpasswd 是添加用戶以後自動建立的。

root@debian:/usr/local/apps/sinopia# ls
config.yaml  htpasswd  storage

其中config.yaml是用來配置訪問權限,代理,文件存儲路徑等全部配置信息的,htpasswd用來保存用戶的帳號密碼等息息,storage是用來存放npm包的。

config.yaml配置文件

#
# This is the default config file. It allows all users to do anything,
# so don't use it on production systems.
#
# Look here for more config file examples:
# https://github.com/rlidwka/sinopia/tree/master/conf
#

# path to a directory with all packages
storage: ./storage  //npm包存放的路徑

auth:
  htpasswd:
    file: ./htpasswd   //保存用戶的帳號密碼等信息
    # Maximum amount of users allowed to register, defaults to "+inf".
    # You can set this to -1 to disable registration.
    max_users: -1  //默認爲1000,改成-1,禁止註冊

# a list of other known repositories we can talk to
uplinks:
  npmjs:
    url: http://registry.npm.taobao.org/  //默認爲npm的官網,因爲國情,修改 url 讓sinopia使用 淘寶的npm鏡像地址
    
packages:  //配置權限管理
  '@*/*':
    # scoped packages
    access: $all
    publish: $authenticated

  '*':
    # allow all users (including non-authenticated users) to read and
    # publish all packages
    #
    # you can specify usernames/groupnames (depending on your auth plugin)
    # and three keywords: "$all", "$anonymous", "$authenticated"
    access: $all

    # allow all known users to publish packages
    # (anyone can register by default, remember?)
    publish: $authenticated

    # if package is not available locally, proxy requests to 'npmjs' registry
    proxy: npmjs

# log settings
logs:
  - {type: stdout, format: pretty, level: http}
  #- {type: file, path: sinopia.log, level: info}

# you can specify listen address (or simply a port) 
listen: 0.0.0.0:4873  ////默認沒有,只能在本機訪問,添加後能夠經過外網訪問。

部分配置字段意義

storage: 倉庫保存的路徑

web: 是否支持WEB接口

auth: 驗證相關

uplinks: 配置上游的npm服務器,主要是用於請求的倉庫不存在時去上游服務器拉取

packages: 配置模塊/包的發佈(publish)、下載(access)的權限等

listen: 配置監聽端口與主機名

auth配置

max_users: -1表示咱們將最大用戶數設置爲-1,表示禁用 npm adduser 命令來建立用戶,不過咱們仍然能夠經過當前目錄下的 htpasswd 文件來初始化用戶。
示例:

yorkie:{SHA}?????????????????=:autocreated 2016-02-05T15:33:46.238Z

weflex:{SHA}????????????????=:autocreated 2016-02-05T15:39:19.960Z

james:{SHA}????????????????=:autocreated 2016-02-05T17:59:05.041Z

上面的加密算法也很簡單,就是簡單的SHA1哈稀以後再轉換成 Base64 輸出就好,後面跟着的只是表示時間。

packages配置

配置大體分爲兩個部分,一個是以 @weflex/* 爲開頭的,另外一個則是通配符 *。

這個固然就是對 package.json 中的 name 字段進行匹配,好比 @weflex/app 將匹配第一個配置,而 express 則匹配第二個。

這裏這麼配置的意義在於:通常團隊或者公司的私有項目,會採用不一樣的權限控制,因而這裏借用了 NPM 的 scoped name 即 @company 的形式,例如 @weflex/app 即表示 WeFlex 下屬的 app 項目了。

接下來,每個命名過濾器(filter)下都有三項基本設置:

  • access: 表示哪一類用戶能夠對匹配的項目進行安裝(install)
  • publish: 表示哪一類用戶能夠對匹配的項目進行發佈(publish)
  • proxy: 如其名,這裏的值是對應於 uplinks 的

對於1和2的值,咱們一般有如下一些可選的配置:

  • $all 表示全部人均可以執行對應的操做
  • $authenticated 表示只有經過驗證的人能夠執行對應操做
  • $anonymous 表示只有匿名者能夠進行對應操做(一般無用)

或者也能夠指定對應於以前咱們配置的用戶表 htpasswd 中的一個或多個用戶,這樣就明確地指定哪些用戶能夠執行匹配的操做
配置完成後,再運行:

$ sinopia -c config.yml

客戶端使用

強烈推薦使用nrm來管理本身的代理。

安裝nrm:

全局安裝nrm能夠快速修改,切換,增長npm鏡像地址。

$ npm install -g nrm # 安裝nrm
$ nrm add XXXXX http://XXXXXX:4873 # 添加本地的npm鏡像地址
$ nrm use XXXX # 使用本址的鏡像地址

nrm的其餘命令:

$ nrm --help  # 查看nrm命令幫助
$ nrm list # 列出可用的 npm 鏡像地址
$ nrm use taobao # 使用`淘寶npm`鏡像地址

安裝包

安裝完成.以後你經過npm install 安裝的包,sinopia都會幫你緩存到本地了.試一下吧。

mkdir test && cd test
npm install lodash # sinopia發現本地沒有 lodash包,就會從 taobao鏡像下載
rm -rf node-modules # 刪除目錄
npm insatll lodash # 第二次安裝就會從緩存下載了,速度很快

建立用戶與發佈包

建立新用戶

1.確保本身已經切換到配置的代理

➜  ~ nrm ls

  npm ---- https://registry.npmjs.org/
  cnpm --- http://r.cnpmjs.org/
  taobao - http://registry.npm.taobao.org/
  nj ----- https://registry.nodejitsu.com/
  rednpm - http://registry.mirror.cqupt.edu.cn
  npmMirror  https://skimdb.npmjs.com/registry
* sinopia  http://192.168.1.200:4873/

2.運行npm adduser,填寫信息,註冊帳號。若是已經有帳號,直接運行npm login便可。

➜  ~ npm adduser
  Username: test
  Password:

3.運行$ npm publish發佈新包。

總結

  • 到此爲止吧,剩下的坑本身踩吧,多踩坑才能多成長。
  • 保存好你的 htpasswd 文件,不要泄漏到任何公有倉庫中去。
  • 以上的狀況並無考慮在遇到一些黑客攻擊的狀況下,因此爲了儘可能保證代碼的安全,能夠在前端加一層 Nginx 而後配置 SSH 公鑰來做爲雙層驗證。
相關文章
相關標籤/搜索