Dotenvx 使用指南

Dotenvx 使用指南

概述

Dotenvx 是由 dotenv 原作者开发的下一代环境变量管理工具,提供了加密、多环境支持等高级功能。它是传统 dotenv 的安全升级版本,特别适合生产环境使用。

架构图

graph TB
    subgraph "开发环境"
        A[开发者] --> B[.env.local]
        A --> C[.env.development]
        B --> D[dotenvx run]
        C --> D
    end

    subgraph "配置文件"
        E[config.toml<br/>非敏感配置] --> F[配置加载器]
        G[.env<br/>敏感信息] --> F
        H[.env.production<br/>加密配置] --> F
    end

    subgraph "Dotenvx 核心"
        D --> I[环境变量解析]
        I --> J[变量扩展]
        J --> K[命令替换]
        K --> L[加密/解密]
        L --> M[应用程序]
    end

    subgraph "生产环境"
        N[CI/CD] --> O[私钥注入]
        O --> P[dotenvx run -f .env.production]
        P --> L
    end

    subgraph "安全层"
        Q[AES-256 加密] --> L
        R[椭圆曲线密码学] --> L
        S[公钥/私钥分离] --> L
    end

    subgraph "多平台支持"
        M --> T[Node.js]
        M --> U[Python]
        M --> V[Go]
        M --> W[Rust]
        M --> X[Java]
    end

    style A fill:#e1f5fe
    style M fill:#c8e6c9
    style L fill:#fff3e0
    style Q fill:#ffebee
    style R fill:#ffebee
    style S fill:#ffebee

核心特性

🔐 加密支持

  • 使用 AES-256 加密和椭圆曲线密码学 (Secp256k1)
  • 支持将加密的 .env 文件安全提交到代码仓库
  • 公钥加密,私钥解密的分离式安全模型

🌍 跨平台运行

  • 支持 Node.js、Deno、Bun、Python、PHP、Ruby、Go、Rust、Java、.NET 等
  • 统一的命令行接口,无需修改现有代码

🔄 多环境管理

  • 支持 .env.development、.env.production、.env.local 等多环境文件
  • 内置框架约定支持(如 Next.js)
  • 灵活的环境文件组合加载

⚡ 高级功能

  • 变量扩展 (Variable Expansion)
  • 命令替换 (Command Substitution)
  • 预提交和预构建钩子
  • 多文件支持

安装方式

NPM 安装

npm install @dotenvx/dotenvx --save

全局安装

npm install @dotenvx/dotenvx -g

其他包管理器

# Yarn
yarn add @dotenvx/dotenvx

# PNPM
pnpm add @dotenvx/dotenvx

# Bun
bun add @dotenvx/dotenvx

基础使用

1. 简单运行

# 创建 .env 文件
echo "HELLO=World" > .env
echo "console.log('Hello ' + process.env.HELLO)" > index.js

# 使用 dotenvx 运行
dotenvx run -- node index.js
# 输出: Hello World

2. 多环境支持

# 创建生产环境配置
echo "HELLO=production" > .env.production

# 指定环境文件运行
dotenvx run -f .env.production -- node index.js
# 输出: Hello production

3. 组合多个环境文件

# 创建本地配置
echo "HELLO=local" > .env.local

# 组合加载多个文件(优先级:local > 默认)
dotenvx run -f .env.local -f .env -- node index.js
# 输出: Hello local

4. 使用框架约定

# Next.js 约定加载
dotenvx run --convention=nextjs -- node index.js

加密功能

初始化加密

# 设置加密的环境变量
dotenvx set HELLO "production (encrypted)" -f .env.production

加密后的文件结构

.env.production

#/-------------------[DOTENV_PUBLIC_KEY]--------------------/
#/            public-key encryption for .env files          /
#/       [how it works](https://dotenvx.com/encryption)     /
#/----------------------------------------------------------/
DOTENV_PUBLIC_KEY_PRODUCTION="038759c073282f2efa6c5ffea8f66ad9cf0de7a855df8db242771f44d7472b63cb"

# .env.production
HELLO="encrypted:BGMyAFNH6UjetjWsYHUkbndQosw/barJwdynj9wXQmlucqsM2TxCAxCwXNKQfbA8axd2TCcUJaWVltrhcUZdtDo87caC7aN2G9D7m3/vQVpcCffdYeaKtlrGyGB9IHJzKOrXH3jEheKQBPLv1L6foObYREAeRzw="

.env.keys (不要提交到代码仓库)

#/------------------!DOTENV_PRIVATE_KEYS!-------------------/
#/ private decryption keys. DO NOT commit to source control /
#/     [how it works](https://dotenvx.com/encryption)       /
#/----------------------------------------------------------/

# .env.production
DOTENV_PRIVATE_KEY_PRODUCTION="bd7c50b352ce23973ec9db355d70212305a0baaade92f0165f02915b213bfbe2"

运行加密的环境

# 本地开发(使用 .env.keys)
dotenvx run -f .env.production -- node index.js

# 生产环境(使用环境变量)
DOTENV_PRIVATE_KEY_PRODUCTION="bd7c50b..." dotenvx run -- node index.js

代码集成

替换传统 dotenv

// 之前
require('dotenv').config()

// 之后
require('@dotenvx/dotenvx').config()

ES6 模块

import { config } from '@dotenvx/dotenvx'
config()

指定环境文件

require('@dotenvx/dotenvx').config({
  path: ['.env.local', '.env']
})

使用场景

1. 本地开发环境

  • 快速设置和切换开发环境
  • 支持多个开发者的个性化配置
  • 敏感信息本地加密存储

2. CI/CD 流水线

  • GitHub Actions、GitLab CI 等平台的安全环境变量处理
  • 加密的配置文件可以安全地存储在代码仓库中
  • 私钥通过 CI 平台的 secrets 管理

3. 多环境部署

  • 开发、测试、预生产、生产环境的配置管理
  • 云服务(AWS、Azure、GCP)的环境变量管理
  • Docker 容器的环境配置

4. 团队协作

  • 统一的环境配置标准
  • 敏感信息的安全共享
  • 配置变更的版本控制

5. 安全合规

  • 满足企业级安全要求
  • 减少明文密钥泄露风险
  • 符合 SOC2、ISO27001 等合规标准

6. 配置文件集成

  • 与 TOML、YAML、JSON 等配置文件结合使用
  • 分离敏感信息和应用配置
  • 支持多层配置覆盖和合并

高级功能示例

变量扩展

# .env
BASE_URL=https://api.example.com
API_ENDPOINT=${BASE_URL}/v1/users
DATABASE_URL=postgres://user:pass@localhost:5432/${DB_NAME}

命令替换

# .env
CURRENT_BRANCH=$(git branch --show-current)
BUILD_TIME=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
COMMIT_SHA=$(git rev-parse HEAD)

TOML 配置集成

Dotenvx 可以与 TOML 配置文件完美结合,实现配置分离:

// config.js - 结合 TOML 和 dotenvx
const fs = require('fs')
const toml = require('toml')
require('@dotenvx/dotenvx').config()

// 读取 TOML 基础配置
const configFile = fs.readFileSync('./config.toml', 'utf8')
const baseConfig = toml.parse(configFile)

// 合并环境变量中的敏感信息
const config = {
  ...baseConfig,
  database: {
    ...baseConfig.database,
    url: process.env.DATABASE_URL,
    password: process.env.DB_PASSWORD
  },
  auth: {
    jwtSecret: process.env.JWT_SECRET,
    apiKey: process.env.API_KEY
  }
}

module.exports = config

config.toml (非敏感配置)

[app]
name = "MyApp"
version = "1.0.0"

[server]
host = "0.0.0.0"
port = 3000

[database]
driver = "postgres"
pool_size = 10

.env (敏感配置)

DATABASE_URL=postgres://user:pass@localhost/db
DB_PASSWORD=secret123
JWT_SECRET=your_jwt_secret
API_KEY=your_api_key

预提交钩子

# 在提交前自动加密敏感变量
dotenvx precommit

最佳实践

1. 文件管理

  • ✅ 提交加密的 .env 文件到代码仓库
  • ❌ 不要提交 .env.keys 文件
  • ✅ 使用 .env.example 作为模板文件
  • ✅ 在 .gitignore 中添加 .env.keys

2. 密钥管理

  • 生产环境使用云服务的密钥管理(AWS Secrets Manager、Azure Key Vault)
  • 本地开发使用 .env.keys 文件
  • 定期轮换加密密钥
  • 使用强随机密钥生成器

3. 环境分离

  • 不同环境使用不同的加密密钥
  • 生产环境密钥严格控制访问权限
  • 开发和生产环境完全隔离

4. 监控和审计

  • 记录环境变量的访问日志
  • 监控异常的解密尝试
  • 定期审计密钥使用情况

与传统 dotenv 的对比

特性dotenvdotenvx
基础功能
加密支持
多环境有限
跨平台Node.js全平台
变量扩展需插件内置
命令替换
安全性
企业级功能

常见问题

Q: 加密文件安全吗?

A: 是的。Dotenvx 使用 AES-256 加密和椭圆曲线密码学,即使加密文件泄露,没有私钥也无法解密。

Q: 如何迁移现有项目?

A: 只需将 require('dotenv') 替换为 require('@dotenvx/dotenvx'),无需修改其他代码。

Q: 支持哪些部署平台?

A: 支持所有主流平台,包括 Heroku、Vercel、Netlify、AWS、Docker 等。

Q: 性能影响如何?

A: 解密过程非常快速,对应用启动时间影响微乎其微。

实际项目示例

Node.js + Express 项目

// app.js
require('@dotenvx/dotenvx').config()

const express = require('express')
const app = express()

const config = {
  port: process.env.PORT || 3000,
  dbUrl: process.env.DATABASE_URL,
  jwtSecret: process.env.JWT_SECRET,
  apiKey: process.env.API_KEY
}

app.listen(config.port, () => {
  console.log(`Server running on port ${config.port}`)
})

Docker 集成

# Dockerfile
FROM node:18-alpine

WORKDIR /app
COPY package*.json ./
RUN npm install

# 安装 dotenvx
RUN npm install -g @dotenvx/dotenvx

COPY . .

# 使用 dotenvx 运行应用
CMD ["dotenvx", "run", "--", "node", "app.js"]

GitHub Actions 配置

# .github/workflows/deploy.yml
name: Deploy
on:
  push:
    branches: [main]

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3

      - name: Setup Node.js
        uses: actions/setup-node@v3
        with:
          node-version: '18'

      - name: Install dependencies
        run: npm install

      - name: Install dotenvx
        run: npm install -g @dotenvx/dotenvx

      - name: Run tests
        env:
          DOTENV_PRIVATE_KEY_PRODUCTION: ${{ secrets.DOTENV_PRIVATE_KEY_PRODUCTION }}
        run: dotenvx run -f .env.production -- npm test

      - name: Deploy
        env:
          DOTENV_PRIVATE_KEY_PRODUCTION: ${{ secrets.DOTENV_PRIVATE_KEY_PRODUCTION }}
        run: dotenvx run -f .env.production -- npm run deploy

Java Spring Boot 集成

// Application.java
@SpringBootApplication
public class Application {
    static {
        // 在应用启动前加载 dotenvx
        try {
            ProcessBuilder pb = new ProcessBuilder("dotenvx", "run", "--", "echo", "loaded");
            pb.inheritIO();
            Process process = pb.start();
            process.waitFor();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

Python Django 项目

# settings.py
import os
import subprocess

# 使用 dotenvx 加载环境变量
try:
    subprocess.run(['dotenvx', 'run', '--', 'python', '-c', 'print("Environment loaded")'],
                   check=True, capture_output=True)
except subprocess.CalledProcessError:
    print("Warning: dotenvx not found, using default environment")

# Django 配置
SECRET_KEY = os.environ.get('SECRET_KEY')
DATABASE_URL = os.environ.get('DATABASE_URL')
DEBUG = os.environ.get('DEBUG', 'False').lower() == 'true'

企业级部署方案

AWS 部署

# 在 AWS EC2 或 ECS 中设置环境变量
export DOTENV_PRIVATE_KEY_PRODUCTION="your-private-key"

# 使用 AWS Systems Manager Parameter Store
aws ssm put-parameter \
  --name "/myapp/dotenv-private-key" \
  --value "your-private-key" \
  --type "SecureString"

# 在启动脚本中获取密钥
DOTENV_PRIVATE_KEY_PRODUCTION=$(aws ssm get-parameter \
  --name "/myapp/dotenv-private-key" \
  --with-decryption \
  --query "Parameter.Value" \
  --output text)

dotenvx run -f .env.production -- node app.js

Kubernetes 部署

# k8s-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp
        image: myapp:latest
        command: ["dotenvx", "run", "--", "node", "app.js"]
        env:
        - name: DOTENV_PRIVATE_KEY_PRODUCTION
          valueFrom:
            secretKeyRef:
              name: dotenv-secrets
              key: private-key
---
apiVersion: v1
kind: Secret
metadata:
  name: dotenv-secrets
type: Opaque
data:
  private-key: <base64-encoded-private-key>

总结

Dotenvx 是现代应用程序环境变量管理的最佳选择,特别适合:

  • 需要高安全性的生产环境
  • 多环境部署的复杂项目
  • 团队协作的大型项目
  • 有合规要求的企业应用

通过其强大的加密功能和灵活的多环境支持,Dotenvx 为开发者提供了一个安全、易用、功能丰富的环境变量管理解决方案。