部署 FAQ
- 03-deployment-ops/OCTO部署形态总览.md v1.1(基于octo-deployment README + docker/kustomize配置 + 内部版模块部署)
- source-repos/octo-deployment/README.zh.md
- source-repos/octo-deployment/docker/README.zh.md(nginx反代/location/端口/首位admin bootstrap)
- source-repos-internal/octo-deployment/docker/docker-compose.yaml(内部模块配置)
- 02-architecture/OCTO全组件服务清单.md
- 03-deployment-ops/基础设施依赖映射.md
- 01-product/模块说明/各模块v0.3文档
- 00-inbox/product-bot-answers/2026-09-20-P0-版本与命名-回答.md(产品管家2026-09-20,server v1.18.0/锁版本规则)
- 07-faq-troubleshooting/README.md v0.1(已收录3条运维FAQ)
部署 FAQ v0.2(私有化部署常见问题)
状态:`draft` / v0.1。confidence:medium。
本文收集 OCTO 私有化部署最常被售前/交付/运维问到的问题。能答的基于源码和产品管家权威口径回答(标来源);当前证据不足的明确标"待产品管家 deployment-architecture 回答后补",不编造。
与 `07-faq-troubleshooting/README.md` 的区别:那篇是面向三类读者的通用 FAQ 入口,本文专门深挖部署/运维侧问题。
一、端口与访问
Q1:OCTO 默认 HTTP/HTTPS 端口是多少?
- Docker Compose 单机部署默认:HTTP 28080、HTTPS 28443。
- K8s 通过 Ingress/LB 暴露,端口由部署者配置(通常走 80/443)。
- 栈内 nginx(OOTB 自带)location 反代规则:
/→ octo-web 前端静态资源;/admin/→ octo-admin 管理后台静态资源;/v1/、/api/、/api/v1/→ octo-server 后端。- gRPC(WuKongIM webhook 回调)端口:6979(用于 WuKongIM 把消息投递回 octo-server)。
- Prometheus metrics 端口:默认不开,需设
DM_METRICS_ENABLED=true后监听 :9090(DM_METRICS_ADDR可覆盖)。
Q2:前置反向代理(nginx/Caddy/Cloudflare Tunnel)怎么配?为什么图片裂/文件下载403?
- HTTPS 部署必须同步配置 4 个对外地址,否则会出 mixed-content / SigV4 签名错误:
MINIO_SERVER_URLTS_MINIO_DOWNLOADURLTS_EXTERNAL_BASEURLOCTO_WK_WSS_ADDR(WebSocket 地址,必须是wss://)- 前置反代把 HTTPS 流量回源到
127.0.0.1:28080时,必须设OCTO_NGINX_BIND=127.0.0.1,避免栈内 nginx 对公网暴露。 - MinIO bucket 鉴权策略差异:
chat/file/avatar等"内容"bucket 默认匿名可读,图片链接直接渲染;report/group/download等 bucket 需要预签名 URL 访问,配置不对就会 403。- 排查顺序:F12 Network 看是 403 还是 mixed-content → 检查上面4个环境变量是否都是 HTTPS → 反代头是否正确。
二、版本与镜像
Q3:生产部署应该锁什么镜像 tag?能不能用 latest?
- 后端锁 octo-server 具体 release tag(当前最新 GitHub Latest = v1.18.0,2026-09-07);
- Web 锁对外日期版本(当前 2026.09.14);
- 移动端锁各端 SemVer(iOS 1.0.5 / Android 1.4.0);
- 插件锁 openclaw-channel-octo SemVer(当前 1.5.0);
- WuKongIM/admin/matter/smart-summary 暂无官方对照,建议部署时记录实际 pin 版本,后续找研发补兼容矩阵。
⚠️ 关键坑:`docs/changelog.md` 节标题维护滞后(停在 v1.1.2-2026-03-05),不能以 changelog.md 节标题判断最新 tag,必须查 GitHub Releases(releases/latest)。
Q4:OCTO 有没有官方跨组件版本兼容矩阵?
- 默认推荐用同期最新发布组合;
- 客户明确要最小兼容组合时,单独找研发确认;
- openclaw-channel-octo 插件有明确的 OpenClaw SDK 版本硬约束(例如 1.4.1 要求 OpenClaw 2026.8+),可用
create-openclaw-octo doctor校验兼容性——这是目前唯一已知硬性版本约束点。
三、必选/可选依赖
Q5:最小部署必须装哪些中间件?Kafka/OpenSearch 是必需的吗?
- octo-server(Go 后端单二进制,核心,聚合 40+ 模块);
- octo-web(Web/PC 前端,nginx 托管静态资源);
- octo-admin(管理后台,必选,nginx
/admin/托管); - WuKongIM(IM 长连接底座,独立进程;四端口:API 25001内/5001容器、TCP 25100、WS 25200、monitor 25300、gRPC webhook 6979;数据独立,有自己的 mysqlAddr/redisAddr,不复用 server 的 MySQL/Redis;必须配
TS_WUKONGIM_MANAGERTOKEN); - MySQL(推荐 8.x,字符集必须 utf8mb4 硬要求;Docker 端口 23306;matter/summary 各有独立 DB_PASSWORD/独立库;wait_timeout/max_connections 无官方推荐值,按连接池调);
- Redis(6.x/7.x 主流版均可;Docker 端口 26379;承担缓存/会话/限流/bot_task 队列+幂等;生产必须设密码
.env redisPass,OOTB 只绑 127.0.0.1 默认空;单机即可满足 OOTB,HA 自行上主从/Sentinel,无强制要求); - S3 兼容对象存储(MinIO API 29000/console 29001;生产可替换为腾讯云 COS/阿里云 OSS/AWS S3;downloadURL 必须指向客户端可达对外地址)。
- Kafka + OpenSearch:消息全文搜索;默认
SEARCH_BACKEND=disabled/SEARCH_PRODUCER_ON=false,不开搜索就完全不需要;Kafka 只在独立 searchetl-producer 容器里,server 主进程 kafka=0 命中; - octo-matter:Todo/任务(独立旁路 28086,独立 DB,可关);
- octo-smart-summary:LLM 会话摘要(独立旁路 28087,需
LLM_API_URL/KEY,可关); - octo-speech / voice_adapter:语音消息与转写(按需部署,有 speech-setup 脚本);
- octo-docs(Hocuspocus+Yjs):协同文档。
⚠️ 版本基线提醒(产品管家 2026-09-20 Q3 口径):OCTO 目前暂无官方外部依赖最低版本兼容基线文档,OOTB 镜像用同期主流稳定版;售前承诺以交付部署包 pin 的版本为准。以下几项暂无公开信息不臆断:MySQL 5.7 可用性、WuKongIM v2/v3 兼容、OpenSearch/ES 兼容+IK 分词、Kafka 复用集群,需研发补正式基线。
Q6:OCTO 默认自带 OpenClaw 运行时吗?
- 纯 IM/文件/群组/文档协作场景可以不装 OpenClaw;
- 需要 AI Agent(产品管家、知识库助手)则需要单独部署 OpenClaw 并安装 openclaw-channel-octo 插件。
四、安全与配置
Q7:首位管理员怎么创建?公开注册开着吗?
- OCTO OSS 默认关闭公开注册(
register.off: true)。 - 首位 superAdmin 由部署时 out-of-band 创建:设
OCTO_ADMIN_PWD环境变量自动 bootstrap,或手动 SQL seed。 - 普通用户由管理员在管理后台创建/邀请,或配 SSO(OIDC)登录。具体 SSO 配置待确认。
Q8:全局限流阈值是多少?为什么我 429 了?
- 全局 per-IP 令牌桶默认 500 rps / burst 1000(可通过
DM_API_RATELIMIT_RPS/DM_API_RATELIMIT_BURST环境变量覆盖)。 - 4 条豁免路径(不进全局桶,但各自有严格桶兜底):
/v1/ping、/v1/health、/v1/bot/heartbeat、/v1/bot/register——这是 2026-08-05 事故(同 IP 多 Bot 互饿死锁)的修复方案。 - Bot 级限流(business/heartbeat/register 三条通道)默认关闭,由
modules/commonsystem_setting 热加载启用,参数可动态调整。 - 常见 429 原因:同 IP 部署多个 Bot 抢配额(被邻居挤掉)→ heartbeat 漏 → Bot 离线。
Q9:CORS 怎么配?为什么浏览器报跨域?
- 未配置 DM_CORS_ALLOWED_ORIGINS:等价于禁用跨域(剥离所有 CORS 响应头,只允许同源调用);
- 配置了就按配置的 origin 白名单响应。
五、运维与排障
Q10:怎么看服务是否健康?
- 存活探针:
/v1/ping、/v1/health(限流豁免); - 就绪探针:
/v1/ready(不参与 accesslog,ingorePaths 列表可见); - gRPC :6979 通 = WuKongIM 能回调成功;
- 版本号/ldflags 注入字段具体暴露端点(
/version?/metrics?)待确认; - Prometheus metrics(开
DM_METRICS_ENABLED=true后)暴露在:9090/metrics,包含 HTTP per-route 延迟/状态码、DB/Redis 连接池、Bot 限流、卡片渲染、头像缓存、session rollout 等指标。
Q11:数据库 migration 怎么跑?升级要手动吗?
- 跨 MINOR/MAJOR 的强制升级顺序(先升 server 还是先升 web)待确认(无官方 SOP);
- 字段 rolling expand 设计(如
joined_at采用新字段可空、旧二进制可省略、读侧 COALESCE)暗示支持新旧二进制共存短暂窗口,但正式回滚 SOP 待确认。
Q12:备份怎么做?有官方备份方案吗?
- 源码存在
modules/backup(source-repos/octo-server/modules/backup/),包含/data/wukongim数据目录处理、wukongim-YYYYMMDD-HHMMSS.tar.gz打包逻辑; - 具体使用方式、RPO/RTO、MySQL+MinIO 完整备份方案(特别是 MinIO bucket 一致性快照)待产品管家/运维确认(知识地图 P0-13 已列入待确认清单)。
⚠️ 待产品管家 `deployment-architecture` Q3 回答后补外部依赖完整备份方案。
七、内部版可选模块部署FAQ(v0.2新增)
Q13:如何开启文档协同(docs)功能?
- docker-compose:`COMPOSE_PROFILES=docs ./setup.sh --up`,或在.env中添加 `COMPOSE_PROFILES=docs`
- Helm:设 `docsBackend.enabled=true`
- 同时需要配置 docs 必需密钥:`OCTO_DOCS_DB_PASSWORD`(非空)、`COLLAB_TOKEN_SECRET`(≥32hex随机字符串,preflight校验)、attachment secret(≥32hex)
- docs-backend启动时自动执行schema.sql+migration
- 管理员需在appconfig中开启`docs_on`/`docs.enabled`,Web端左侧才显示「文档」入口
- 如需HTML文档能力,同时启用`docs-html` profile(依赖docs)
Q14:如何开启企业网盘(drive)功能?
- docker-compose:`COMPOSE_PROFILES=drive ./setup.sh --up`
- Helm:设 `drive.enabled=true`
- 配置 `OCTO_DRIVE_DB_PASSWORD`(非空,合法字符集[A-Za-z0-9._-])
- drive-preflight自动创建`octo_drive`库+drive用户+授予octo_docs读权限
- drive-config从模板渲染config.yaml(替换storage.endpoint为实际S3端点),drive-migrate执行SQL迁移
- 管理员需开启`drive_on`(默认false)
Q15:Fleet(回路/运行时)为什么用PostgreSQL而不是MySQL?
- 使用内置PG时启用
fleet-dbprofile自动拉起postgres:16-alpine - 使用外部PG时设
FLEET_DATABASE_URL即可,不需要fleet-db profile - Fleet使用Redis DB 1(核心模块使用DB 0,互不干扰)
- 可能原因(推测,不构成定论):Fleet是从octo-server拆出的独立Go服务,可能使用了PG特有的功能(如JSONB、LISTEN/NOTIFY、特定扩展),或与daemon长连接状态管理有关
Q16:Search(全文搜索)"near-real-time"(近实时)是什么意思?
- 新消息经WuKongIM webhook到octo-server后,searchetl producer将变更事件写入Kafka
- es-indexer批量消费Kafka消息(BATCH_SIZE=500),写入OpenSearch
- OpenSearch默认refresh_interval为1秒(索引变更从内存buffer刷新到可查询段)
- 全链路典型延迟预计在数秒级别,不是毫秒级强实时
- 允许秒级延迟换取更高吞吐(批量消费)
- DLQ死信队列保证消息不丢(消费失败进DLQ)
- cursor-seed保证producer重启不回放全量历史
- backfill支持历史数据回填
- read alias模式支持零停机reindex/alias swap
Q17:语音(speech)模块需要什么模型配置?
| 引擎 | 默认模型 | 配置项 | 适用场景 |
|---|---|---|---|
| Gemini(默认) | gemini-3.1-pro-preview/3-flash-preview/2.5-pro | VOICE_ENGINE=gemini | 通用转写 |
| GPT | gpt-4o-mini-transcribe | VOICE_ENGINE=gpt | 仅语音输入append_only模式 |
| Qwen | qwen3.5-omni-plus | VOICE_ENGINE=qwen | 通用转写(独立配置VOICE_QWEN_URL/KEY) |
| 本地ASR(可选) | localhost:8787 | VOICE_LOCAL_ENABLED=true(默认false) | 本地部署转写 |
| Qwen(通义千问) | qwen3.5-omni-plus | VOICE_ENGINE=qwen + VOICE_QWEN_URL/KEY/MODELS | 通用转写 |
|---|---|---|---|
| 本地 | localhost:8787 | VOICE_LOCAL_ENABLED=true | 本地部署转写 |
- 启用`speech` profile
- 配VOICE_ENGINE和对应引擎的URL/KEY/MODELS
- 可选配SPEECH_DB_PASSWORD(非空时创建octo_speech库)
- speech-admin(:8781)有独立ADMIN_USERNAME/PASSWORD/JWT_SECRET,仅loopback+SSH隧道访问
Q18:智能摘要(summary)必须配LLM Key吗?
- 启动阶段:LLM_API_KEY可以用占位值(容器不会因为KEY无效或为空而启动失败),方便开发/测试环境拉起栈验证部署
- 实际使用阶段:用户触发总结时summary-api/worker需调LLM API生成摘要,如果KEY无效/占位会导致摘要请求失败
- 必须配置:
LLM_API_URL:LLM API端点(默认指向https://api.example.com/v1,需替换为实际地址)LLM_API_KEY:对应LLM的API KeyLLM_MODEL:默认claude-sonnet-4-6,可改
- Summary不依赖搜索服务(MESSAGE_FETCH_BACKEND=mysql直接读IM MySQL),可以独立于search profile部署
- summary-worker用summary_reader账号只读访问octo主库读取消息
Q19:内部模块应该按什么顺序启用?
- 第一批(基础):核心7件套,smoke-test全通过
- 第二批(独立旁路):summary → speech(各自独立,互不依赖)
- 第三批(文档):docs → docs-html(docs-html依赖docs)
- 第四批(网盘):drive(独立于docs,但挂载云文档需docs已启)
- 第五批(回路):fleet + fleet-db(独立PG,冷启动start_period=300s)
- 第六批(搜索基础):search(Kafka+OpenSearch+es-indexer,重资源~2-3GiB额外内存)
- 第七批(搜索扩展):doc-index → drive-index(依赖search+对应业务模块)
- search启用后必须跑
scripts/search-upgrade.sh做零停机升级 - fleet冷启动慢(DB迁移最长5分钟),healthcheck start_period=300s
- 开启doc-index/drive-index前需确认docs/drive的SEARCH_ENABLED/DRIVE_KAFKA_DISABLED已正确设置
Q20:开启内部模块需要额外开放防火墙端口吗?
八、版本记录
- v0.1(2026-09-20):首版,覆盖端口/反代/版本/必选依赖/限流/CORS/migration/备份等12个FAQ
- v0.2(2026-09-21):P0扩展补漏——新增§七「内部版可选模块部署FAQ」8个问题(Q13-Q20):开启docs/drive方法、Fleet为何用PG、搜索NRT含义、语音模型配置、summary LLM Key、模块启用顺序、防火墙端口;更新frontmatter增加内部部署仓库+模块文档来源,confidence升到medium-high
六、待产品管家回答后回填项(topic: deployment-architecture)
| # | 待回填项 | 对应Q |
|---|---|---|
| D1 | 后端微服务完整清单(matter/summary/speech/docs 是否独立进程) | Q1 |
| D2 | 哪些组件是私有化必选、哪些 opt-in(特别是 matter/summary/admin) | Q1 |
| D3 | 服务间通信方式(HTTP/gRPC/MQ?服务注册发现?Bot 任务调度?) | Q2 |
| D4 | 外部依赖 MySQL/Redis/MinIO/Kafka/OpenSearch 的推荐版本范围 | Q3 |
| D5 | WuKongIM 是独立进程/是否内置、元数据存在哪里、v2 最低版本/v3 兼容计划 | Q4 |
| D6 | K8s 生产高可用方案(副本数/反亲和/MySQL-Redis-WuKongIM-MinIO 集群拓扑) | P0-9(后续 topic) |
| D7 | Helm chart 默认 tag/锁版本方式/values 参考 | P0-21(后续 topic) |
相关文档
- [03-deployment-ops/OCTO部署形态总览.md](OCTO部署形态总览.md) v1.0 — 端口/组件/必选可选/HTTPS/SigV4
- [09-version-change/OCTO版本口径.md](../09-version-change/OCTO版本口径.md) v1.1 — 版本号/锁版本规则
- [07-faq-troubleshooting/README.md](../07-faq-troubleshooting/README.md) v0.1 — 通用FAQ(含3条运维FAQ)
- [06-api-integration/OCTO-Bot-API接入快速上手指南-v0.1.md](../04-api-integration/OCTO-Bot-API接入快速上手指南-v0.1.md) — apiBase/反代/CORS 调试
- [代码仓库解读/octo-server启动流程.md](../代码仓库解读/octo-server启动流程.md) v0.1 — 中间件/限流/metrics 启动顺序
v0.1 边界说明
- 端口/反代/锁版本/必选依赖/限流/CORS/migration 有源码或产品管家直接证据,confidence:high;
- HA/备份恢复/Helm/WuKongIM版本/MatterSummary 进程形态待产品管家回答,标"待补",不编造;
- 本文不替代官方部署手册;后续配合 03-deployment-ops/ 单机部署 / K8s 部署 / 备份恢复 等子页形成完整部署手册。