標籤:

PM2-deploy 躺坑記

PM2-deploy 躺坑記

7 人贊了文章

這兩天嘗試使用 pm2 自帶的 deploy 功能實現一鍵部署多台機器,看了眼文檔感覺挺簡單,但還是趟了一些坑,這裡記錄一下。

一個 pm2 deploy 的栗子:

pm2.config.js

module.exports = { apps: [...], deploy: { production: { user: root, host: [xxx, yyy], ref: origin/master, repo: ..., path: /root/xxx, ssh_options: StrictHostKeyChecking=no, post-deploy: npm install && pm2 startOrRestart pm2.config.js } }}

1. fatal: Could not read from remote repository

沒有許可權 clone 倉庫(比如使用私有倉庫),如果遇到這種問題,解決方法:

  1. 部署機器上生成 ssh key,如: ssh-keygen -t rsa -C "xxx@xxx.com"
  2. GitHub 倉庫 -> Settings -> Deploy Keys -> Add deploy key -> 將剛才生成的 ~/.ssh/id_rsa.pub 拷貝過來

2. ecosystem.js environment is not defined in package.json file

運行:

$ pm2 deploy ecosystem.js production setup

列印:

ecosystem.js environment is not defined in package.json file

解決方案:把 ecosystem.js 改成如 pm2.config.js。

pm2 deploy pm2.config.js production setup

3. /xxx/source already exists and is not an empty directory.

pm2 deploy 有以下幾種鉤子,先後順序為:

  1. pre-setup:在 setup 前觸發,如安裝 git
  2. post-setup:在 setup 後觸發,如做一些其他配置
  3. pre-deploy-local:在 deploy 前觸發,執行本地腳本
  4. pre-deploy:在 deploy 前觸發,執行遠程腳本
  5. post-deploy:在 deploy 後觸發,執行遠程腳本,如 npm install

需要注意的是:setup 應該是一次性操作,而 deploy 是可以後續多次執行的。所以多次運行 setup 會報目錄已存在的錯誤,如果在調試期間需要多次運行 setup,可以加一個:

pre-setup: rm -rf /xxx/source

4. bash: npm: command not found

因為本地執行 pm2 deploy 使用的 ssh 執行遠程命令,非互動式環境,需要將 nvm 的配置放到 ~/.bashrc 的頭部:

export NVM_DIR="$HOME/.nvm"[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"[ -s "$NVM_DIR/bash_completion" ] && . "$NVM_DIR/bash_completion"

然後運行:

$ source ~/.bashrc

重新運行:

$ pm2 deploy pm2.config.js production

5. TypeError: Cannot read property deploy of undefined

具體報錯如下:

/home/asch/.nvm/versions/node/v8.11.2/lib/node_modules/pm2/lib/API.js:869 if (config.deploy) ^TypeError: Cannot read property deploy of undefined

不要使用:

pm2 startOrRestart /xxx/app.js --name="xxx"

想當然以為如果 name=xxx 的進程不存在則啟動,存在則重啟,pm2 startOrRestart 應該結合 pm2 配置文件使用。

修改為:

pm2 startOrRestart pm2.config.js

如果倉庫不存在 pm2.config.js,可以使用 scp 將 pm2.config.js 拷貝到遠程機器上執行上述命令:

pre-deploy-local: scp pm2.config.js xxx@${host}:${dir}/post-deploy: pm2 startOrRestart ${dir}/pm2.config.js

推薦閱讀:

七一講話:新論述 新觀點 新部署 新要求4
解放軍西部戰區部署三代半戰機 前印軍將領聲稱「中國威脅印度」
美公開亮底線:中國反對也要部署薩德
四中全會的29個重大理論觀點重大工作部署解讀2
轉貼我的一篇文章<拍攝蜻蜓的作戰部署>

TAG:Nodejs | 部署 |