# PM2 应用部署

URL: https://caijiao.org/pm2/deployment/app-deployment
Source: docs/pm2/deployment/app-deployment.md
Description: 了解如何使用 PM2 进行 Node.js 应用的部署，掌握常见的部署方式、配置管理和自动化部署流程，确保应用能够在生产环境中高效、稳定地运行。

PM2 是一个强大的进程管理工具，它不仅可以帮助你在生产环境中管理 Node.js 应用，还提供了丰富的应用部署功能。通过 PM2，开发者可以轻松地将应用部署到不同的服务器环境中，并实现自动化部署流程，确保应用能够稳定运行。

## 1. **准备部署环境**

在进行 PM2 应用部署之前，确保目标服务器上已经安装了 Node.js 和 PM2。你可以使用以下命令安装 PM2：

```bash
npm install pm2 -g
````

### 安装 Node.js 和 PM2

* **Node.js**：你可以通过 [Node.js 官网](https://nodejs.org/) 获取适合的版本，或者使用 `nvm`（Node Version Manager）进行安装。
* **PM2**：通过 `npm` 安装 PM2：

  ```bash
  npm install pm2 -g
  ```

## 2. **配置部署文件**

PM2 提供了一个叫做 `ecosystem.config.js` 的配置文件，用于定义应用的部署配置。该文件允许你在多个环境中轻松管理应用的部署，包括生产环境和开发环境。

### 示例配置

```javascript
module.exports = {
  apps: [
    {
      name: 'my-app',
      script: './app.js',
      env: {
        NODE_ENV: 'development',   // 开发环境配置
      },
      env_production: {
        NODE_ENV: 'production',    // 生产环境配置
      },
    },
  ],
};
```

在这个配置文件中，我们为 `my-app` 定义了两个环境配置：

* `env`：用于开发环境。
* `env_production`：用于生产环境。

## 3. **PM2 部署命令**

PM2 支持通过命令行进行应用的部署。你可以通过 `pm2 deploy` 命令来执行自动化部署。这使得你可以将应用从开发环境部署到生产环境，并自动同步代码、安装依赖并启动应用。

### 部署命令格式

```bash
pm2 deploy ecosystem.config.js <environment> setup
pm2 deploy ecosystem.config.js <environment> update
pm2 deploy ecosystem.config.js <environment> restart
```

* **setup**：初始化部署环境并同步代码。
* **update**：更新应用代码并安装依赖。
* **restart**：重启应用。

### 示例：部署到生产环境

1. 初始化生产环境部署：

   ```bash
   pm2 deploy ecosystem.config.js production setup
   ```

2. 更新生产环境应用：

   ```bash
   pm2 deploy ecosystem.config.js production update
   ```

3. 重启生产环境应用：

   ```bash
   pm2 deploy ecosystem.config.js production restart
   ```

## 4. **自动化部署流程**

PM2 支持与 Git 集成进行自动化部署。通过 Git 仓库和 `pm2 deploy`，你可以在推送代码更新时自动触发部署操作，实现持续部署。

### 设置 Git 仓库

在 `ecosystem.config.js` 文件中，配置你的 Git 仓库和部署脚本：

```javascript
module.exports = {
  apps: [
    {
      name: 'my-app',
      script: './app.js',
      env_production: {
        NODE_ENV: 'production',
      },
    },
  ],
  deploy: {
    production: {
      user: 'deploy',
      host: ['your-server.com'],
      ref: 'origin/master',   // 指定 Git 仓库的分支
      repo: 'git@github.com:yourusername/your-repo.git',
      path: '/var/www/my-app', // 服务器上应用的路径
      'post-deploy': 'npm install && pm2 reload ecosystem.config.js --env production', // 部署后自动安装依赖并重启应用
    },
  },
};
```

### 执行部署

每当你推送代码到 Git 仓库的 `master` 分支时，可以执行以下命令自动部署到生产环境：

```bash
pm2 deploy ecosystem.config.js production
```

### 部署后的操作

* **安装依赖**：在部署完成后，PM2 会自动执行 `post-deploy` 指定的命令，在服务器上安装依赖。
* **重启应用**：安装依赖后，PM2 会重启应用，确保代码更新生效。

## 5. **PM2 部署的优势**

* **自动化部署**：PM2 结合 Git 和部署脚本，可以自动化处理代码推送、依赖安装和应用重启的工作。
* **灵活的环境配置**：支持不同环境的配置（开发、生产等），可以根据不同需求调整环境变量和参数。
* **持续部署支持**：通过 `pm2 deploy` 和 Git 集成，PM2 支持持续集成和持续部署流程（CI/CD）。
* **高可用性**：PM2 支持应用的自动重启，确保应用崩溃后能迅速恢复。

## 6. **总结**

PM2 的应用部署功能使得 Node.js 应用的部署和管理变得更加简便。通过配置 `ecosystem.config.js` 文件，你可以轻松地在开发环境和生产环境之间切换，并通过自动化部署脚本确保应用能够顺利部署到服务器。结合 Git 仓库和持续部署流程，PM2 提供了一套高效、稳定的部署解决方案。

无论是在单台服务器上部署，还是在多个服务器间进行分布式部署，PM2 都能帮助你高效管理应用的生命周期，确保生产环境中的应用始终保持在线。
