Turbo Repo部署VPS时多.env文件管理方案咨询
针对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

