Node服務一鍵離線部署
背景說明
專案測試通過,到了上線部署階段。部署的機器安全限制比較嚴格,不允許訪問外網。此外,沒有對外網開放ssh服務,無法通過ssh遠端操作。
針對上面提到的兩條限制條件,通過下面方式解決:
-
無法訪問外部網路:將依賴的環境本地下載,打包上傳,離線安裝;
-
無法ssh遠端操作:將安裝/初始化步驟指令碼化,安裝包交給運維人員,一鍵部署;
安裝包說明
讓運維同學將安裝包置於/data/my_install
下。安裝包大致如容如下。其中install_scripts
目錄中,存放的是部署相關的指令碼。
[root@localhost my_install]# tree -L 1
.
├── control # 各種服務控制指令碼
├── install_scripts # 安裝指令碼
├── node-v5.11.1-linux-x64 # node二進位制包
├── npm_modules_global_offline # 全域性的npm模組,比如 pm2
├── express_svr # express應用
└── uninstall_scripts # 解除安裝指令碼
部署指令碼說明
[root@localhost install_scripts]# tree -L 1
.
├── install_node.sh # 安裝nodejs
├── install_npm_moduels.sh # 安裝npm模組
├── install_run_service.sh # 啟動服務
├── install_express_svr.sh # 部署express應用
└── install.sh # 部署總入口
Node安裝
看下nodejs
安裝指令碼。為了安裝快些,這裡我們採用的是編譯好的二進位制檔案。只需要將相關檔案拷貝到指定路徑即可。
Node安裝包說明
以下是[email protected]
的目錄。
[root@localhost node-v5.11.1-linux-x64]# tree -L 2
.
├── bin
│ ├── node # node可執行檔案
│ └── npm -> ../lib/node_modules/npm/bin/npm-cli.js # npm可執行檔案,其實是個軟連結
├── CHANGELOG.md
├── include # 各種包含檔案
│ └── node
├── lib
│ └── node_modules # npm模組安裝目錄
├── LICENSE
├── README.md
└── share
├── doc
├── man # 說明檔案
└── systemtap
拷貝路徑說明如下
本地路徑 | 拷貝到的路徑 | 備註 |
---|---|---|
./bin/node | /usr/local/bin/node | node可執行檔案 |
./bin/npm | /usr/local/bin/node | npm可執行檔案,軟連結,指向 /usr/local/lib/node_modules/npm/bin/npm-cli.js |
./lib/node_modules/ | /usr/local/lib/ | npm模組安裝目錄 |
./include/node | /usr/local/include/ | 各種包含檔案 |
./share/man/man1/node.1 | /usr/local/man/man1/ | 使用說明 |
安裝指令碼
install_node.sh
[[email protected] install_scripts]# cat install_node.sh
#!/bin/bash
# 安裝nodejs
cd /data/my_install/
cd node-v5.11.1-linux-x64/
cp -r ./lib/node_modules/ /usr/local/lib/ # copy the node modules folder to the /lib/ folder
cp -r ./include/node /usr/local/include/ # copy the /include/node folder to /usr/local/include folder
mkdir -p /usr/local/man/man1 # create the man folder
cp ./share/man/man1/node.1 /usr/local/man/man1/ # copy the man file
cp ./bin/node /usr/local/bin/ # copy node to the bin folder
ln -s /usr/local/lib/node_modules/npm/bin/npm-cli.js /usr/local/bin/npm ## making the symbolic link to npm
全域性npm模組安裝
這裡我們就用到了pm2,需要全域性安裝。根據npm全域性模組的安裝方式,需要分兩步
-
將pm2模組目錄拷貝到
/usr/local/lib/node_modules
下。 -
在
/usr/local/bin/
下,建立軟連結,指向/usr/local/lib/node_modules/pm2/bin/
下的可執行檔案。
pm2安裝說明
首先,把pm2包下載下來,這步略。我在這裡放到了npm_modules_global_offline
目錄下,以防以後還有其他全部模組要一起安裝。
軟連結對映關係如下
目標檔案路徑 | 原始檔路徑 |
---|---|
/usr/local/bin/pm2 | /usr/local/lib/node_modules/pm2/bin/pm2 |
/usr/local/bin/pm2-dev | /usr/local/lib/node_modules/pm2/bin/pm2-dev |
安裝指令碼
install_npm_moduels.sh
#!/bin/bash
# 安裝全域性npm模組
cd /data/my_install/
cd npm_modules_global_offline/
cp -rf ./node_modules/* /usr/local/lib/node_modules/
ln -s /usr/local/lib/node_modules/pm2/bin/pm2 /usr/local/bin/pm2
ln -s /usr/local/lib/node_modules/pm2/bin/pm2-dev /usr/local/bin/pm2-dev
Express應用安裝
express應用的安裝相對比較簡單,本地npm install
後,連同node_modules
目錄一起打包即可。
指令碼如下,把express_svr
拷貝到指定路徑即可。
install_express_svr.sh
#!/bin/bash
# 安裝express應用
cd /data/my_install/
if [ ! -d "/data/web/express_svr" ]; then
mkdir /data/web/express_svr
fi
cp -rf ./express_svr/* /data/express_svr/
一鍵部署指令碼
簡易版本
其實沒那麼玄乎,無非就是再寫個指令碼,統一呼叫下前面提到的指令碼。奏是這麼簡單。
install.sh:
./install_node.sh
./install_npm_moduels.sh
./install_otc_svr.sh
./install_run_service.sh
執行:
./install.sh
進一步完善
上面指令碼的缺陷比較明顯,沒有進度提示,也沒有執行狀態提示。於是優化一下,雖然也不能算是完善,但相比之前的版本的確會好很多。
#!/bin/bash
commands=(
./install_node.sh "install nodejs"
./install_npm_moduels.sh "install npm modules"
./install_express_svr.sh "install express application"
./install_run_service.sh "start services"
)
commands_len=${#commands[@]}
for (( i=0; i<$commands_len; i=i+2 ))
do
desc_index=i+1
desc=${commands[$desc_index]}
echo -e $desc" - starts ..."
${commands[$i]}
if [ "$?" == "0" ]; then
echo -e $desc" - ok \n"
else
echo -e $desc" - failed ! \n"
fi
done
執行看下效果:
install nodejs - starts ...
install nodejs - ok
install npm modules - starts ...
install npm modules - ok
install express application - starts ...
install express application - ok
start services - starts ...
# pm2啟動日誌,一大坨,這裡忽略
start services - ok
一鍵解除安裝指令碼
從上面的內容可以看到,離線部署的過程,主要包含了幾個操作
-
檔案拷貝
-
建立軟連線
-
啟動服務
那麼,解除安裝無非就是上面幾個步驟的反操作。指令碼大致如下,跟前面的部署指令碼其實是一一對應的。這裡就不再贅述。
[root@localhost uninstall_scripts]# tree -L 1
.
├── uninstall_run_service.sh
├── uninstall_node.sh
├── uninstall_npm_modules.sh
├── uninstall_express_svr.sh
└── uninstall.sh
寫在後面
文中提及的node服務離線部署,應該已經可以涵蓋大部分的場景,舉一反三即可。當然更富在的場景還有,這裡就不再展開。。。。
https://segmentfault.com/a/1190000006793590