跟我一起部署和定制 CNPM——基礎(chǔ)部署

原文鏈接:https://xcoder.in/2016/07/09/lets-cnpm-base-deploy/

本章會介紹 CNPM 的基礎(chǔ)部署方法。

該文章所對應(yīng)的 cnpm 目標(biāo)版本為 v2.12.2,上下浮動一些兼容的版本問題也都不是特別大。

準(zhǔn)備

想要部署 CNPM,你需要做以下的一些準(zhǔn)備。

  1. 部署的宿體,如服務(wù)器、云主機(jī)、自己的電腦等;
  2. 數(shù)據(jù)庫,支持 MySQL、PostgreSQL、MariaDB,如果使用 SQLite 則無需準(zhǔn)備;
  3. Git 客戶端(推薦)。

開始部署

克隆 CNPM

首先在本地選擇一個目錄,比如我將它選擇在 /usr/app,然后預(yù)想 CNPM 的目錄為 /usr/app/cnpm,那么需要在終端 $ cd /usr/app。

接下去執(zhí)行 Git 指令將 CNPM 克隆到相應(yīng)目錄。

$ git clone https://github.com/cnpm/cnpmjs.org.git

Windows 用戶

Windows 用戶也可以用類似 Cygwin、MinGW、Powershell 甚至直接是 Command 等來運行 Git

當(dāng)然也可以直接下載一些 GUI 工具來克隆,如 SourceTree。

非 Git 用戶

跑到 CNPM 的 Release 頁面,選擇相應(yīng)的版本下載,比如這里會選擇 v2.12.2 版。

下載完畢后將文件夾解壓到相應(yīng)目錄即可。

安裝依賴

安裝依賴其實就是一個 npm install,不過 CNPM 把該指令已經(jīng)寫到 Makefile 里面了,所以直接執(zhí)行下面的命令就好了。

$ make install

當(dāng)然萬一你是 Windows 用戶或者不會 make,那么還是要用 npm install。

$ npm install --build-from-source --registry=https://registry.npm.taobao.org --disturl=https://npm.taobao.org/mirrors/node

修改配置文件

新建一份 config/config.js 文件,并且寫入如下的骨架:

'use strict';

module.exports = {
};

在這里面輸入你需要的鍵值對。

這里將會列舉一些常用的配置項,其余的一些配置項請自行參考 config/index.js 文件。

配置字段參考

  • enableCluster:是否啟用 cluster-worker 模式啟動服務(wù),默認(rèn) false,生產(chǎn)環(huán)節(jié)推薦為 true;
  • registryPort:API 專用的 registry 服務(wù)端口,默認(rèn) 7001
  • webPort:Web 服務(wù)端口,默認(rèn) 7002
  • bindingHost:監(jiān)聽綁定的 Host,默認(rèn)為 127.0.0.1,如果外面架了一層本地的 Nginx 反向代理或者 Apache 反向代理的話推薦不用改;
  • sessionSecretsession 用的鹽;
  • logdir:日志目錄;
  • uploadDir:臨時上傳文件目錄;
  • viewCache:視圖模板緩存是否開啟,默認(rèn)為 false;
  • enableCompress:是否開啟 gzip 壓縮,默認(rèn)為 false;
  • admins:管理員們,這是一個 JSON Object,對應(yīng)各鍵名為各管理員的用戶名,鍵值為其郵箱,默認(rèn)為 { fengmk2: 'fengmk2@gmail.com', admin: 'admin@cnpmjs.org', dead_horse: 'dead_horse@qq.com' };
  • logoURLLogo 地址,不過對于我這個已經(jīng)把 CNPM 前端改得面目全非的人來說已經(jīng)忽略了這個配置了;
  • adBanner:廣告 Banner 的地址;
  • customReadmeFile:實際上我們看到的 cnpmjs.org 首頁中間一大堆冗長的介紹是一個 Markdown 文件轉(zhuǎn)化而成的,你可以設(shè)置該項來自行替換這個文件;
  • customFooter:自定義頁腳模板;
  • npmClientName:默認(rèn)為 cnpm,如果你有自己開發(fā)或者 fork 的 npm 客戶端的話請改成自己的 CLI 命令,這個應(yīng)該會在一些頁面的說明處替換成你所寫的;
  • backupFilePrefix:備份目錄;
  • database:數(shù)據(jù)庫相關(guān)配置,為一個對象,默認(rèn)如果不配置將會是一個 ~/.cnpmjs.org/data.sqlite 的 SQLite;
    • db:數(shù)據(jù)的庫名;
    • username:數(shù)據(jù)庫用戶名;
    • password:數(shù)據(jù)庫密碼;
    • dialect:數(shù)據(jù)庫適配器,可選 "mysql"、"sqlite"、"postgres"、"mariadb",默認(rèn)為 "sqlite";
    • hsot:數(shù)據(jù)庫地址;
    • port:數(shù)據(jù)庫端口;
    • pool:數(shù)據(jù)庫連接池相關(guān)配置,為一個對象;
      • maxConnections:最大連接數(shù),默認(rèn)為 10
      • minConnections:最小連接數(shù),默認(rèn)為 0;
      • maxIdleTime:單條鏈接最大空閑時間,默認(rèn)為 30000 毫秒;
    • storege:僅對 SQLite 配置有效,數(shù)據(jù)庫地址,默認(rèn)為 ~/.cnpmjs/data.sqlite;
  • nfs:包文件系統(tǒng)處理對象,為一個 Node.js 對象,默認(rèn)是 fs-cnpm 這個包,并且配置在 ~/.cnpmjs/nfs 目錄下,也就是說默認(rèn)所有同步的包都會被放在這個目錄下;開發(fā)者可以使用別的一些文件系統(tǒng)插件(如上傳到又拍云等),又或者自己去按接口開發(fā)一個邏輯層,這些都是后話了;
  • registryHost:暫時還未試過,我猜是用于 Web 頁面顯示用的,默認(rèn)為 r.cnpmjs.org;
  • enablePrivate:是否開啟私有模式,默認(rèn)為 false
    • 如果是私有模式則只有管理員能發(fā)布包,其它人只能從源站同步包;
    • 如果是非私有模式則所有登錄用戶都能發(fā)布包;
  • scopes:非管理員發(fā)布包的時候只能用以 scopes 里面列舉的命名空間為前綴來發(fā)布,如果沒設(shè)置則無法發(fā)布,也就是說這是一個必填項,默認(rèn)為 [ '@cnpm', '@cnpmtest', '@cnpm-test' ],據(jù)蘇千大大解釋是為了便于管理以及讓公司的員工自覺按需發(fā)布;更多關(guān)于 NPM scope 的說明請參見 npm-scope;
  • privatePackages:就如該配置項的注釋所述,出于歷史包袱的原因,有些已經(jīng)存在的私有包(可能之前是用 Git 的方式安裝的)并沒有以命名空間的形式來命名,而這種包本來是無法上傳到 CNPM 的,這個配置項數(shù)組就是用來加這些例外白名單的,默認(rèn)為一個空數(shù)組;
  • sourceNpmRegistry:更新源 NPM 的 registry 地址,默認(rèn)為 https://registry.npm.taobao.org
  • sourceNpmRegistryIsCNpm:源 registry 是否為 CNPM,默認(rèn)為 true,如果你使用的源是官方 NPM 源,請將其設(shè)為 false;
  • syncByInstall:如果安裝包的時候發(fā)現(xiàn)包不存在,則嘗試從更新源同步,默認(rèn)為 true
  • syncModel:更新模式(不過我覺得是個 typo),有下面幾種模式可以選擇,默認(rèn)為 "none";
    • "none":永不同步,只管理私有用戶上傳的包,其它源包會直接從源站獲取;
    • "exist":定時同步已經(jīng)存在于數(shù)據(jù)庫的包;
    • "all":定時同步所有源站的包;
  • syncInterval:同步間隔,默認(rèn)為 "10m" 即十分鐘;
  • syncDevDependencies:是否同步每個包里面的 devDependencies 包們,默認(rèn)為 false;
  • badgeSubject:包的 badge 顯示的名字,默認(rèn)為 cnpm;
  • userService:用戶驗證接口,默認(rèn)為 null,即無用戶相關(guān)功能也就是無法有用戶去上傳包,該部分需要自己實現(xiàn)接口功能并配置,如與公司的 Gitlab 相對接,這也是后話了;
  • alwaysAuth:是否始終需要用戶驗證,即便是 $ cnpm install 等命令;
  • httpProxy:代理地址設(shè)置,用于你在墻內(nèi)源站在墻外的情況。

一個可能的配置

下面給出一個樣例配置:

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' ]
};

上面的配置包文件系統(tǒng)層用的是 upyun-cnpm 插件,需要在 CNPM 源碼根目錄執(zhí)行

$ npm install --save -d upyun-cnpm

這個時候你的 package.json 就有更改與源 Repo 不一致了,如果是 Git 克隆的用戶在以后升級更新系統(tǒng)的時候稍稍注意一下可能的沖突即可。

官方 NFS 插件

下面給出幾個官方的 NFS 插件:

  • upyun-cnpm:包本體存在又拍云的插件;
  • fs-cnpm:包本體存在本地的插件;
  • sfs-client:包本體存在 SFS(Simple FIle Store)插件;
  • qn-cnpm:包本體存在七牛的插件;
  • oss-cnpm:包本體存在阿里云 OSS 的插件。

以后官方如果有一些新的插件進(jìn)來,這里可能不會更新了,請自行去 NFS Storage Wrappers 獲取最新的 NFS 插件們。

初始化數(shù)據(jù)庫

如果你使用的是 SQLite 的話,數(shù)據(jù)庫是自動就好了的,可以忽略該步。

其它數(shù)據(jù)庫需要自行導(dǎo)入初始數(shù)據(jù)庫結(jié)構(gòu)。

初始數(shù)據(jù)庫腳本在 docs/db.sql 里面,你可以用一些 GUI 工具將數(shù)據(jù)導(dǎo)入,也可以直接進(jìn)入命令行導(dǎo)入。

比如你用的是 MySQL,就可以在本機(jī)操作 MySQL。

$ mysql -u yourname -p
mysql> use cnpmjs;
mysql> source docs/db.sql

啟動服務(wù)

搞好配置之后就可以直接啟動服務(wù)了。

簡單啟動

最簡單的辦法也是我現(xiàn)在正在用的方法就是直接用 node 執(zhí)行一下入口文件就好了。

$ node dispatch.js

其實我是在 tmux 里面執(zhí)行上面的指令的。

官方腳本啟動

官方的其它一些指令,比如你可以用 NPM 的 script 來運行。

$ npm run start

在 CNPM 里面,npm script 還有下面幾種指令

  • npm run dev:調(diào)試模式啟動;
  • npm run test:跑測試;
  • npm run start:啟動 CNPM;
  • npm run status:查看 CNPM 啟動狀態(tài);
  • npm run stop:停止 CNPM。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,068評論 25 709
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,569評論 19 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 47,275評論 6 342
  • 不需要再說什么了 我懂,即使只有一個“呵呵” 也,包含了你所有思念 時間見證了恒久 空間考驗了真誠 你在那里,我在...
    冰眉鐵面閱讀 303評論 1 2
  • 文/度仔媽咪. 有一個小妞,現(xiàn)在11個多月,最擅長的運動是爬行。 下午吃過飯,天還很亮堂,小區(qū)里玩耍的小朋友特別多...
    Suven閱讀 348評論 2 4

友情鏈接更多精彩內(nèi)容