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 倉庫(比如使用私有倉庫),如果遇到這種問題,解決方法:
- 部署機器上生成 ssh key,如: ssh-keygen -t rsa -C "xxx@xxx.com"
- 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 有以下幾種鉤子,先後順序為:
- pre-setup:在 setup 前觸發,如安裝 git
- post-setup:在 setup 後觸發,如做一些其他配置
- pre-deploy-local:在 deploy 前觸發,執行本地腳本
- pre-deploy:在 deploy 前觸發,執行遠程腳本
- 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
※轉貼我的一篇文章<拍攝蜻蜓的作戰部署>