本章會介紹 CNPM 的基礎部署方法。
該文章所對應的 cnpm 目標版本為 v2.12.2,上下浮動一些相容的版本問題也都不是特別大。
準備
想要部署 CNPM,你需要做以下的一些準備。
- 部署的宿體,如伺服器、雲主機、自己的電腦等;
- 資料庫,支援 MySQL、PostgreSQL、MariaDB,如果使用 SQLite 則無需準備;
- Git 客戶端(推薦)。
開始部署
克隆 CNPM
首先在本地選擇一個目錄,比如我將它選擇在 /usr/app
,然後預想 CNPM 的目錄為 /usr/app/cnpm
,那麼需要在終端 $ cd /usr/app
。
接下去執行 Git 指令將 CNPM 克隆到相應目錄。
1 |
$ git clone https://github.com/cnpm/cnpmjs.org.git |
Windows 使用者
Windows 使用者也可以用類似 Cygwin、MinGW、Powershell 甚至直接是 Command 等來執行 Git。
當然也可以直接下載一些 GUI 工具來克隆,如 SourceTree。
非 Git 使用者
跑到 CNPM 的 Release 頁面,選擇相應的版本下載,比如這裡會選擇 v2.12.2 版。
下載完畢後將資料夾解壓到相應目錄即可。
安裝依賴
安裝依賴其實就是一個 npm install
,不過 CNPM 把該指令已經寫到 Makefile 裡面了,所以直接執行下面的命令就好了。
1 |
$ make install |
當然萬一你是 Windows 使用者或者不會 make
,那麼還是要用 npm install
。
1 |
$ npm install --build-from-source --registry=https://registry.npm.taobao.org --disturl=https://npm.taobao.org/mirrors/node |
修改配置檔案
新建一份 config/config.js
檔案,並且寫入如下的骨架:
1 2 3 4 |
'use strict'; module.exports = { }; |
在這裡面輸入你需要的鍵值對。
這裡將會列舉一些常用的配置項,其餘的一些配置項請自行參考 config/index.js 檔案。
配置欄位參考
enableCluster
:是否啟用 cluster-worker 模式啟動服務,預設false
,生產環節推薦為true
;registryPort
:API 專用的 registry 服務埠,預設7001
;webPort
:Web 服務埠,預設7002
;bindingHost
:監聽繫結的 Host,預設為127.0.0.1
,如果外面架了一層本地的Nginx 反向代理或者 Apache 反向代理的話推薦不用改;sessionSecret
:session 用的鹽;logdir
:日誌目錄;uploadDir
:臨時上傳檔案目錄;viewCache
:檢視模板快取是否開啟,預設為false
;enableCompress
:是否開啟 gzip 壓縮,預設為false
;admins
:管理員們,這是一個JSON Object
,對應各鍵名為各管理員的使用者名稱,鍵值為其郵箱,預設為{ fengmk2: 'fengmk2@gmail.com', admin: 'admin@cnpmjs.org', dead_horse: 'dead_horse@qq.com' }
;logoURL
:Logo 地址,不過對於我這個已經把 CNPM 前端改得面目全非的人來說已經忽略了這個配置了;adBanner
:廣告 Banner 的地址;customReadmeFile
:實際上我們看到的 cnpmjs.org 首頁中間一大堆冗長的介紹是一個 Markdown 檔案轉化而成的,你可以設定該項來自行替換這個檔案;customFooter
:自定義頁尾模板;npmClientName
:預設為cnpm
,如果你有自己開發或者 fork 的 npm 客戶端的話請改成自己的 CLI 命令,這個應該會在一些頁面的說明處替換成你所寫的;backupFilePrefix
:備份目錄;database
:資料庫相關配置,為一個物件,預設如果不配置將會是一個~/.cnpmjs.org/data.sqlite
的 SQLite;db
:資料的庫名;username
:資料庫使用者名稱;password
:資料庫密碼;dialect
:資料庫介面卡,可選"mysql"
、"sqlite"
、"postgres"
、"mariadb"
,預設為"sqlite"
;hsot
:資料庫地址;port
:資料庫埠;pool
:資料庫連線池相關配置,為一個物件;maxConnections
:最大連線數,預設為10
;minConnections
:最小連線數,預設為0
;maxIdleTime
:單條連結最大空閒時間,預設為30000
毫秒;storege
:僅對 SQLite 配置有效,資料庫地址,預設為~/.cnpmjs/data.sqlite
;
nfs
:包檔案系統處理物件,為一個 Node.js 物件,預設是 fs-cnpm 這個包,並且配置在~/.cnpmjs/nfs
目錄下,也就是說預設所有同步的包都會被放在這個目錄下;開發者可以使用別的一些檔案系統外掛(如上傳到又拍雲等),又或者自己去按介面開發一個邏輯層,這些都是後話了;registryHost
:暫時還未試過,我猜是用於 Web 頁面顯示用的,預設為r.cnpmjs.org
;enablePrivate
:是否開啟私有模式,預設為false
;- 如果是私有模式則只有管理員能釋出包,其它人只能從源站同步包;
- 如果是非私有模式則所有登入使用者都能釋出包;
scopes
:非管理員釋出包的時候只能用以scopes
裡面列舉的名稱空間為字首來發布,如果沒設定則無法釋出,也就是說這是一個必填項,預設為[ '@cnpm', '@cnpmtest', '@cnpm-test' ]
,據蘇千大大解釋是為了便於管理以及讓公司的員工自覺按需釋出;更多關於 NPM scope 的說明請參見 npm-scope;privatePackages
:就如該配置項的註釋所述,出於歷史包袱的原因,有些已經存在的私有包(可能之前是用 Git 的方式安裝的)並沒有以名稱空間的形式來命名,而這種包本來是無法上傳到 CNPM 的,這個配置項陣列就是用來加這些例外白名單的,預設為一個空陣列;sourceNpmRegistry
:更新源 NPM 的 registry 地址,預設為https://registry.npm.taobao.org
;sourceNpmRegistryIsCNpm
:源 registry 是否為 CNPM,預設為true
,如果你使用的源是官方 NPM 源,請將其設為false
;syncByInstall
:如果安裝包的時候發現包不存在,則嘗試從更新源同步,預設為true
;syncModel
:更新模式(不過我覺得是個typo
),有下面幾種模式可以選擇,預設為"none"
;"none"
:永不同步,只管理私有使用者上傳的包,其它源包會直接從源站獲取;"exist"
:定時同步已經存在於資料庫的包;"all"
:定時同步所有源站的包;
syncInterval
:同步間隔,預設為"10m"
即十分鐘;syncDevDependencies
:是否同步每個包裡面的devDependencies
包們,預設為false
;badgeSubject
:包的 badge 顯示的名字,預設為cnpm
;userService
:使用者驗證介面,預設為null
,即無使用者相關功能也就是無法有使用者去上傳包,該部分需要自己實現介面功能並配置,如與公司的 Gitlab 相對接,這也是後話了;alwaysAuth
:是否始終需要使用者驗證,即便是$ cnpm install
等命令;httpProxy
:代理地址設定,用於你在牆內源站在牆外的情況。
一個可能的配置
下面給出一個樣例配置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
module.exports = { enableCluster: true, database: { db: "snpm", username: "username", password: "password", dialect: "mysql", host: "127.0.0.1", port: 3306 }, enablePrivate: false, admins: { xadillax: "i@2333.moe" }, syncModel: "exist", nfs: require('upyun-cnpm').create({ bucket: "your bucket", oprator: "your id", password: "your secret" }), scopes: [ '@cheniu', '@souche', '@souche-f2e' ], badgeSubject: 'snpm', privatePackages: [ 'snpm' ] }; |
上面的配置包檔案系統層用的是 upyun-cnpm 外掛,需要在 CNPM 原始碼根目錄執行
1 $ npm install --save -d upyun-cnpm
這個時候你的
package.json
就有更改與源 Repo 不一致了,如果是 Git 克隆的使用者在以後升級更新系統的時候稍稍注意一下可能的衝突即可。
官方 NFS 外掛
下面給出幾個官方的 NFS 外掛:
- upyun-cnpm:包本體存在又拍雲的外掛;
- fs-cnpm:包本體存在本地的外掛;
- sfs-client:包本體存在 SFS(Simple FIle Store)外掛;
- qn-cnpm:包本體存在七牛的外掛;
- oss-cnpm:包本體存在阿里雲 OSS 的外掛。
以後官方如果有一些新的外掛進來,這裡可能不會更新了,請自行去 NFS Storage Wrappers 獲取最新的 NFS 外掛們。
初始化資料庫
如果你使用的是 SQLite 的話,資料庫是自動就好了的,可以忽略該步。
其它資料庫需要自行匯入初始資料庫結構。
初始資料庫指令碼在 docs/db.sql 裡面,你可以用一些 GUI 工具將資料匯入,也可以直接進入命令列匯入。
比如你用的是 MySQL,就可以在本機操作 MySQL。
1 2 3 |
$ mysql -u yourname -p mysql> use cnpmjs; mysql> source docs/db.sql |
啟動服務
搞好配置之後就可以直接啟動服務了。
簡單啟動
最簡單的辦法也是我現在正在用的方法就是直接用 node
執行一下入口檔案就好了。
1 |
$ node dispatch.js |
其實我是在 tmux 裡面執行上面的指令的。
官方指令碼啟動
官方的其它一些指令,比如你可以用 NPM 的 script 來執行。
1 |
$ npm run start |
在 CNPM 裡面,npm script 還有下面幾種指令
npm run dev
:除錯模式啟動;npm run test
:跑測試;npm run start
:啟動 CNPM;npm run status
:檢視 CNPM 啟動狀態;npm run stop
:停止 CNPM。