# PM2 部署配置

URL: https://caijiao.org/pm2/deployment/deploy-config
Source: docs/pm2/deployment/deploy-config.md
Description: 学习如何配置 PM2 部署设置，掌握如何管理部署环境、部署步骤和自动化流程，确保 Node.js 应用在生产环境中的高效、稳定部署。

PM2 不仅仅是一个进程管理工具，它还为 Node.js 应用提供了完整的部署配置选项，帮助开发者自动化部署、管理环境变量以及优化生产环境的配置。通过配置 `ecosystem.config.js` 文件，开发者可以轻松地管理部署流程、执行自动化操作并确保应用的高可用性。

## 1. **`ecosystem.config.js` 配置文件**

`ecosystem.config.js` 文件是 PM2 用来管理应用部署和进程配置的核心文件。它包含了应用的启动脚本、环境变量、部署设置等信息。该文件使得部署和管理多个环境变得更加简便。

### 基本结构

```javascript
module.exports = {
  apps: [
    {
      name: 'my-app',            // 应用名称
      script: './app.js',        // 启动脚本
      instances: 1,              // 启动实例数，适用于单机模式
      exec_mode: 'cluster',      // 使用集群模式（支持负载均衡）
      env: {
        NODE_ENV: 'development', // 开发环境变量
      },
      env_production: {
        NODE_ENV: 'production',  // 生产环境变量
      },
      watch: true,               // 监控文件变动，自动重启应用
      autorestart: true,         // 启用应用崩溃自动重启
      max_memory_restart: '200M', // 当应用使用内存超过 200MB 时自动重启
    },
  ],
};
````

### 配置说明

* **name**：应用的名称。
* **script**：启动应用的文件路径。
* **instances**：指定应用的实例数，适用于多核 CPU 环境。
* **exec_mode**：指定应用的执行模式，`cluster` 模式适用于负载均衡，`fork` 模式适用于单实例。
* **env**：开发环境的环境变量。
* **env_production**：生产环境的环境变量，应用启动时根据环境变量切换。
* **watch**：启用文件监控，文件变动时自动重启应用。
* **autorestart**：启用应用崩溃自动重启功能。
* **max_memory_restart**：内存使用超过指定值时，自动重启应用。

## 2. **配置部署设置**

在 `ecosystem.config.js` 中，PM2 也支持应用的部署配置。你可以通过配置 `deploy` 部分来管理应用的自动化部署过程，包括代码拉取、依赖安装和应用重启。

### 部署配置示例

```javascript
module.exports = {
  apps: [
    {
      name: 'my-app',
      script: './app.js',
      env_production: {
        NODE_ENV: 'production',
      },
    },
  ],
  deploy: {
    production: {
      user: 'deploy',               // 部署服务器的用户名
      host: ['your-server.com'],    // 目标服务器的 IP 地址或域名
      ref: 'origin/master',         // Git 仓库的分支
      repo: 'git@github.com:yourusername/your-repo.git', // Git 仓库的地址
      path: '/var/www/my-app',      // 应用在服务器上的目标路径
      'pre-deploy': 'echo "Preparing for deployment..."', // 部署前执行的脚本
      'post-deploy': 'npm install && pm2 reload ecosystem.config.js --env production', // 部署后执行的脚本
    },
  },
};
```

### 配置说明

* **user**：指定在服务器上的用户（通常是 `deploy` 用户）。
* **host**：列出目标服务器的 IP 地址或域名。
* **ref**：指定 Git 分支，通常为 `origin/master`。
* **repo**：Git 仓库的地址，PM2 会从这个仓库拉取代码。
* **path**：应用部署到目标服务器上的路径。
* **pre-deploy**：部署前需要执行的命令或脚本，可以用于初始化环境。
* **post-deploy**：部署后执行的命令，通常用于安装依赖和重启应用。

## 3. **自动化部署流程**

通过配置 `deploy` 部分，PM2 使得自动化部署变得简单。你可以使用以下命令来执行不同的部署步骤：

### 部署命令

1. **初始化部署环境**：

   ```bash
   pm2 deploy ecosystem.config.js production setup
   ```

   该命令会在服务器上设置部署环境，克隆 Git 仓库到指定路径，并创建所需的目录结构。

2. **更新应用代码**：

   ```bash
   pm2 deploy ecosystem.config.js production update
   ```

   该命令会拉取最新的代码更新并同步到目标服务器。

3. **重启应用**：

   ```bash
   pm2 deploy ecosystem.config.js production restart
   ```

   该命令会在应用代码更新后重启应用，确保新的代码生效。

### 完整部署流程

1. 使用 `setup` 命令初始化服务器环境。
2. 使用 `update` 命令拉取最新代码并安装依赖。
3. 使用 `restart` 命令重启应用，确保应用使用最新的代码。

## 4. **配置服务器环境变量**

在生产环境中，除了配置 `NODE_ENV` 之外，你可能还需要设置其他环境变量，如数据库连接信息、API 密钥等。可以在 `ecosystem.config.js` 文件中配置不同环境下的环境变量。

### 示例：生产环境环境变量配置

```javascript
module.exports = {
  apps: [
    {
      name: 'my-app',
      script: './app.js',
      env_production: {
        NODE_ENV: 'production',
        DB_HOST: 'your-database-host',
        DB_USER: 'your-database-user',
        DB_PASSWORD: 'your-database-password',
      },
    },
  ],
};
```

在这个配置中，我们为生产环境添加了 `DB_HOST`、`DB_USER` 和 `DB_PASSWORD` 等环境变量，这些变量可以在应用中被访问并用于数据库连接。

## 5. **总结**

PM2 的部署配置功能提供了强大的支持，能够帮助开发者轻松管理多个环境和部署流程。通过合理配置 `ecosystem.config.js` 文件，开发者可以在生产环境中管理环境变量、自动化部署、安装依赖和重启应用。PM2 还支持与 Git 集成，自动化拉取代码更新，并通过简单的命令实现完整的部署流程，极大简化了 Node.js 应用的部署和管理。
