Node服務一鍵離線部署

  • 2019 年 12 月 4 日
  • 筆記

本文作者:IMWeb 陳映平 原文出處:IMWeb社區 未經同意,禁止轉載

背景說明

項目測試通過,到了上線部署階段。部署的機器安全限制比較嚴格,不允許訪問外網。此外,沒有對外網開放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

[root@localhost 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服務離線部署,應該已經可以涵蓋大部分的場景,舉一反三即可。當然更富在的場景還有,這裡就不再展開。

Tags: