Agent 容器安装手册¶
本文说明如何在 Docker 和 Kubernetes 中安装 obs-agent。如果您要安装到 Kubernetes,优先使用 Helm。
容器启动时会使用 BEAK_WS_URL、AGENT_ID 和 AGENT_API_KEY 从 Beak 获取运行配置,然后启动 agent。
持久化存储是运行前置条件。
/app中保存运行中 session/task 的 JSONL 历史及相关数据,另外两个目录保存 profile 和 Owl 数据。Docker、Kubernetes YAML 和 Helm 部署都必须为/app、/var/lib/obs-agent/profile-cache、/app/.owl提供持久化存储。Owl 卷独立嵌套挂载到/app/.owl。否则容器、Pod 重建或升级后,运行中的 session/task 可能因历史数据丢失而无法继续。
如果容器所在节点不能直连 Beak、LLM 或其他公网服务,请先阅读为 obs-agent 配置正向代理。
准备连接信息¶
从 Beak 控制台或安装页面复制这三个值。Docker 和 Kubernetes YAML 安装会使用全部三个值;从品牌 Helm 仓库安装时,Chart 已包含默认 Beak 地址,只会使用 AGENT_ID 和 AGENT_API_KEY,除非您需要覆盖 Beak 地址:
export BEAK_WS_URL='https://agent-api.guance.com'
export AGENT_ID='replace-with-agent-uuid'
export AGENT_API_KEY='replace-with-agent-api-key'
准备镜像地址:
用 Docker 安装¶
Docker 部署必须创建并重复挂载下面命令中的三个命名卷。升级或重启时应沿用相同的卷名;不要把这些挂载替换为容器临时目录。也可以使用由运维系统管理的 bind mount,但其生命周期必须独立于容器。
创建 env 文件:
cat > obs-agent.env <<EOF
BEAK_WS_URL=${BEAK_WS_URL}
AGENT_ID=${AGENT_ID}
AGENT_API_KEY=${AGENT_API_KEY}
EOF
启动容器:
docker run -d \
--name obs-agent \
--restart unless-stopped \
--env-file ./obs-agent.env \
-v obs-agent-work:/app \
-v obs-agent-profile-cache:/var/lib/obs-agent/profile-cache \
-v obs-agent-owl:/app/.owl \
"${OBS_AGENT_IMAGE}"
检查状态:
日志中看到以下内容表示启动成功:
升级镜像:
OBS_AGENT_IMAGE="${OBS_AGENT_IMAGE%:*}:v0.8.1"
docker pull "${OBS_AGENT_IMAGE}"
docker rm -f obs-agent
docker run -d \
--name obs-agent \
--restart unless-stopped \
--env-file ./obs-agent.env \
-v obs-agent-work:/app \
-v obs-agent-profile-cache:/var/lib/obs-agent/profile-cache \
-v obs-agent-owl:/app/.owl \
"${OBS_AGENT_IMAGE}"
清理 Docker 安装:
下面的 docker volume rm 会永久删除 session/task 历史及相关数据。仅在确认不再需要恢复或继续任何任务时执行。
用 Kubernetes YAML 安装¶
如果您不使用 Helm,可以直接使用发布到 OSS 的基础 manifest。
基础 manifest 会创建并挂载三个 PVC(20 GiB、5 GiB、5 GiB)。安装前,集群必须配置默认 StorageClass 以动态供应 PV,或预先准备可供这三个 PVC 绑定的 PV。PVC 未绑定时,Pod 会保持 Pending;不要改用 emptyDir 绕过该要求,否则 Pod 重建或升级会丢失运行中 session/task 的 JSONL 历史及相关数据。
下载 manifest:
下载指定版本的 manifest:
创建 namespace:
manifest 使用环境变量保存 Beak 地址和 agent 凭据。确认本机已安装 envsubst,安装时只展开这三个变量,避免 URL 或凭据中的 /、& 等字符被替换命令解释:
envsubst '${BEAK_WS_URL} ${AGENT_ID} ${AGENT_API_KEY}' \
< obs-agent.yml \
| kubectl -n obs-agent apply -f -
obs-agent.yml 已经包含一个 Kubernetes Secret。上述 envsubst 命令会把当前环境中的凭据写入下面两个字段:
apiVersion: v1
kind: Secret
metadata:
name: obs-agent-secret
type: Opaque
stringData:
AGENT_API_KEY: "${AGENT_API_KEY}"
AGENT_ID: "${AGENT_ID}"
检查状态:
kubectl -n obs-agent get pods
kubectl -n obs-agent get deploy
kubectl -n obs-agent logs -f deploy/obs-agent
升级时重新下载新版 obs-agent.yml,保留当前 BEAK_WS_URL、AGENT_ID、AGENT_API_KEY,再执行:
envsubst '${BEAK_WS_URL} ${AGENT_ID} ${AGENT_API_KEY}' \
< obs-agent.yml \
| kubectl -n obs-agent apply -f -
升级时必须保留并复用原有 PVC。删除 PVC 或 namespace 可能连同底层 PV 数据一起删除,具体取决于 StorageClass 的回收策略。
清理 YAML 安装:
下面的命令会删除 manifest 创建的 PVC,底层 PV 数据是否保留取决于 StorageClass 的回收策略。仅在确认不再需要恢复或继续任何任务时执行。
用 Kubernetes Helm 安装¶
Helm chart 默认创建并挂载三个 PVC(20 GiB、5 GiB、5 GiB)。安装前,集群必须配置默认 StorageClass 以动态供应 PV,或分别在 persistence.work.existingClaim、persistence.profileCache.existingClaim、persistence.owl.existingClaim 中指定三个已绑定的 PVC。不要禁用这些持久化项,否则 Pod 重建或升级会丢失运行中 session/task 的 JSONL 历史及相关数据。
设置 Helm 仓库地址,然后添加仓库:
Helm 仓库地址与容器镜像仓库地址不同。不要把后续 image.repository 使用的镜像路径作为 helm repo add 的仓库地址。
export OBS_AGENT_HELM_REPO_URL='https://pubrepo.guance.com/chartrepo/obs-agent'
helm repo add obs-agent "${OBS_AGENT_HELM_REPO_URL}"
helm repo update obs-agent
helm search repo obs-agent
创建 namespace:
创建 agent secret:
kubectl -n obs-agent create secret generic obs-agent-secret \
--from-literal=AGENT_ID="${AGENT_ID}" \
--from-literal=AGENT_API_KEY="${AGENT_API_KEY}"
品牌 Helm Chart 已包含当前品牌的默认 Beak 地址,正常安装时不需要手动设置 config.BEAK_WS_URL。
安装:
helm upgrade --install obs-agent obs-agent/obs-agent \
--namespace obs-agent \
--set image.repository=pubrepo.guance.com/guance/obs-agent \
--set image.tag=v0.8.1 \
--set secret.existingSecret=obs-agent-secret
只有使用自定义 Beak 地址、安装未包含品牌默认地址的旧版 Chart,或直接从仓库源码 docs/examples/helm/obs-agent 安装时,才需要在安装命令中追加 --set-string config.BEAK_WS_URL="${BEAK_WS_URL}"。
检查状态:
kubectl -n obs-agent get pods
kubectl -n obs-agent get deploy -l app.kubernetes.io/instance=obs-agent
kubectl -n obs-agent logs -f deploy/obs-agent
如果 Deployment 名不是 obs-agent,用上面的 kubectl get deploy 输出中的实际名称查看日志。
升级:
helm upgrade obs-agent obs-agent/obs-agent \
--namespace obs-agent \
--reuse-values \
--set image.tag=v0.8.1
如果旧 release 的 values 中已经保存了错误或未解析的 Beak 地址,--reuse-values 会继续复用该值。首次升级到修复后的 Chart 时,请额外传入 --set-string config.BEAK_WS_URL="${BEAK_WS_URL}" 修正它;后续升级可以继续复用。
清理 Helm 安装:
helm uninstall 会删除 chart 创建的 PVC,kubectl delete namespace 也会删除该 namespace 中的 PVC。底层 PV 数据是否保留取决于 StorageClass 的回收策略;仅在确认不再需要恢复或继续任何任务时执行。
查看可用环境变量¶
所有安装方式都需要 AGENT_ID 和 AGENT_API_KEY。Docker 和 Kubernetes YAML 安装还需要 BEAK_WS_URL;品牌 Helm Chart 已提供默认值,仅在自定义地址或兼容旧 Chart 时需要覆盖。下面的其他变量用于排查问题或覆盖默认配置;没有明确需求时不用设置。
| 环境变量 | 是否需要手动配置 | 说明 |
|---|---|---|
BEAK_WS_URL |
Docker/YAML:是;品牌 Helm:否 | Beak config API 地址,例如 https://agent-api.guance.com。品牌 Helm Chart 已内置默认地址,可通过 config.BEAK_WS_URL 覆盖。 |
AGENT_ID |
是 | Agent 实例 ID。每个运行实例必须唯一。 |
AGENT_API_KEY |
是 | Agent 访问 Beak config API 和 WebSocket 的凭据。 |
BEAK_ENDPOINT |
否 | 容器入口读取 Beak config API 时的备用地址;未设置时使用 BEAK_WS_URL。 |
HTTP_PROXY / http_proxy |
否 | HTTP 和 WS 请求使用的 HTTP 正向代理。大小写变量同时存在时值必须一致。 |
HTTPS_PROXY / https_proxy |
否 | HTTPS 和 WSS 请求使用的代理;代理入口仍使用 http://。 |
NO_PROXY / no_proxy |
否 | 不经过代理的主机、域名、IP 或网段。建议至少包含 localhost,127.0.0.1,::1。 |
SSL_CERT_FILE / SSL_CERT_DIR |
否 | 企业代理重新签发 TLS 证书时使用的 CA 文件或目录。 |
AGENT_NAME |
否 | Agent 显示名称。未手动配置时由 Beak config API 下发。 |
AGENT_WORKDIR |
否 | Agent 工作目录。容器默认 /app。 |
AGENT_PROFILE_CACHE_DIR |
否 | Profile 缓存目录。容器默认 /var/lib/obs-agent/profile-cache。 |
AGENT_LOCAL_TIMEZONE |
否 | Agent 本地时区。容器默认 Asia/Shanghai。 |
AGENT_HTTP_ALLOWED_DOMAINS |
否 | 限制 HTTP 工具可访问的域名,逗号分隔。 |
AGENT_UPDATE_ENABLED |
否 | 容器化部署固定关闭自更新。升级通过镜像或 manifest 完成。 |
AGENT_UPDATE_HELPER_PATH |
否 | 自更新 helper 路径;容器化部署通常不使用。 |
AGENT_UPDATE_BASE_URL |
否 | 自更新 release 地址;容器化部署通常不使用。 |
AGENT_UPDATE_CHECK_INTERVAL_SECONDS |
否 | 自更新检查间隔;默认 300。 |
AGENT_UPDATE_STATE_PATH |
否 | 自更新状态文件路径。 |
AGENT_UPDATE_HISTORY_PATH |
否 | 自更新历史文件路径。 |
AGENT_INSTALL_MODE |
否 | 安装模式标记,通常由安装脚本写入。 |
AGENT_SELF_HOST_STATE_PATH |
否 | 宿主机安装状态文件路径;容器化部署通常不使用。 |
AGENT_SKILL_DEP_INSTALLER |
否 | Skill 依赖安装器路径;通常由安装脚本或镜像提供。 |
AGENT_SKILL_DEP_STATE_PATH |
否 | Skill 依赖状态文件路径。 |
AGENT_SKILL_DEP_HISTORY_PATH |
否 | Skill 依赖历史文件路径。 |
LLM_BASE_URL |
否 | 由 Beak config API 下发。 |
LLM_API_KEY |
否 | 由 Beak config API 下发,默认使用 AGENT_API_KEY。 |
LLM_MODEL |
否 | 不需要手动配置。未配置时 agent 使用默认模型。 |
LLM_TEMPERATURE |
否 | LLM temperature,默认 0.2。 |
LLM_MAX_TOKENS |
否 | LLM 最大输出 token,默认 0 表示使用模型默认值。 |
AI_HUB_BASE_URL |
否 | AI Hub 地址;未配置时使用 LLM_BASE_URL。 |
LOG_LEVEL |
否 | 日志级别。容器默认 info。 |
LOG_FORMAT |
否 | 日志格式。容器默认 text。 |
LOG_PATH |
否 | 日志输出位置。容器默认 stdout。 |
AGENT_DIAGNOSTIC_LOG_PATH |
否 | Bug report 使用的受限轮转日志副本。容器默认 /var/lib/obs-agent/profile-cache/diagnostics/agent.log,复用 profile-cache 持久卷;不可写时回退到 4 MiB 内存尾部。 |
LOG_RELATIVE_PATH |
否 | 日志路径是否按工作目录解析,默认 true。 |
LOG_MAX_SIZE_MB |
否 | 单个日志文件最大大小,默认 32。 |
LOG_MAX_BACKUPS |
否 | 日志备份文件数量,默认 5。 |
OTEL_EXPORTER_OTLP_PROTOCOL |
否 | OTEL 导出协议。容器默认 http/protobuf。 |
OTEL_EXPORTER_OTLP_ENDPOINT |
否 | OTEL 采集端地址。需要链路上报时由 Beak config API 下发或手动覆盖。 |
OTEL_EXPORTER_OTLP_HEADERS |
否 | OTEL 请求头。需要链路上报时由 Beak config API 下发或手动覆盖。 |
OTEL_LOGS_ENABLED |
否 | 历史变量,当前 Agent 忽略。metrics、logs、traces 的启停统一由 Beak runtime-config API 控制。 |
AGENT_MAX_LLM_CALLS |
否 | 单次任务实际 LLM provider 调用上限,默认 512,必须大于 0;429、timeout、5xx 与自动重试均计数。 |
AGENT_MAX_RUN_TOKENS |
否 | 可选的单次任务累计 token 硬预算,默认 0(不限制);设置正数后启用。 |
AGENT_MAX_RUN_DURATION |
否 | 单次任务 wall-clock 硬预算,默认 2h;0s 关闭。 |
AGENT_MAX_LLM_MESSAGES |
否 | 可选的单次 provider 请求消息保护上限,默认 0(关闭)。 |
AGENT_MAX_LLM_MESSAGE_CHARS |
否 | 单条 LLM 消息最大字符数,默认 512000。 |
AGENT_MAX_SYSTEM_PROMPT_CHARS |
否 | System prompt 最大字符数,默认 512000。 |
AGENT_QUERY_SESSION_CHAT_HISTORY_LIMIT |
否 | 查询会话历史条数,默认 20。 |
AGENT_CONTEXT_BUDGET_TOKENS |
否 | 上下文 token 预算,默认 262144。 |
AGENT_CONTEXT_BUDGET_CHARS |
否 | 上下文字符预算,默认 262144。 |
AGENT_REASONING_DISPLAY_MODE |
否 | 推理内容显示模式,支持 hidden 或 raw,默认 hidden。 |
AGENT_PROFILE_SYNC_DISABLE |
否 | 是否关闭 profile 同步,默认 false。 |
AGENT_PROFILE_SYNC_INTERVAL |
否 | Profile 完整同步的周期兜底间隔,默认 5m;人类保存该 agent 的 profile、Skill 或 MCP 绑定时会另行定向触发即时同步,完整语义见 Profile 物料实时刷新。 |
AGENT_DEFAULT_APPROVAL_TTL_SECONDS |
否 | 默认审批有效期,默认 300 秒。 |
AGENT_WEB_SEARCH_ENABLED |
否 | 是否启用 Web Search 工具,默认 true。 |
AGENT_WEB_SEARCH_BASE_URL |
否 | Web Search 服务地址;启用 Web Search 时需要。 |
AGENT_WEB_SEARCH_DEFAULT_LIMIT |
否 | Web Search 默认结果数,默认 5。 |
AGENT_WEB_SEARCH_MAX_LIMIT |
否 | Web Search 最大结果数,默认 10。 |
AGENT_WEB_SEARCH_MAX_CONTENT_CHARS |
否 | 单条搜索内容最大字符数,默认 3000。 |
AGENT_WEB_SEARCH_MAX_CONTEXT_CHARS |
否 | 搜索上下文最大字符数,默认 12000。 |
AGENT_WEB_SEARCH_DEFAULT_MODE |
否 | Web Search 默认模式,默认 auto。 |
AGENT_WEB_SEARCH_TIMEOUT |
否 | Web Search 超时时间,默认 30s。 |
AGENT_MESSAGE_ENCRYPTION_ENABLED |
否 | 是否启用消息加密,默认 true。 |
AGENT_MESSAGE_HPKE_KEY_ID |
否 | HPKE key ID。 |
AGENT_MESSAGE_HPKE_PRIVATE_KEY |
否 | HPKE 私钥内容。 |
AGENT_MESSAGE_HPKE_KEY_PATH |
否 | HPKE 私钥文件路径。 |
AGENT_MESSAGE_HPKE_ROTATION_INTERVAL |
否 | HPKE key 轮换间隔,默认 0 表示不自动轮换。 |
OWL_BASE_URL |
否 | Owl 依赖下载地址。通常由镜像内置或 Beak config API 下发。 |
OWL_INSTALL_URL |
否 | Owl 安装脚本地址。通常由 Beak config API 下发。 |
OWL_REGISTRY_ENDPOINT |
否 | Owl registry 地址。通常由 Beak config API 下发。 |
OWL_TOKEN |
否 | Owl registry 访问 token。通常由 Beak config API 下发。 |
OWL_DIR |
否 | Owl 工作目录。容器默认 ${AGENT_WORKDIR}/.owl,即 /app/.owl;obs-agent 将其作为 read_file、list_dir 的共享只读根。旧部署显式配置的其他路径仍受支持。 |
AGENT_IMAGE_PRINT_VERSIONS |
否 | 容器启动时是否打印 obs-agent 和 owl 版本,默认 false。 |
注意事项¶
- Docker 和 Helm 不能复用同一个
AGENT_ID同时在线。每个运行实例需要独立 agent。 - 仅替换镜像升级的旧部署如果仍把 Owl 卷挂载到
/var/lib/obs-agent/work/.owl,entrypoint 会在未显式设置OWL_DIR时检测并继续使用该目录;更新到新 Compose、Kubernetes 或 Helm 模板后则使用/app/.owl。迁移期间不要同时挂载两个 Owl 卷。 obs-agent.yml会创建独立 ServiceAccount,并关闭 Kubernetes service account token 自动挂载。- 容器内不会运行宿主机安装脚本,也不依赖 systemd。
- 容器化部署不启用本地自更新;升级通过替换镜像 tag 或 digest 完成。
- 生产环境建议使用镜像 digest 固定版本。