部署 FAQ
快速回答安装、服务、存储、升级和安全问题
安装与服务
为什么 API 服务名是 api 而不是 backend?
当前 Compose、Kubernetes 和路由配置使用 api。旧脚本或旧文档中的 backend 引用应改为 api,例如 docker compose logs -f api。
为什么前端能打开但请求失败?
分两条链路排查:
- 浏览器请求:确认反向代理/Ingress 把
/api转发到api:8000,且NEXT_PUBLIC_API_URL(前端镜像默认/api/v1)是浏览器可访问的路径;浏览器侧请求是相对路径,不会被后端API_V1_STR用到,但两者路径前缀必须一致。 - 服务端渲染(SSR)请求:Next.js 服务端用
BACKEND_INTERNAL_URL拼接 API 地址,代码默认http://localhost:8000(Compose 注入http://api:8000)。
单文件 K8s manifest 和 Helm 默认的 frontend Pod 不设置任何环境变量,因此 SSR 会回退到 http://localhost:8000——在 Pod 内这个地址不可达。浏览器流量经 Ingress 转发不受影响;如果依赖 SSR 服务端取数,请给 frontend 显式加 BACKEND_INTERNAL_URL=http://api:8000。
为什么 Beat 只能有一个副本?
Beat 是调度器。多个副本会重复投递定时任务,造成重复处理或重复通知。
改过 Worker 启动命令后,为什么 AgentRun 一直停在运行中?
worker 必须消费 default,agent,knowledge,workflow 四个队列。持久化 AgentRun 被路由到 agent 队列,一旦 -Q 里少了 agent,任务无人消费,会话会一直显示运行中且不会报错。恢复方法:把 -Q 改回四个队列,或另起一个 -Q agent 的 Worker。sandbox 队列只由 sandbox-worker 消费,不在这份列表里。
存储与扩展
API 扩容为什么需要共享卷?
本地上传存储挂载在 API。多个 API 副本必须看到同一目录,因此需要 ReadWriteMany 或对象存储;ReadWriteOnce 时保持单副本。
为什么恢复数据库后文件或检索仍然缺失?
数据库只包含元数据。原始文件在上传存储,向量在 Qdrant;三者必须从一致备份恢复。
检索与任务
怎么单独扩容某一类任务?
官方部署的 worker 同时消费 default、agent、knowledge、workflow 4 个队列,整体扩容会同时增加这 4 类任务的吞吐。需要只扩容 AgentRun 执行时,额外启动一个只订阅单队列的 Worker(如 -Q agent);sandbox 队列由独立的 sandbox-worker 消费。详见部署架构 → Celery 队列划分。
文档上传成功后为什么搜不到?
上传和处理是两个阶段。等待文档进入 completed,确认嵌入成功和 Qdrant 可用,再检查 Agent 关联的知识库。
混合检索为什么返回校验错误?
混合检索的 dense_weight 和 lexical_weight 不能同时为 0。全文通道还需要 PostgreSQL 的 pg_search。
沙箱与代码执行
官方部署需要改宿主内核参数吗?
不需要。Compose、Helm 和单文件 manifest 都让 sandbox-worker 以 root(user: "0" / runAsUser: 0)+ CAP_SYS_ADMIN 运行,用户命名空间创建走特权路径,也不需要在节点上放开非特权用户命名空间。只有自定义部署坚持让该 Worker 以非 root 运行时,才需要在节点级别放开(Ubuntu 23.10+ 的 kernel.apparmor_restrict_unprivileged_userns=0、Debian 的 kernel.unprivileged_userns_clone=1)。详见故障排查 → 沙箱任务报 bwrap 用户命名空间错误。
SANDBOX_FILESYSTEM_ISOLATION_ENABLED 到底是开还是关?
代码默认是 false(让不支持的开发机也能启动),但官方 sandbox-worker 镜像的 ENV、deploy/.env.example、K8s ConfigMap 和 Helm values 都显式设为 true。所以走官方部署就是开启的;自己拼镜像或自己写 manifest 时不要漏掉这个变量,否则沙箱会在没有文件系统隔离的情况下执行代码。
安全
为什么内网地址被拒绝?
自定义 HTTP 工具、工作流 HTTP 节点和知识库 URL 抓取默认拦截私网与回环地址。到站点设置 > 安全 > 出站网络访问白名单逐条加入内网 IP、CIDR 或域名。云元数据、多播、0.0.0.0、通配符和 localhost 永久禁止,不可放行;本地推理服务走独立的模型端点白名单。详见故障排查 → HTTP 工具或内网地址被拦截。
可以把 .env 提交到仓库吗?
不可以。.env 包含 JWT、数据库、Redis、Qdrant、模型、SSO 和内部网关密钥。使用 Secret 管理器和最小权限。
如何安全轮换 API Key?
创建新 Key、更新调用方、观察用量和错误,再禁用/删除旧 Key。完整 Key 只展示一次。
这篇文章对你有帮助吗?