首页 > 解决方案 > 使用 Pm2 将 .env 文件复制到多个主机

问题描述

我正在尝试使用 Pm2 的部署过程将我的 Node.js 脚本部署到多个主机。

使用单个主机运行良好,ecosystem.config.js文件如下:

require("dotenv").config({ path: `./envs/.production.env` });
  const path = require("path");

  module.exports = {
    apps: [
      {
        name: process.env.APP_NAME,
        interpreter: process.env.NODE_PATH,
        cwd: process.env.PROJECT_PATH
        script: "dist/index.js",
        instances: process.env.INSTANCES || 0,
        exec_mode: "cluster",
        env: {
          ...process.env,
        },
      },
    ],
    deploy: {
      production: {
        user: "harrison",
        host: process.env.HOST,
        key: "~/.ssh/id_rsa",
        ref: "origin/master",
        repo: process.env.GIT_REPO,
        path: process.env.PROJECT_PATH,
        // Copy keys to server
        "pre-deploy-local": `scp -Cr envs harrison@${process.env.HOST}:${process.env.PROJECT_PATH}/current`,
       // Build app and restart PM2 processes
        "post-deploy": `yarn install --ignore-engines && \
           pwd && \
           yarn prod:build && \
           yarn prod:serve`,
      },
    },
  };

为了将其部署到多个主机,PM2 文档非常简单:只需添加多个主机名。好的,很容易。在我的 .env 文件中,我使用了一系列用逗号分隔的 IP 地址,然后将它们拆分为我的配置文件中的一个数组,如下所示:

host: process.env.HOST.split(",");

然而,将我的 .env 文件复制到多个主机上并不是那么容易。

如何将此生态系统文件的“预部署本地”部分配置为scp我的.env文件到每台主机?

标签: javascriptdeploymentenvironment-variablespm2production

解决方案


最终运行了一个 bash 脚本。HOSTS的列表在我的.env.production文件里,用逗号隔开,像这样

HOSTS=123.12.134.122,134.135.134.134

要将它们传递给 Pm2 主机,请将每个逗号替换为一个空格并将它们作为参数传递给 bash 脚本。然后,在部署时执行该 bash 脚本。

我的生态系统文件现在如下所示:

// PM2 CONFIGURATION FOR PRODUCTION BUILDS
require("dotenv").config({ path: `./envs/.production.env` });
const path = require("path");

const hosts = process.env.HOSTS.replace(/,/g, " ");

module.exports = {
  apps: [
    {
      name: process.env.APP_NAME,
      args: ["--color"],
      interpreter: process.env.NODE_PATH,
      cwd: path.resolve(process.env.PROJECT_PATH, "current"), // Path holding the current version of our app (where post-deploy runs)
      script: "dist/index.js", // Location of
      instances: process.env.INSTANCES || 0,
      exec_mode: "cluster",
      env: {
        ...process.env,
      },
    },
  ],
  deploy: {
    production: {
      user: "harrison",
      host: process.env.HOSTS.split(","),
      key: "~/.ssh/id_rsa2",
      ref: "origin/master",
      repo: process.env.GIT_REPO,
      // Where to deploy on the server
      path: process.env.PROJECT_PATH,
      // Pass hosts as arguments to .env copy script
      "pre-deploy-local": `./deployEnvs.sh ${
        process.env.PROJECT_PATH
      } ${hosts}`,
      "post-deploy": `yarn install --ignore-engines && \
         yarn prod:build && \
         yarn prod:serve`,
    },
  },
};

调用的 bash 脚本deployEnvs.sh如下所示:

#!/bin/bash

PROJECT_PATH="${1}"

for HOST in "${@:2}"
do
    scp -Cr envs "harrison@${HOST}:${PROJECT_PATH}/current"
done

推荐阅读