Deployment

部署系统

PM2 具有一个简单但功能强大的部署系统,允许在生产环境中配置和更新应用程序。 当您希望同时在一台或多台服务器中的裸机服务器上部署应用程序时,这非常有用。

bash
> pm2 deploy <configuration_file> <environment> <command>

  Commands:
    setup                # 运行远程设置命令
    update               # 更新部署到最新版本
    revert [n]           # 恢复到第 [n] 个最后部署或 1
    curr[ent]            # 输出当前版本提交
    prev[ious]           # 输出之前的发布提交
    exec|run <cmd>       # 执行给定的 <cmd>
    list                 # 列出以前的部署提交
    [ref]                # 部署到 [ref]、“ref”设置或最新标签

部署配置

要配置部署系统,请将deploy属性添加到应用程序配置文件:

js
module.exports = {
  apps: [{
    script: 'api.js',
  }, {
    script: 'worker.js'
  }],

  // 部署配置
  deploy: {
    production: {
      'user': 'ubuntu',
      'host': ['192.168.0.13', '192.168.0.14', '192.168.0.15'],
      'ref': 'origin/master',
      'repo': 'git@github.com:Username/repository.git',
      'path': '/var/www/my-repository',
      'post-deploy': 'npm install'
    }
  }
}

注意:确保本地文件夹中的应用程序配置文件被命名为 ecosystem.config.jspm2.config.js,因此您无需为每个命令键入配置文件名。

配置远程服务器

在配置远程服务器之前验证:

  • 远程服务器安装了 PM2
  • 远程服务器已授予 GIT 克隆目标存储库的权限

配置远程服务器后,您可以开始配置它们:

bash
$ pm2 deploy production setup

注意:由于app配置文件在本地文件夹中名为ecosystem.config.jspm2.config.js,所以不需要每次都指定文件名

部署应用

配置远程服务器后,您现在可以部署应用程序:

bash
$ pm2 deploy production

注意:如果 git 报错有本地更改但仍想推送远程 GIT 上的内容,您可以使用 --force 选项强制部署。

回滚到之前的部署

如果您需要回滚到之前的部署,您可以使用revert选项:

bash
# Revert to -1 deployment
$ pm2 deploy production revert 1

在每台服务器上执行一条命令

要执行一次性运行的命令,您可以使用 exec 选项:

bash
$ pm2 deploy production exec "pm2 reload all"

细节

部署生命周期

使用 PM2 部署时,您可以指定在设置之前/之后以及更新之前/之后执行的操作:

json
"pre-setup" : "echo '在安装过程开始之前要在主机上运行的命令或本地脚本路径'",
"post-setup" : "echo '克隆 repo 后要在主机上运行的命令或脚本路径'",
"pre-deploy" : "pm2 startOrRestart ecosystem.json --env production",
"post-deploy" : "pm2 startOrRestart ecosystem.json --env production",
"pre-deploy-local" : "echo '这是本地执行的命令'",

多主机部署

要同时部署到多个主机,您只需在属性host下的数组中声明每个主机。

"host" : ["212.83.163.1", "212.83.163.2", "212.83.163.3"],

指定 SSH 密钥

您只需添加带有公钥路径的key属性,请参见下面的示例:

js
    "production" : {
      "key"  : "/path/to/some.pem", // 用于验证的公钥路径
      "user" : "node",              // 用于验证的用户
      "host" : "212.83.163.1",      // 在哪里连接
      "ref"  : "origin/master",
      "repo" : "git@github.com:repo.git",
      "path" : "/var/www/production",
      "post-deploy" : "pm2 startOrRestart ecosystem.json --env production"
    },

故障排除

SSH 克隆错误

在大多数情况下,这些错误是由于 pm2 没有正确的密钥来克隆您的存储库造成的。 您需要在每一步验证密钥是否可用。

步骤1

如果您确定您的密钥工作正常,请首先尝试在目标服务器上运行 git clone your_repo.git。 如果成功,请继续下一步。 如果失败,请确保您的密钥同时存储在服务器和您的 git 帐户中。

第2步

默认情况下,ssh-copy-id 复制默认身份,通常命名为 id_rsa。 如果那不是合适的键:

bash
ssh-copy-id -i path/to/my/key your_username@server.com

这会将您的公钥添加到 ~/.ssh/authorized_keys 文件中。

步骤 3

如果您收到以下错误:

bash
--> Deploying to production environment
--> on host mysite.com
 hook pre-setup
 running setup
 cloning git@github.com:user/repo.git
Cloning into '/var/www/app/source'...
Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights and that the repository exists.

**Failed to clone**

Deploy failed

...您可能想要创建一个 ssh 配置文件。 这是确保将正确的 ssh 密钥用于您尝试克隆的任何给定存储库的可靠方法。 请参见此示例

bash
# ~/.ssh/config
Host alias
    HostName myserver.com
    User username
    IdentityFile ~/.ssh/mykey
# Usage: `ssh alias`
# Alternative: `ssh -i ~/.ssh/mykey username@myserver.com`

Host deployment
    HostName github.com
    User username
    IdentityFile ~/.ssh/github_rsa
# Usage:
# git@deployment:username/anyrepo.git
# This is for cloning any repo that uses that IdentityFile. This is a good way to make sure that your remote cloning commands use the appropriate key