javascript - 使用 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
文件到每台主机?
解决方案
最终运行了一个 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
推荐阅读
- excel - 使用 Excel 用户表单搜索 Access 数据库并使用 VBA 在列表框中显示结果
- python - 如何为自制模块设置 python 路径?
- r - 有没有办法 dplyr (tidyverse) 映射我的数据集,找到以相同后缀结尾的列然后只保留一个?
- c# - C# Windows.Forms.Timer 以错误的顺序工作
- jquery - 带有添加和删除 CSS 的切换按钮
- python - FormView中Django模型的clean方法和外键验证
- sql - 通过 Oracle SQL 中的重叠日期选择对数据进行分组
- mysql - 有什么方法可以在 MySQL 中列出或证明 Check 约束(例如可以使用主键和外键)?
- android - 安卓语言
- php - “$public_key”保存在哪里?