ODS Host Agent API 完整指南:容器外如何安全管理宿主服务与 .env 写入
【免费下载链接】ODSTurn your PC, Mac, or Linux box into an AI server. LLM inference, chat UI, voice, agents, workflows, RAG, and image generation.项目地址: https://gitcode.com/GitHub_Trending/dr/ODS
ODS 是一款把 PC、Mac 或 Linux 变成AI 服务器的开源项目(LLM 推理、聊天 UI、语音、Agent、工作流、RAG 与图像生成)。而ODS Host Agent(宿主代理服务)是其中一块常被忽略的关键机制:它以轻量 HTTP 服务运行在宿主机上(Docker 容器之外),让运行在容器里的 Dashboard API 能够安全地管理宿主服务和写入 .env 文件,同时避免了直接挂载 Docker socket 的巨大安全隐患。🔐
为什么需要 Host Agent?🤔
Dashboard API 跑在 Docker 容器内,无法直接执行宿主机的docker compose命令。传统做法是把 Docker socket 挂进容器——但这等于把宿主机的 Docker 控制权整个交给了容器,风险极高。
ODS 的解法就是 Host Agent:
- 🖥️ 一个运行在宿主机上的轻量 HTTP 服务(纯 Python 标准库实现)
- 📡 监听
ODS_AGENT_BIND:ODS_AGENT_PORT(默认端口7710) - 🔑 只接受带Bearer API Key的认证请求
- 🚀 代表容器执行
docker compose启停、日志拉取等操作
结果:容器永远接触不到 Docker socket,所有宿主操作都被收敛到一个有鉴权、有校验、有限时的窄边界上。
各平台如何启动 Host Agent 🚀
安装过程中就会自动启动,三种平台机制不同:
| 平台 | 启动机制 |
|---|---|
| 🐧 Linux | systemd 用户服务 |
| 🍎 macOS | 由 macOS 安装器启动 |
| 🪟 Windows | 由安装器启动,经ods.ps1管理 |
Linux 上会自动探测ods-network网关让容器可以访问到 Agent;探测失败则回退到默认 Docker 桥接网关,最后回退127.0.0.1。macOS 和 Windows 默认只绑定127.0.0.1。除非显式配置ODS_AGENT_BIND,否则绝不会绑定0.0.0.0。
快速配置:关键 .env 变量一览表 ⚙️
Agent 的配置全部来自 ODS 安装目录下的.env文件:
| 变量 | 默认值 | 说明 |
|---|---|---|
ODS_AGENT_KEY | 无 | 请求鉴权用的 API Key(缺省时回退DASHBOARD_API_KEY) |
ODS_AGENT_BIND | 按平台 | 绑定地址(macOS/Windows 为127.0.0.1) |
ODS_AGENT_PORT | 7710 | Agent 监听端口 |
GPU_BACKEND | nvidia | 构建 compose 栈时传入的 GPU 后端 |
TIER | 1 | 硬件档位,参与 compose 栈解析 |
ODS_DATA_DIR | ~/.ods | 数据目录根路径 |
ODS_USER_EXTENSIONS_DIR | $ODS_DATA_DIR/user-extensions | 用户扩展目录 |
此外 Agent 还会加载 core-service-ids.json 来确定哪些核心服务受保护、不可被托管操作(如 dashboard-api、llama-server 等);若该文件缺失,会启用内置的硬编码兜底清单,防止"配置丢失 = 防护失效"。
容器如何调用 Host Agent?🔗
调用链路非常清晰(见 host_agent_client.py):
- Dashboard API 由
ODS_AGENT_HOST+ODS_AGENT_PORT拼出AGENT_URL - 容器通过 Docker 的
host.docker.internalDNS 名称访问宿主机上的 Agent - 每个请求携带
Authorization: Bearer <ODS_AGENT_KEY>头 - 除
/health健康检查外,所有/v1/*接口都强制鉴权,且使用恒定时间比较防止时序攻击
⚡ 一个贴心的细节:当宿主 Agent 不可达时,安装/启用/禁用操作仍会在文件层面成功,并返回restart_required: true,提示执行ods restart完成重启。
.env 安全写入:/v1/env/update端点详解 ✍️
这是 Host Agent 最有价值的能力之一。容器内挂载的.env是只读的——只有宿主上的 Agent 能写密钥到磁盘。Dashboard 的"保存设置"功能正是委托给它完成的(实现见 ods-host-agent.py 中的_handle_env_update)。
写入前的校验相当严格:
- ✅ 请求体上限64 KB(普通接口仅 16 KB,因为
.env文件通常更大) - ✅ 逐行校验
KEY=value格式,key 必须匹配环境变量命名规范 - ✅ 所有 key 对照 .env.schema.json 做白名单校验(扩展引入的额外 key 会被记录但宽容接受)
- ✅ 特殊场景下自动强制写入必需项(如代理模式下强制
WEBUI_AUTH=true) - 📦 写入前自动备份原文件,可回滚
换句话说:即使你在网页面板里误改了配置,也有一道宿主机端的最后防线替你把关。🛡️
扩展容器管理:启动、停止与日志 📦
/v1/*还覆盖了完整的扩展生命周期操作:
| 端点 | 作用 |
|---|---|
POST /v1/extension/start | 启动扩展容器(自动预创建./data/卷目录并修正属主) |
POST /v1/extension/stop | 停止扩展容器 |
POST /v1/extension/logs | 拉取最近日志(tail限制在 1–500 行) |
POST /v1/extension/install/hooks | 扩展安装与生命周期钩子 |
GET /v1/service/health | 容器生命周期 + 健康检查快照 |
GET /v1/gpu/metrics/GET /v1/llm/status | 宿主机 GPU 指标与推理状态(Docker Desktop 拿不到的数据) |
启动操作前会先做三重验证:service_id正则合法 → 不是核心服务 → 在user-extensions/中存在且 manifest 有效;再叠加每服务锁防止并发启停竞争,子进程 120 秒超时兜底。
安全边界速览(为什么要读这篇)🔒
把 Host Agent 理解成"宿主机上唯一的受控闸门"最贴切。它同时具备:
- 🌐网络边界:默认仅回环/内网可达,绝不暴露公网
- 🔑鉴权边界:所有变更接口必须携带 API Key
- 🚫核心服务保护:核心服务 ID 拒绝托管操作(403)
- 🔒输入校验:service ID 正则 + schema 白名单 + 请求体大小限制
- ⏱️超时兜底:Docker 操作 120s 超时、日志 5s 超时
延伸阅读与关键文件 📚
| 文件 | 说明 |
|---|---|
| ods/docs/HOST-AGENT-API.md | 完整的官方 API 参考文档 |
| ods/bin/ods-host-agent.py | Host Agent 完整实现源码 |
| ods/scripts/systemd/ods-host-agent.service | Linux systemd 服务模板 |
| ods/extensions/services/dashboard-api/host_agent_client.py | 容器侧的带重试 HTTP 客户端 |
| ods/.env.example | 全部.env变量示例 |
| ods/.env.schema.json | .env写入白名单 schema |
一句话总结:ODS 用 Host Agent 把"容器管理宿主机"这件高风险的事,做成了有鉴权、有校验、有备份、有时限的标准化 API——这正是它值得学习的地方。👏
【免费下载链接】ODSTurn your PC, Mac, or Linux box into an AI server. LLM inference, chat UI, voice, agents, workflows, RAG, and image generation.项目地址: https://gitcode.com/GitHub_Trending/dr/ODS
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考