本文档统一说明 WeClaws 仓库使用的环境变量、密钥边界和配置分层。
当前事实来源以代码和配置为准:
.env.exampleinfra/compose/.env.exampleapps/web/src/lib/env.tsapps/web/src/lib/admin.tsapps/supervisor/src/config.tsapps/supervisor/src/runtime/spawn-fastagent.tsinfra/compose/docker-compose.yml
仓库有两套主要配置入口:
宿主机本地开发默认围绕仓库根 .env 组织。
主要服务:
pnpm dev:webpnpm dev:supervisorpnpm db:generatepnpm db:migrate
需要注意:
pnpm dev:web/pnpm dev:supervisor会在当前进程缺少必填值时尝试补读根.envpnpm db:generate/pnpm db:migrate不会自动补读根.env;它们读取当前 shell 环境,未显式设置DATABASE_URL时回退到默认 SQLite 路径
默认模板见:
.env.example
默认读取:
infra/compose/.env
默认模板见:
infra/compose/.env.example
根 .env 和 infra/compose/.env 不是同一份配置的两个副本,而是服务于两个运行形态:
| 场景 | 配置文件 | 谁读取 | 路径语义 | SRT host |
|---|---|---|---|---|
| 宿主机本地 dev | 根 .env |
pnpm dev:web、pnpm dev:supervisor |
宿主机路径或仓库相对路径,例如 ./storage/... |
通常是 localhost |
| Docker Compose | infra/compose/.env |
docker compose 插值;最终 env 由 docker-compose.yml 注入容器 |
容器内路径,例如 /app/storage/... |
Compose service name:sandbox-runtime |
不要把根 .env 直接复制成 infra/compose/.env,也不要反过来覆盖。常见错误是:
- 在根
.env里写SRT_SERVICE_HOST=sandbox-runtime,导致宿主机直跑 supervisor 访问不到 sandbox-runtime - 在 Compose
.env里写SRT_SERVICE_HOST=localhost,导致容器内 supervisor 访问自己而不是sandbox-runtime服务 - 把根
.env的./storage/...路径放进 Compose 容器,导致容器内找不到文件 - 把 Compose 的
/app/storage/...路径放进根.env,导致宿主机 dev 直接写到不存在的目录
如果只测试注册、SRT pool 自动配置、管理员 /admin/sandbox-runtime 页面和管理 API,可以只跑:
pnpm dev:webpnpm dev:supervisor
根 .env 至少应保持:
FASTAGENT_SANDBOX_MODE=remoteSRT_SERVICE_HOST=localhostSRT_POOL_CONFIG_FILE=./storage/sandbox-runtime-private/srt-pools.jsonSRT_POOL_STATUS_FILE=./storage/sandbox-runtime-private/srt-pool-status.jsonSRT_WORKSPACE_MAP_DIR=./storage/sandbox-runtime-private/workspace-mapSRT_WORKSPACE_BASE_ROOT=./storage/sandbox-runtime-user-workspaces
注意:
/admin/sandbox-runtime列表显示的是已经存在的user_sandbox_runtime_pools,不是所有用户。- 新注册用户会自动创建 SRT pool。
- 功能上线前已经存在的本地用户,如果还没有触发过 pool provisioning,管理员页面会看到空列表;需要让该用户重新走注册路径、启动一次其 bot 让 supervisor 补齐,或手工调用 repository 补一条默认 pool。
- 没有启动 sandbox-runtime manager 时,manager/status 资源信息会显示不可用,但数据库里的 pool 配置仍可查看和保存。
- 根
.env.example和 Compose.env.example都已经移除了 repo-wide LLM 默认值示例。 - bot runtime 现在必须绑定用户级 LLM profile;不要再把
.env.example当作 bot provider/model/api key 的默认来源。
常见场景下,最少需要关注这些变量:
- 宿主机只跑
webDATABASE_URLAPP_BASE_URLBETTER_AUTH_SECRET
- 宿主机跑
web + supervisor,使用 remote sandbox- 上述
web变量 FASTAGENT_SANDBOX_MODE=remoteSRT_POOL_CONFIG_FILESRT_POOL_STATUS_FILESRT_WORKSPACE_MAP_DIRSRT_SERVICE_HOSTSRT_DEFAULT_*/SRT_PORT_BASE/SRT_PROXY_PORT_BASE按需覆盖- 登录后至少创建一个用户级 LLM profile,再让 bot 绑定该 profile
- 上述
- 宿主机跑
web + supervisor,禁用 sandbox- 上述
web变量 FASTAGENT_SANDBOX_MODE=disabled- 登录后至少创建一个用户级 LLM profile,再让 bot 绑定该 profile
- 上述
- Docker Compose 默认栈
APP_BASE_URLBETTER_AUTH_SECRET- 登录后至少创建一个用户级 LLM profile,再让 bot 绑定该 profile
WEB_PORT、COMPOSE_PROJECT_NAME按部署需要调整WEB_ADMIN_EMAILS、WEB_USER_BOT_LIMIT、RECONCILE_INTERVAL_MS按场景补充
以下是仓库内已经明确落地、适合直接写进配置注释的可选值或值格式:
| Name | Allowed Values / Format | Notes |
|---|---|---|
WEB_ADMIN_EMAILS |
empty, admin@example.com, admin@example.com,ops@example.com |
空值表示不启用白名单自举/管理员邮箱入口;多值用逗号分隔 |
WEB_USER_BOT_LIMIT |
empty, 0, positive integer |
空值或 0 表示不限;正整数表示每个用户最多可创建的 Bot 数量 |
FASTAGENT_SANDBOX_MODE |
remote, disabled |
这是代码层硬枚举 |
FASTAGENT_BASE_URL |
empty or absolute URL | 仓库不限定具体网关列表 |
FASTAGENT_API_TYPE |
empty or provider-specific string | 仓库内已出现示例值:openai-responses |
SRT_DEFAULT_DENIED_DOMAINS |
empty, single domain, comma-separated domains | 例如 a.com,b.com,*.example.com;空值表示不额外阻止任何域名 |
SRT_DEFAULT_ALLOW_READ |
empty, single path, comma-separated paths | per-user SRT 默认路径列表 |
SRT_DEFAULT_ALLOW_WRITE |
empty, single path, comma-separated paths | per-user SRT 默认路径列表 |
SRT_DEFAULT_DENY_READ |
empty, single path, comma-separated paths | per-user SRT 默认路径列表 |
SRT_DEFAULT_DENY_WRITE |
empty, single path, comma-separated paths | per-user SRT 默认路径列表 |
说明:
FASTAGENT_DEFAULT_PROVIDER/FASTAGENT_DEFAULT_MODEL只用于 contract smoke / 手工 CLI tooling,不再属于示例 env 的常规运行配置- per-user SRT child 的 API key 由 DB pool config 生成;不再通过全局
SANDBOX_API_KEY管理
| Name | Used By | Secret | Typical Value | Notes |
|---|---|---|---|---|
DATABASE_URL |
web, supervisor, db tooling | No | file:./storage/sqlite/db.sqlite |
本地开发默认指向工作区内 SQLite;Compose 内为 file:/app/storage/sqlite/db.sqlite;db tooling 不会自动补读根 .env |
APP_BASE_URL |
web | No | http://localhost:3000 |
Better Auth baseURL 与绝对链接来源;Compose 下通常应与 WEB_PORT 暴露出来的实际 URL 保持一致 |
BETTER_AUTH_SECRET |
web | Yes | replace-me |
Better Auth session/cookie secret |
WEB_ADMIN_EMAILS |
web | No | admin@example.com or empty |
允许为空;非空时控制首个管理员自举注册白名单和 /admin/invites 权限入口 |
WEB_USER_BOT_LIMIT |
web | No | 0, 3, 10 |
可选的每用户 Bot 创建上限;空值或 0 表示不限,正整数表示 owner-scoped hard limit |
FASTAGENT_BINARY_PATH |
supervisor | No | /absolute/path/to/fastagent |
可选 override;未设置时优先使用 repo-local apps/supervisor/node_modules/.bin/fastagent |
FASTAGENT_SANDBOX_MODE |
supervisor | No | remote or disabled |
remote 时从 owner-specific SRT pool 注入 SANDBOX_URL / SANDBOX_API_KEY;disabled 时不注入 SANDBOX_* 给 child |
SRT_SERVICE_HOST |
supervisor | No | localhost / sandbox-runtime |
supervisor 渲染 owner-specific SANDBOX_URL 的服务 host;Compose 内固定为 sandbox-runtime |
SRT_POOL_CONFIG_FILE |
supervisor, sandbox-runtime manager | No | ./storage/sandbox-runtime-private/srt-pools.json |
supervisor 写入,manager 读取;应放在 private shared path |
SRT_POOL_STATUS_FILE |
web, supervisor, sandbox-runtime manager | No | ./storage/sandbox-runtime-private/srt-pool-status.json |
manager 写入,web admin console 读取 |
SRT_WORKSPACE_MAP_DIR |
supervisor | No | ./storage/sandbox-runtime-private/workspace-map |
per-user workspace map 文件目录 |
SRT_DEFAULT_POOL_SIZE |
web, supervisor | No | 3 |
新用户 pool 默认进程池大小 |
SRT_DEFAULT_MIN_READY_PROCESSES |
web, supervisor | No | 1 |
新用户 pool 默认预热进程数 |
SRT_DEFAULT_SESSION_TIMEOUT_MS |
web, supervisor | No | 600000 |
新用户 pool 默认 session timeout |
SRT_DEFAULT_MAX_CONCURRENT_INIT |
web, supervisor | No | 1 |
新用户 pool 默认并发初始化限制 |
SRT_DEFAULT_HEALTH_CHECK_INTERVAL_MS |
web, supervisor | No | 60000 |
新用户 pool 默认健康检查周期 |
SRT_DEFAULT_PORT_RANGE_WIDTH |
web, supervisor | No | 100 |
每个用户 pool 占用的 SRT / proxy 端口段宽度 |
SRT_PORT_BASE |
web, supervisor | No | 31000 |
第一个用户 pool 的 SRT child 端口基线 |
SRT_PROXY_PORT_BASE |
web, supervisor | No | 9100 |
第一个用户 pool 的 proxy 端口基线 |
SRT_WORKSPACE_BASE_ROOT |
web, supervisor | No | ./storage/sandbox-runtime-user-workspaces |
per-user sandbox-runtime 工作区根 |
SRT_DEFAULT_DENIED_DOMAINS |
web, supervisor | No | `` | 新用户 pool 默认 denylist;空值表示 allow-by-default |
SRT_DEFAULT_ALLOW_READ |
web, supervisor | No | `` | 新用户 pool 默认允许读路径 |
SRT_DEFAULT_ALLOW_WRITE |
web, supervisor | No | /tmp |
新用户 pool 默认允许写路径 |
SRT_DEFAULT_DENY_READ |
web, supervisor | No | /etc/passwd,/etc/passwd-,...,/proc/*/mountinfo,... |
新用户 pool 默认拒绝读路径;默认包含 /etc 账号数据库备份文件和敏感 /proc 入口,不再直接包含 /etc/mtab |
SRT_DEFAULT_DENY_WRITE |
web, supervisor | No | .env,~/.ssh,... |
新用户 pool 默认拒绝写路径 |
FASTAGENT_DEFAULT_PROVIDER |
supervisor tooling | No | anthropic / openai |
不再参与 bot runtime spawn;当前主要用于 pnpm test:fastagent-contract 这类外部 contract smoke |
FASTAGENT_DEFAULT_MODEL |
supervisor tooling | No | claude-opus-4-6 / gpt-5.4 |
不再参与 bot runtime spawn;当前主要用于 pnpm test:fastagent-contract |
FASTAGENT_API_KEY |
supervisor tooling | Yes | sk-... |
bot 运行时 key 来自绑定 profile;这个 env 当前主要用于 contract smoke 或直接跑 bare CLI |
FASTAGENT_BASE_URL |
supervisor tooling | Usually No | https://gateway.example.com/v1 |
bot 运行时 base URL 来自绑定 profile;这个 env 只在工具链或手工 smoke 中有意义 |
FASTAGENT_API_TYPE |
supervisor tooling | No | openai-responses |
bot 运行时 API type 来自绑定 profile;这个 env 只在工具链或手工 smoke 中有意义 |
INSTANCES_ROOT |
web, supervisor | No | ./storage/instances |
两侧都复用 shared resolver,必须保持一致;未设置时回退 shared 默认值 |
RECONCILE_INTERVAL_MS |
supervisor | No | 2000 |
reconcile 周期,必须为正整数;未设置时回退 2000 |
以下变量不是手工直接配置到 FastAgent child,而是由 supervisor 在 spawn 前注入:
| Name | Source | Secret | Example | Notes |
|---|---|---|---|---|
FASTAGENT_PROVIDER |
bot 绑定的 user_llm_profiles |
No | openai |
实际运行时 provider |
FASTAGENT_MODEL |
bot 绑定的 user_llm_profiles |
No | gpt-5.4 |
实际运行时 model |
FASTAGENT_API_KEY |
bot 绑定的 user_llm_profiles |
Yes | sk-... |
实际运行时 API key |
FASTAGENT_BASE_URL |
bot 绑定的 user_llm_profiles |
Usually No | https://gateway.example.com/v1 |
仅 profile 有值时显式注入 child |
FASTAGENT_API_TYPE |
bot 绑定的 user_llm_profiles |
No | openai-responses |
仅 profile 有值时显式注入 child |
IM_GATEWAY_AGENT_ID |
bot instance id | No | bot_123 |
当前事件里的 agentId 回填来源 |
IM_GATEWAY_ALLOW_ALL_PERMISSIONS |
supervisor | No | true |
当前基线实现固定注入 |
IM_GATEWAY_DATA_DIR |
INSTANCES_ROOT + botId |
No | /app/storage/instances/bot_123/data |
实例级数据目录 |
IM_GATEWAY_WORKSPACE_DIR |
INSTANCES_ROOT + botId |
No | /app/storage/instances/bot_123/workspace |
实例级工作区目录 |
SANDBOX_URL |
owner-specific SRT pool | No | http://sandbox-runtime:31000 |
仅 remote sandbox 模式注入;端口来自 bot owner pool |
SANDBOX_API_KEY |
owner-specific SRT pool | Yes | generated pool secret | 仅 remote sandbox 模式注入;不是全局 Compose secret |
这些变量主要用于 infra/compose/docker-compose.yml 和 sandbox-runtime 服务,不属于 web/supervisor 本地开发必填项。
infra/compose/.env.example 当前只把真正的硬必填项保持为未注释;其他可选 override 会以注释形式保留,按需取消注释即可,不代表这些变量被移除或不再支持。
| Name | Used By | Secret | Typical Value | Notes |
|---|---|---|---|---|
COMPOSE_PROJECT_NAME |
compose | No | weclaws |
控制 Compose 生成的容器、网络和卷名前缀 |
WECLAWS_DATA_ROOT |
production compose override | No | /srv/weclaws/data |
docker-compose.prod.yml 用它把 SQLite、instances、sandbox user workspaces 和 sandbox-runtime private config/status 显式落到宿主机目录 |
WEB_PORT |
compose, web host port mapping | No | 3000 |
控制宿主机暴露端口;应与 APP_BASE_URL 的对外 URL 保持一致 |
SANDBOX_RUNTIME_NPM_VERSION |
compose build arg | No | unset; default comes from infra/docker/sandbox-runtime.versions.env |
临时覆盖 repo-local sandbox image 安装的 @fastagent/sandbox-runtime 版本 |
AGENT_BROWSER_NPM_VERSION |
compose build arg | No | 0.27.0 |
控制 repo-local sandbox image 安装的 agent-browser 版本 |
BROWSERLESS_TOKEN |
browserless, sandbox-runtime | Yes | replace-me |
默认 Compose 用它保护 browserless sidecar,并映射成 sandbox-runtime 里的 BROWSERLESS_API_KEY |
BROWSERLESS_API_URL |
sandbox-runtime | No | http://browserless:3000 |
agent-browser -p browserless 在 Compose 内连接 sidecar 的默认地址 |
BROWSERLESS_CONCURRENT |
browserless | No | 2 |
Browserless 并发会话上限 |
BROWSERLESS_QUEUED |
browserless | No | 2 |
Browserless 排队上限 |
BROWSERLESS_TIMEOUT |
browserless | No | 120000 |
Browserless 默认请求/会话超时 |
BUN_VERSION |
compose build arg | No | 1.3.13 |
控制 repo-local sandbox image 安装的 bun 版本 |
PNPM_VERSION |
compose build arg | No | 9.15.4 |
控制 repo-local sandbox image 安装的 pnpm 版本 |
UV_VERSION |
compose build arg | No | 0.11.7 |
控制 repo-local sandbox image 安装的 uv 版本 |
SANDBOX_RUNTIME_PORT |
sandbox-runtime manager, host port mapping | No | 8788 |
Compose 默认同时影响对外 health 端口和 manager 容器内端口 |
SANDBOX_RUNTIME_LOG_LEVEL |
sandbox-runtime manager + per-user child | No | info |
Compose 映射到 manager LOG_LEVEL,并继续透传到 per-user child runtime |
SANDBOX_COMMAND_EXTRA_PATHS |
sandbox-runtime manager + per-user child | No | /usr/local/bin |
上游 session command PATH 基线只含系统目录;WeClaws 镜像默认导出它,Compose 也显式透传它,把镜像里安装到 /usr/local/bin 的 CLI 追加回 sandbox 命令执行 PATH |
SRT_DEFAULT_POOL_SIZE |
web, supervisor | No | 3 |
Compose 里的新用户 pool 默认进程池大小 |
SRT_DEFAULT_MIN_READY_PROCESSES |
web, supervisor | No | 1 |
Compose 里的新用户 pool 默认预热进程数 |
SRT_DEFAULT_SESSION_TIMEOUT_MS |
web, supervisor | No | 600000 |
Compose 里的新用户 pool 默认 session timeout |
SRT_DEFAULT_MAX_CONCURRENT_INIT |
web, supervisor | No | 1 |
Compose 里的新用户 pool 默认并发初始化限制 |
SRT_DEFAULT_HEALTH_CHECK_INTERVAL_MS |
web, supervisor | No | 60000 |
Compose 里的新用户 pool 默认健康检查周期 |
SRT_DEFAULT_PORT_RANGE_WIDTH |
web, supervisor | No | 100 |
每个用户 pool 占用的 SRT / proxy 端口段宽度 |
SRT_PORT_BASE |
web, supervisor | No | 31000 |
Compose 里的第一个用户 SRT child 端口基线 |
SRT_PROXY_PORT_BASE |
web, supervisor | No | 9100 |
Compose 里的第一个用户 proxy 端口基线 |
SRT_WORKSPACE_BASE_ROOT |
web, supervisor | No | /app/apps/sandbox-runtime/user-workspaces |
Compose 里的 per-user sandbox-runtime 工作区根 |
SRT_DEFAULT_DENIED_DOMAINS |
web, supervisor | No | `` | 新用户 pool 默认 denylist;空值表示沿用上游 allow-by-default 语义 |
SRT_DEFAULT_ALLOW_READ |
web, supervisor | No | `` | 新用户 pool 默认允许读路径 |
SRT_DEFAULT_ALLOW_WRITE |
web, supervisor | No | /tmp |
新用户 pool 默认允许写路径 |
SRT_DEFAULT_DENY_READ |
web, supervisor | No | /etc/passwd,/etc/passwd-,...,/proc/*/mountinfo,... |
新用户 pool 默认拒绝读路径;默认包含 /etc 账号数据库备份文件和敏感 /proc 入口,不再直接包含 /etc/mtab |
SRT_DEFAULT_DENY_WRITE |
web, supervisor | No | .env,~/.ssh,... |
新用户 pool 默认拒绝写路径 |
补充:
- Compose 文件里
sandbox-runtime服务入口是 manager;manager 不再接收全局API_KEY - per-user SRT child 的
API_KEY由srt-pools.json逐用户写入,并只注入对应 child AGENT_BROWSER_NPM_VERSION、BUN_VERSION、PNPM_VERSION、UV_VERSION只影响 sandbox 镜像构建内容,不会作为运行时 env 进入容器SANDBOX_COMMAND_EXTRA_PATHS是运行时 env,不是 build arg;镜像自身会默认设置/usr/local/bin,Compose 也显式透传它,负责把上游sandbox-runtimesession command 默认 PATH 之外的镜像内 CLI 路径追加回来BROWSERLESS_TOKEN会同时进入browserlesssidecar 和sandbox-runtime,后者再通过 child env allowlist 透传成BROWSERLESS_API_KEY,并由 WeClaws wrapper 显式补进 session command envBROWSERLESS_API_URL默认指向 Compose 内部服务名http://browserless:3000;如果切到外部 Browserless,再显式覆盖这个地址;WeClaws wrapper 也会把它显式补进 session command env- base Compose 默认不会把
browserless暴露到宿主机;如果需要宿主机调试端口,应通过额外 Compose override 单独添加ports - Compose 里的 FastAgent child
SANDBOX_URL由SRT_SERVICE_HOST和 owner pool 端口推导,不在infra/compose/.env.example中单独配置 DATABASE_URL和INSTANCES_ROOT在当前 Compose 文件里固定写成容器内路径,不从infra/compose/.env.example读取WECLAWS_DATA_ROOT只用于docker-compose.prod.yml;基础docker-compose.yml继续使用 Docker named volume,不会读取这个变量- Compose 还会固定给 sandbox-runtime manager 注入
SRT_POOL_CONFIG_FILE、SRT_POOL_STATUS_FILE,并要求web/supervisor/sandbox-runtime共享私有sandbox_runtime_private - 仓库接受上游 sandbox-runtime 的公开网络 contract:默认允许外网访问,仅通过
SRT_DEFAULT_DENIED_DOMAINS写入新用户 pool 做 denylist 收口
读取:
DATABASE_URLAPP_BASE_URLBETTER_AUTH_SECRETWEB_ADMIN_EMAILSWEB_USER_BOT_LIMITINSTANCES_ROOTSRT_POOL_STATUS_FILESRT_DEFAULT_*SRT_PORT_BASESRT_PROXY_PORT_BASESRT_WORKSPACE_BASE_ROOT
说明:
- 核心登录/API 路径强依赖的是
DATABASE_URL、APP_BASE_URL、BETTER_AUTH_SECRET WEB_ADMIN_EMAILS允许为空,不会单独阻止/login启动WEB_USER_BOT_LIMIT只影响 create-bot owner 的数量上限判断;0或空值表示不限web会把用户级 LLM profiles 保存在 SQLiteuser_llm_profiles,create-bot 页面展示的是当前选中 profile 的摘要,而不是 env fallbackINSTANCES_ROOT是 create-bot 建目录时的可选 override;未设置时会回退 shared 默认路径SRT_DEFAULT_*只用于注册时给新用户创建默认 SRT pool;已有 pool 不会因为 env 变化被隐式重写SRT_POOL_STATUS_FILE只服务管理员 sandbox-runtime 页面读取 manager 状态
读取:
DATABASE_URLFASTAGENT_BINARY_PATH或 repo-local binaryFASTAGENT_SANDBOX_MODEINSTANCES_ROOTRECONCILE_INTERVAL_MSSRT_SERVICE_HOSTSRT_POOL_CONFIG_FILESRT_POOL_STATUS_FILESRT_WORKSPACE_MAP_DIRSRT_DEFAULT_*SRT_PORT_BASESRT_PROXY_PORT_BASESRT_WORKSPACE_BASE_ROOT
说明:
FASTAGENT_BINARY_PATH是可选 override;默认使用 repo-local binaryDATABASE_URL、INSTANCES_ROOT、RECONCILE_INTERVAL_MS都存在默认值SANDBOX_URL/SANDBOX_API_KEY不再是 supervisor 启动配置;remote mode 会在 spawn 前从 bot owner 的 SRT pool 读取并注入 childSRT_DEFAULT_*是自动补齐/创建用户 pool 的默认值;已有 pool 的手工调整以数据库为准FASTAGENT_DEFAULT_*/FASTAGENT_API_KEY/FASTAGENT_BASE_URL/FASTAGENT_API_TYPE不再属于 supervisor app config surface;当前只在pnpm test:fastagent-contract这类独立 tooling / smoke 场景下按需读取
当前不会继承这些控制面变量:
DATABASE_URLBETTER_AUTH_SECRETWEB_ADMIN_EMAILS
当前也不会再从 supervisor 父进程隐式继承额外的全局 FASTAGENT_* 默认值;运行时 provider/model/api key/baseUrl/apiType 只认 bot 绑定 profile 和 supervisor 显式注入。
当前只允许:
- 系统运行必需环境变量
- 代理相关变量
FASTAGENT_*- supervisor 显式注入的
IM_GATEWAY_*/SANDBOX_*
- 本地开发默认继续使用仓库根
.env - Docker Compose 默认继续使用
infra/compose/.env pnpm dev:web/pnpm dev:supervisor与 db tooling 的.env加载行为不同,排障时不要混淆- 不再把
.env.web/.env.supervisor作为当前仓库的默认配置组织方式 - 如果由外部部署平台注入配置,变量名应尽量保持与本仓库一致