Skip to content

环境变量

OneStep 用环境变量把部署环境相关的配置注入进程:运行目标、实例身份、Control Plane 连接信息、服务端参数以及第三方 SDK 凭据。本页按子系统汇总全部变量、默认值与用途,作为部署和排障时的单一参考。

页面范围:

环境变量的来源与优先级

一次 onestep runonestep check 看到的变量,可能来自下面三个来源,优先级从高到低:

  1. 进程环境:systemd 的 EnvironmentFiledocker run -edocker composeenvironment、shell 里的 export
  2. .env 文件(仅 YAML 目标):解析顺序为 --env-file 命令行参数 → YAML 中的 app.env_file → 与 YAML 同目录的 .env(自动探测,不存在则跳过)。
  3. YAML 内的 ${VAR} 展开:配置值中的变量引用在加载时替换。

.env 使用 setdefault 语义写入进程环境,已存在的进程环境变量优先,文件里的同名键会被忽略。加载数量会写入 onestep logger 的 DEBUG 日志。

变量展开语法

YAML 中所有字符串值都会做变量展开,支持三种写法:

写法含义
${VAR}读取 VAR,未设置时替换为空字符串
${VAR:-default}读取 VAR,未设置时使用 default
${VAR:default}同上,单冒号写法

两点容易踩坑的行为:

  • 纯引用会保留类型:当整个字符串就是一个 ${VAR} 时,展开结果会按 JSON 字面量解码,"30" 会变成整数 30"true" 会变成布尔值。prefix-${VAR} 这类混合字符串始终是字符串。
  • 不做隐式类型猜测yes0123、ISO 日期这类值不会因为像 YAML 标量而被转换,仍按 JSON 规则保持字符串。

严格模式

默认情况下,缺少的变量会展开成空字符串,问题往往到运行期才暴露。需要提前失败时启用严格检查:

bash
onestep check --strict-env worker.yaml
onestep run worker.yaml --strict-env

也可以固化在 YAML 里,让 checkrunrenderbuild 一致生效:

yaml
app:
  name: billing-sync
  env_file: .env          # 可选,指定变量文件
  strict_env: true        # 可选,缺变量直接报错

strict_env 只检查没有默认值${VAR} 引用,并列出变量名和引用位置;带 ${VAR:-default} 的引用不会报错。相关命令行为见 YAML 任务定义

核心运行时

变量默认值说明
TZ系统本地时区CronSource / IntervalSource 未显式配置时区时的回退值。容器和 systemd 部署建议显式设置,避免宿主机时区漂移导致调度时间偏移
PYTHONPATHPython 模块搜索路径。systemd 模板与 worker 镜像会自动追加应用目录,无需手工维护

运行时没有 ONESTEP_LOG_LEVEL 之类的变量:日志级别来自 --log-level 命令行参数、YAML 的 app.logging.level 或代码中的 logging 配置,详见 日志与任务事件。指标端点同理,由 --metrics-addr 开启,见 指标与健康检查

systemd 部署模板

deploy/systemd/onestep-app.servicedeploy/bin/onestep-preflight.sh 读取以下变量,配置写在 /etc/onestep/onestep-app.env(从 deploy/env/onestep-app.env.example 复制):

变量默认值说明
APP_CWD无(必填)应用工作目录。preflight 会把它前置到 PYTHONPATHExecStart 也在这里启动
APP_TARGET无(必填)onestep 的 target,如 your_package.tasks:appworker.yaml
ONESTEP_BIN无(必填)onestep 可执行文件路径,通常是 /srv/onestep-app/.venv/bin/onestep;不存在时会回退到 PATH 中查找

模板另外在 unit 里固定了 PYTHONUNBUFFERED=1,保证 stdout 日志实时进入 journald。ExecStartPre 先执行 onestep check "$APP_TARGET",校验失败则服务不启动。完整安装步骤见 生产部署

Worker Runtime Image

官方镜像 ghcr.io/mic1on/onestep-worker 的入口脚本读取:

变量默认值说明
ONESTEP_TARGET无(必填)YAML 文件路径或 Python import target;缺失时容器直接退出并提示 ONESTEP_TARGET is required
WORKSPACE_DIR/workspace工作区路径。入口脚本把它和它的 src/ 加入 PYTHONPATH,并在其中查找 requirements.txt / pyproject.toml 安装依赖

启动顺序为:解析 ONESTEP_TARGET → 安装工作区依赖 → onestep checkonestep run。两种运行方式见 Worker Runtime Image

Control Plane Reporter

onestep-control-plane reporter 通过 ControlPlaneReporterConfig.from_env() 读取以下变量。base_urltoken 缺失时启动即失败,其余都有默认值。

连接与服务标识

变量默认值说明
ONESTEP_CONTROL_PLANE_URL无(必填)Control Plane 基地址。接受 http://https://ws://wss://;默认 sender 会据此推导 WebSocket 端点(httpwshttpswss,路径后缀 /api/v1/agents/ws)。别名:ONESTEP_CONTROL_URL
ONESTEP_CONTROL_PLANE_TOKEN无(必填)上报鉴权 Token,对应服务端的 ONESTEP_CP_INGEST_TOKENS。别名:ONESTEP_CONTROL_TOKEN
ONESTEP_CONTROL_PLANE_ENVIRONMENTdev部署环境标签,只接受 devstagingprod。别名:ONESTEP_ENV
ONESTEP_SERVICE_NAME应用 app.name服务名,(service_name, environment) 唯一确定一个服务
ONESTEP_SERVICE_DESCRIPTION服务级描述,展示在控制面服务目录;与 tasks[].description 相互独立
ONESTEP_NODE_NAME节点名,多机部署时用于区分实例所在机器
ONESTEP_DEPLOYMENT_VERSION部署版本,展示在实例详情。别名:ONESTEP_VERSION

上报节奏与缓冲

变量默认值说明
ONESTEP_CONTROL_PLANE_HEARTBEAT_INTERVAL_S30.0心跳间隔(秒)
ONESTEP_CONTROL_PLANE_METRICS_INTERVAL_S30.0指标批次上报间隔(秒)
ONESTEP_CONTROL_PLANE_EVENT_FLUSH_INTERVAL_S5.0任务事件批量刷写间隔(秒)
ONESTEP_CONTROL_PLANE_EVENT_BATCH_SIZE100单个事件批次的最大条数
ONESTEP_CONTROL_PLANE_MAX_PENDING_EVENTS1000断线期间本地缓存的事件上限,超出后按策略丢弃最旧数据
ONESTEP_CONTROL_PLANE_MAX_PENDING_METRIC_BATCHES120断线期间本地缓存的指标批次数上限
ONESTEP_CONTROL_PLANE_TIMEOUT_S5.0单次 HTTP 请求超时(秒)
ONESTEP_CONTROL_PLANE_RECONNECT_BASE_DELAY_S0.5重连初始退避(秒)
ONESTEP_CONTROL_PLANE_RECONNECT_MAX_DELAY_S30.0重连退避上限(秒),必须 ≥ 初始退避
ONESTEP_CONTROL_PLANE_SHUTDOWN_FLUSH_TIMEOUT_S0.5关闭前等待未发送数据刷写的时长(秒),可为 0

实例身份变量

instance_id 由三个变量决定,解析顺序见 实例身份

变量默认值说明
ONESTEP_INSTANCE_ID显式指定 UUID,优先级最高
ONESTEP_REPLICA_KEY副本槽位名,如 worker-0;按 service_name + environment + replica_key 生成确定性 UUIDv5
ONESTEP_STATE_DIR~/.onestep/control-plane-state/<environment>/<service_name>本地身份状态目录,保存 identity.json 与序列号

示例:

bash
export ONESTEP_CONTROL_PLANE_URL=https://control-plane.example.com
export ONESTEP_CONTROL_PLANE_TOKEN=replace-me
export ONESTEP_CONTROL_PLANE_ENVIRONMENT=prod
export ONESTEP_SERVICE_NAME=billing-sync
export ONESTEP_REPLICA_KEY=worker-0

YAML 也可以直接写死部分字段(reporter: true 仍从环境变量解析连接信息):

yaml
reporter:
  base_url: https://control-plane.example.com
  token: ${ONESTEP_CONTROL_PLANE_TOKEN}
  service_name: billing-sync-worker
  service_description: Synchronizes billing data into the warehouse

更多接线方式见 Control Plane稳定实例身份

实例身份

ControlPlaneReporterConfig.from_env() 按固定顺序解析实例身份,三个来源只需要命中一个:

  1. ONESTEP_INSTANCE_ID —— 显式 UUID,永远优先。
  2. ONESTEP_REPLICA_KEY —— 由 service_name + environment + replica_key 派生 UUIDv5,同一个 key 永远映射到同一个实例。
  3. ONESTEP_STATE_DIR 下的 identity.json —— 首次启动生成并落盘,重启后复用,heartbeat_sequence / sync_sequence 也从此文件继续累加。

选型建议:

场景推荐做法
单机单进程(systemd、长期运行 VM)持久化 ONESTEP_STATE_DIR,例如 /var/lib/onestep/billing-sync
多副本、Kubernetes StatefulSet设置 ONESTEP_REPLICA_KEY(可用 $(HOSTNAME) 之类的稳定槽位名)
手工调试临时设置 ONESTEP_INSTANCE_ID,注意不要给多个活进程发同一个 UUID

注意:同一时刻两个活进程不能共用同一个状态目录,否则启动时会因身份锁直接失败。完整说明见 稳定实例身份

Control Plane 服务端

Control Plane 服务端(apps/control-plane)通过 pydantic-settings 读取 ONESTEP_CP_ 前缀的变量,字段名大写即为变量名;同时会读取当前目录的 .env。变量含义与默认值:

基础与数据库

变量默认值说明
ONESTEP_CP_APP_ENVdev(Compose 默认传入 docker运行环境标签。影响登录 Cookie 的 Secure 标记(prod 才带)与开发模式回退逻辑
ONESTEP_CP_DEBUGfalse调试开关,透传给 FastAPI 应用
ONESTEP_CP_DATABASE_URLpostgresql+psycopg://postgres:postgres@localhost:5432/onestep_control_planeSQLAlchemy DSN;留空回退到该默认值。桌面版使用 SQLite
ONESTEP_CP_HOST127.0.0.1(桌面入口)/ 0.0.0.0start-local.sh监听地址。由桌面入口与本地脚本读取,不属于后端 Settings
ONESTEP_CP_PORT4173监听端口。同上
ONESTEP_CP_LOG_LEVELinfouvicorn 日志级别。同上
ONESTEP_CP_WORKER_PACKAGE_STORAGE_DIR.onestep-control-plane/packages接收到的 worker 包存放目录
ONESTEP_CP_UI_DIST_DIRfrontend/dist(本地)/ /app/frontend/dist(Docker)前端静态资源目录
ONESTEP_CP_UI_API_BASE_URL/打包镜像经 /app-config.js 下发的前端 API 基路径;pnpm dev 不使用

鉴权与令牌

变量默认值说明
ONESTEP_CP_INGEST_TOKENS遥测上报与 Agent WS 接入的 Bearer Token,支持单个、逗号分隔或 JSON 数组;为空时接入端点返回 503,必须先配置才能接收上报
ONESTEP_CP_WORKER_AGENT_REGISTRATION_TOKENSWorker Agent 注册 Token,同样支持逗号分隔或 JSON 数组;为空时注册接口返回 503
ONESTEP_CP_CONNECTOR_SECRET用于派生 Connector 密钥加密密钥的普通字符串;使用 Connectors 功能时必须设置,且需跨重启、跨副本保持一致
bash
export ONESTEP_CP_INGEST_TOKENS='dev-token'
export ONESTEP_CP_INGEST_TOKENS='token-a,token-b'
export ONESTEP_CP_INGEST_TOKENS='["token-a","token-b"]'

Console 认证与安全

变量默认值说明
ONESTEP_CP_CONSOLE_AUTH_USERNAME控制台共享用户名,必须与密码同时设置,只设一个会启动失败
ONESTEP_CP_CONSOLE_AUTH_PASSWORD控制台共享密码
ONESTEP_CP_CONSOLE_AUTH_SESSION_TTL_S604800登录会话有效期(秒),默认 7 天
ONESTEP_CP_CONSOLE_SENSITIVE_AUTH_WINDOW_S900危险命令要求「近期重新认证」的时间窗口(秒)
ONESTEP_CP_CONSOLE_LOGIN_MAX_FAILURES5触发锁定前的失败登录次数
ONESTEP_CP_CONSOLE_LOGIN_FAILURE_WINDOW_S900失败计数的时间窗口(秒)
ONESTEP_CP_CONSOLE_LOGIN_LOCKOUT_S900锁定持续时间(秒)
ONESTEP_CP_CORS_ALLOW_ORIGINS允许的浏览器来源,支持逗号分隔或 JSON 数组;默认不允许跨域
ONESTEP_CP_CONSOLE_BASE_URL控制台公开地址,设置后 webhook 通知渲染绝对链接

通知与保留策略

变量默认值说明
ONESTEP_CP_NOTIFICATION_OUTBOX_MAX_ATTEMPTS5webhook 投递最大尝试次数,超过后标记永久失败
ONESTEP_CP_NOTIFICATION_OUTBOX_BATCH_SIZE50单次 outbox drain 处理的最大请求数
ONESTEP_CP_NOTIFICATION_OUTBOX_DRAIN_INTERVAL_S2.0outbox drain 间隔(秒)
ONESTEP_CP_NOTIFICATION_OUTBOX_BACKOFF_BASE_S2.0失败后的初始重试退避(秒)
ONESTEP_CP_NOTIFICATION_OUTBOX_BACKOFF_MAX_S300.0指数退避上限(秒)
ONESTEP_CP_NOTIFICATION_DELIVERY_TIMEOUT_S5.0单次 webhook 投递超时(秒)
ONESTEP_CP_NOTIFICATION_MISSED_START_SCAN_INTERVAL_S60计划任务遗漏扫描间隔(秒)
ONESTEP_CP_RETENTION_TASK_EVENTS_DAYS30task_events 保留天数
ONESTEP_CP_RETENTION_TASK_METRIC_WINDOWS_DAYS90task_metric_windows 保留天数
ONESTEP_CP_RETENTION_AGENT_COMMANDS_DAYS30终态 agent_commands 保留天数,未完成命令不删除
ONESTEP_CP_RETENTION_DELETE_BATCH_SIZE1000单批删除行数上限
ONESTEP_CP_RETENTION_RUN_INTERVAL_S86400自动清理执行间隔(秒),默认每天一次

在线状态、指标与响应格式

变量默认值说明
ONESTEP_CP_INSTANCE_OFFLINE_AFTER_S90last_seen_at 超过该时长即判定实例离线(秒)
ONESTEP_CP_INSTANCE_HEALTH_PARTICIPATION_WINDOW_S3600实例计入服务健康度分母的时间窗口(秒),必须 ≥ 离线阈值
ONESTEP_CP_PROMETHEUS_CACHE_TTL_S15.0/metrics 响应进程内缓存时长(秒),0 表示关闭缓存
ONESTEP_CP_API_RESPONSE_TIMEZONE空(回退 TZ,再回退 UTC查询 API 时间字段的输出时区
ONESTEP_CP_BACKGROUND_WORKER_LEADER_POLL_INTERVAL_S5后台 worker 抢主轮询间隔(秒)
ONESTEP_CP_READINESS_TASK_STALE_AFTER_S120就绪检查判定后台任务过期的阈值(秒)

部署与本地脚本

以下变量主要由 Compose 文件、桌面入口或本地脚本使用,不进入后端 Settings:

变量默认值说明
ONESTEP_CP_IMAGECompose 使用的服务端镜像地址
ONESTEP_CP_TIMEZONEAsia/ShanghaiTZ 注入容器,同时影响后端响应时区
ONESTEP_CP_POSTGRES_DBonestep_control_plane内置 PostgreSQL 数据库名
ONESTEP_CP_POSTGRES_USERpostgres内置 PostgreSQL 用户名
ONESTEP_CP_POSTGRES_PASSWORDpostgres(示例)/ 必填(deploy compose)内置 PostgreSQL 密码,生产必须修改
ONESTEP_CP_POSTGRES_PORT5432内置 PostgreSQL 暴露端口
ONESTEP_CP_SQLITE_PATH.data/control-plane-dev.dbscripts/start-local.sh 的 SQLite 文件路径
ONESTEP_CP_ALEMBIC_INI仓库根 alembic.ini桌面入口使用的 Alembic 配置路径
ONESTEP_CP_ALEMBIC_SCRIPT_LOCATIONbackend/alembic迁移脚本目录
ONESTEP_CP_REPO_ROOT自动推导桌面入口的仓库根路径
ONESTEP_CP_SMOKE_READY_TIMEOUT_S120冒烟脚本等待就绪的超时(秒)
ONESTEP_CP_SMOKE_BASE_URLhttp://127.0.0.1:4173冒烟脚本访问的基地址
ONESTEP_CP_SMOKE_API_URLBASE_URL冒烟脚本访问的 API 地址
ONESTEP_CP_SMOKE_FRONTEND_URLBASE_URL冒烟脚本访问的前端地址

前端开发变量(apps/control-plane/frontend/.env,与运行时变量无关):

变量默认值说明
VITE_API_BASE_URL空(同源)Vite 开发时请求的 API 基地址

Worker Agent

onestep-agentapps/work-agent)用 setup 把配置写入 ~/.onestep/worker-agent/config.json,环境变量在运行时覆盖配置文件:

变量默认值说明
ONESTEP_PLANE_URL配置文件 plane_urlControl Plane 地址
ONESTEP_AGENT_REGISTRATION_TOKEN配置文件 registration_token一次性注册 Token
ONESTEP_WORKER_AGENT_DIR~/.onestep/worker-agent工作目录:身份、部署状态、venv、日志
ONESTEP_WORKER_AGENT_NAMEworker-agent控制台中展示的 Agent 名称
ONESTEP_WORKER_AGENT_MAX_CONCURRENCY1同时运行的部署数上限
ONESTEP_WORKER_AGENT_CONFIG_DIRONESTEP_WORKER_AGENT_DIR配置文件目录,等价于 --config-dir

连接器与第三方 SDK

变量默认值说明
AWS_ACCESS_KEY_IDSQS / SNS 插件通过 boto3 标准凭据链读取;EC2/Lambda 上可改用 IAM Role,无需配置
AWS_SECRET_ACCESS_KEY同上
AWS_SESSION_TOKEN临时凭据(STS)会话 Token
AWS_DEFAULT_REGIONboto3 默认区域;资源里显式配置 region_name 时优先
AWS_REGIONAWS_DEFAULT_REGION 等价,AWS 标准链会同时读取
AWS_ENDPOINT_URL覆盖 AWS 端点,用于 LocalStack 或自建兼容服务
TZ系统本地时区调度时区回退值,见核心运行时

其他连接器(RabbitMQ、Redis、Kafka、MySQL/PostgreSQL、MongoDB、Elasticsearch、ClickHouse、Feishu)的地址与凭据都通过构造函数参数或 YAML 资源字段传入,不读取 ONESTEP_* 环境变量;需要走环境变量时,用 ${VAR} 展开或 os.environ 在代码里读取。

本地开发与集成测试

以下变量只在仓库的开发脚本和集成测试中生效,不会影响生产运行时。默认值来自 scripts/setup-integration-env.sh

变量默认值说明
ONESTEP_PYTHON_BIN.venv/bin/python,否则 python3可靠性检查与集成测试使用的解释器
LOCALSTACK_ENDPOINThttp://127.0.0.1:4566LocalStack 端点,同时导出为 AWS_ENDPOINT_URL
KEEP_INTEGRATION_SERVICES0设为 1 时测试结束不销毁 Compose 依赖服务
ONESTEP_RABBITMQ_URLamqp://guest:[email protected]:5672/RabbitMQ 集成测试地址
ONESTEP_RABBITMQ_QUEUEonestep.integrationRabbitMQ 测试队列
REDIS_URLredis://127.0.0.1:6379Redis Streams 集成测试地址
ONESTEP_KAFKA_BOOTSTRAP_SERVERS127.0.0.1:9092Kafka 集成测试地址
ONESTEP_KAFKA_TOPIC_PREFIXonestep.integrationKafka 测试 topic 前缀
ONESTEP_SQS_QUEUE_NAMEonestep-integration.fifoLocalStack 中创建的队列名
ONESTEP_SQS_QUEUE_URL由脚本创建后导出SQS 集成测试队列 URL
ONESTEP_SQS_GROUP_IDworkersSQS FIFO 消费组
ONESTEP_MYSQL_HOST / ONESTEP_MYSQL_PORT / ONESTEP_MYSQL_DATABASE / ONESTEP_MYSQL_USER / ONESTEP_MYSQL_PASSWORD127.0.0.1 / 3306 / onestep / root / rootMySQL 集成测试连接参数
ONESTEP_MYSQL_DSN由脚本拼装后导出MySQL 集成测试 DSN
ONESTEP_POSTGRES_HOST / ONESTEP_POSTGRES_PORT / ONESTEP_POSTGRES_DATABASE / ONESTEP_POSTGRES_USER / ONESTEP_POSTGRES_PASSWORD127.0.0.1 / 5432 / onestep / onestep / onestepPostgreSQL 集成测试连接参数
ONESTEP_POSTGRES_DSN由脚本拼装后导出PostgreSQL 集成测试 DSN
ONESTEP_CLICKHOUSE_DSNhttp://default:[email protected]:8123/onestepClickHouse 集成测试 DSN
ONESTEP_MONGODB_URImongodb://127.0.0.1:27017/onestep?replicaSet=rs0MongoDB 集成测试 URI
ONESTEP_ELASTICSEARCH_URL / ONESTEP_OPENSEARCH_URLElasticsearch / OpenSearch 集成测试地址

控制面冒烟与演示脚本(scripts/run-control-plane-smoke.shrun-control-plane-demo.sh):

变量默认值说明
ONESTEP_CONTROL_PLANE_DIR../onestep-control-plane控制面仓库路径
ONESTEP_CONTROL_PLANE_SMOKE_TIMEOUT_S45等待控制面启动的超时(秒)
ONESTEP_CONTROL_PLANE_SMOKE_POLL_S1就绪轮询间隔(秒)
ONESTEP_CONTROL_PLANE_WAIT_TIMEOUT_S15演示脚本等待上报数据的超时(秒)

示例 Compose 文件(如 examples/prometheus/docker-compose.yml)使用 ONESTEP_WORKER_IMAGE 指定 onestep 服务镜像;示例中默认指向 ghcr.io/mic1on/onestep-worker 的一个已发布标签。

系统注入的变量

以下变量由框架或控制面在运行期写入子进程,不要手工设置

变量注入方说明
ONESTEP_DEPLOYMENT_IDWorker Agent supervisor当前部署 ID
ONESTEP_WORKER_AGENT_IDWorker Agent supervisor执行主机 Agent ID
ONESTEP_RUNTIME_INSTANCE_IDWorker Agent supervisor运行时实例 ID
ONESTEP_INSTANCE_IDWorker Agent supervisor与上一项同值,供 reporter 直接使用
ONESTEP_WORKER_REPORTING_TOKENControl Plane(启动部署时注入)自定义上报模式下,编译出的 worker.yaml 用 ${ONESTEP_WORKER_REPORTING_TOKEN} 引用它

升级注意事项

  • 升级后对照 deploy/env/onestep-app.env.exampleapps/control-plane/.env.example.env.deploy.example 检查现有配置文件,确认是否有新增或更名的变量。
  • 控制面服务端的变量名与 pydantic 字段一一对应,字段改名即变量改名;升级前先核对本文档与对应版本的示例文件。
  • 生产环境的 Token、密码、ONESTEP_CP_CONNECTOR_SECRET 应放入 systemd EnvironmentFile、容器 Secret 或平台密钥管理,不要提交进仓库。

下一步

Released under the MIT License.