Skip to content

agentarts launch 缺少 --env / --env-file 和环境变量替换支持,导致密钥泄漏风险 #18

Description

@git-malu

问题描述

agentarts dev 命令支持 --env KEY=VALUE 来注入运行时环境变量,可以在不修改 .agentarts_config.yaml 的情况下传递 API key 等敏感信息。但 agentarts launch(cloud deploy)没有这个能力。

当前行为

agentarts launch 只从 .agentarts_config.yamlenvironment_variables 段读取环境变量值:

# .agentarts_config.yaml(必须提交到 git)
environment_variables:
  - key: DEEPSEEK_API_KEY
    value: sk-xxxxxxxxxxxxxxxxxxxxxx   # ← API key 硬编码在文件中
  - key: MODEL_API_KEY
    value: sk-xxxxxxxxxxxxxxxxxxxxxx   # ← 硬编码,会被提交

后果:如果用户需要 cloud deploy,就必须把真实的 API key 写在 .agentarts_config.yaml 文件中。而这个文件包含部署基础设施配置(region、SWR、runtime、tags 等),必须提交到 git。这导致 API key 必然泄漏到版本控制中。

已有经验

agentarts dev 已经解决了这个问题:

agentarts dev --env DEEPSEEK_API_KEY=sk-xxx --env MODEL_API_KEY=sk-xxx

用户可以在命令行或 CI/CD pipeline 中注入敏感值,无需触碰配置文件。这是正确的设计,但 launch 没有继承。

期望行为

agentarts launch 应支持以下能力(按优先级排列):

P0: 环境变量 ${VAR} 替换

在 YAML 解析后,对 environment_variables.value 进行 ${VAR_NAME} 替换(从 os.environ 取值):

# .agentarts_config.yaml(安全提交到 git,无密钥)
environment_variables:
  - key: DEEPSEEK_API_KEY
    value: ${DEEPSEEK_API_KEY}
  - key: MODEL_API_KEY
    value: ${MODEL_API_KEY}

部署时:

export DEEPSEEK_API_KEY=sk-xxx
export MODEL_API_KEY=sk-xxx
agentarts launch   # CLI 自动将 ${DEEPSEEK_API_KEY} 解析为实际值

这是对用户体验影响最小、实施成本最低的方案。与 Docker Compose 的 variable_substitution 机制完全一致,开发者无需学习新概念。

P1: --env-file 标志

agentarts launch --env-file .env.deploy

P1: --env KEY=VALUE 标志(与 dev 一致)

agentarts launch --env DEEPSEEK_API_KEY=sk-xxx --env MODEL_API_KEY=sk-xxx

优先级规则

--env > 系统环境变量 > --env-file > ${VAR:-default} 默认值

附加要求

  • 解析后的值不应写回 .agentarts_config.yaml 文件
  • 日志输出中应对密钥值进行脱敏(如 DEEPSEEK_API_KEY=****
  • 未解析的必需环境变量应硬失败(不应以字面量 ${VAR} 部署)

为什么重要

  • 安全:API key 等敏感信息不应写入版本控制(OWASP、12-Factor App 基础要求)
  • 一致性dev 已有 --envlaunch 缺少是功能不对称
  • 行业标准:Docker Compose、Kubernetes Helm、Terraform 等所有主流部署工具都支持 ${VAR} 替换
  • GitOps 兼容:允许 .agentarts_config.yaml 作为纯声明式部署清单安全地通过 git 管理

参考资料

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions