You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Turbo Repo部署VPS时多.env文件管理方案咨询

Turbo Repo多环境变量部署到VPS的管理方案

针对Turbo Repo下多子项目独立.env的部署场景,推荐以下几种实用方案:

1. 集中式根目录.env + 变量前缀区分

在项目根目录维护一个统一的.env.production文件,给每个子项目的环境变量加上专属前缀,比如:

# 根目录.env.production
# Next.js应用1
NEXT_APP1_PUBLIC_API_URL=https://api.example.com
NEXT_APP1_DB_URL=postgresql://user:pass@localhost:5432/app1_db

# Next.js应用2
NEXT_APP2_PUBLIC_APP_URL=https://app2.example.com
NEXT_APP2_API_KEY=abc123

# Express应用
EXPRESS_PORT=3001
EXPRESS_JWT_SECRET=secretkey

# 数据库包
DB_PACKAGE_DEFAULT_CONNECTION=mongodb://localhost:27017

然后在每个子项目的package.json脚本中,通过dotenv加载根目录的.env文件:

  • Next.js项目脚本示例:
    {
      "scripts": {
        "build": "dotenv -e ../../.env.production -- next build",
        "start": "dotenv -e ../../.env.production -- next start"
      }
    }
    
  • Express项目脚本示例:
    {
      "scripts": {
        "start": "dotenv -e ../../.env.production -- node server.js"
      }
    }
    

子项目代码中直接读取带前缀的变量即可,比如Next.js中用process.env.NEXT_APP1_PUBLIC_API_URL,Express中用process.env.EXPRESS_PORT。如果是Next.js的客户端变量,记得把前缀改成NEXT_PUBLIC_(比如NEXT_PUBLIC_APP1_API_URL)。

2. 自动化部署脚本复制对应.env

本地保留每个子项目的.env.production文件,编写一个简单的bash脚本(或Node.js脚本),在部署时自动将各子项目的.env文件同步到VPS的对应目录。

示例bash脚本deploy-env.sh:

#!/bin/bash
VPS_USER="your-vps-user"
VPS_HOST="your-vps-ip"
PROJECT_PATH="/path/to/turbo-repo/on/vps"

# 复制Next.js应用1的.env
scp apps/app1/.env.production $VPS_USER@$VPS_HOST:$PROJECT_PATH/apps/app1/.env

# 复制Next.js应用2的.env
scp apps/app2/.env.production $VPS_USER@$VPS_HOST:$PROJECT_PATH/apps/app2/.env

# 复制Express应用的.env
scp apps/express/.env.production $VPS_USER@$VPS_HOST:$PROJECT_PATH/apps/express/.env

# 复制数据库包的.env(如果需要)
scp packages/db/.env.production $VPS_USER@$VPS_HOST:$PROJECT_PATH/packages/db/.env

给脚本添加执行权限:chmod +x deploy-env.sh,每次部署前运行该脚本即可同步所有.env文件。也可以结合Git的post-push钩子,或者CI/CD工具自动触发这个脚本。

3. VPS全局/服务级环境变量配置

直接在VPS上为每个子项目配置环境变量,避免传递.env文件,提升安全性:

针对Next.js应用

启动Next.js时直接在命令前注入环境变量:

# 启动应用1
NEXT_APP1_PUBLIC_API_URL=https://api.example.com NEXT_APP1_DB_URL=postgresql://user:pass@localhost:5432/app1_db node apps/app1/.next/standalone/server.js

# 启动应用2
NEXT_APP2_PUBLIC_APP_URL=https://app2.example.com NEXT_APP2_API_KEY=abc123 node apps/app2/.next/standalone/server.js

针对Express应用

如果用systemd管理Express服务,在服务配置文件(比如/etc/systemd/system/express-app.service)中添加环境变量:

[Unit]
Description=Express App

[Service]
User=your-user
WorkingDirectory=/path/to/turbo-repo/apps/express
Environment="EXPRESS_PORT=3001"
Environment="EXPRESS_JWT_SECRET=secretkey"
ExecStart=node server.js
Restart=always

[Install]
WantedBy=multi-user.target

重新加载systemd并启动服务:

sudo systemctl daemon-reload
sudo systemctl start express-app

数据库包

数据库包的环境变量可以由调用它的项目传递(比如Express或Next.js在启动时注入),或者同样在VPS全局配置对应的变量。

4. 利用Turbo Repo内置环境变量传递

Turbo Repo支持在turbo.json中配置全局或任务级环境变量传递:

在turbo.json中指定需要传递给子项目的变量:

{
  "globalEnv": ["NODE_ENV"],
  "pipeline": {
    "build": {
      "dependsOn": ["^build"],
      "env": ["NEXT_APP1_*", "NEXT_APP2_*", "EXPRESS_*", "DB_PACKAGE_*"]
    },
    "start": {
      "env": ["NEXT_APP1_*", "NEXT_APP2_*", "EXPRESS_*", "DB_PACKAGE_*"]
    }
  }
}

然后在根目录的.env.production中定义这些变量,Turbo会自动将匹配前缀的变量传递给对应的子项目,子项目代码直接读取即可。


内容的提问来源于stack exchange,提问作者Jashandeep Singh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 19:23:20