单机 Docker 部署
- source-repos-internal/octo-deployment/docker/docker-compose.yaml
- source-repos-internal/octo-deployment/docker/docker-compose-setup.sh
- source-repos-internal/octo-deployment/docker/README.md
- source-repos-internal/octo-deployment/docker/scripts/
- 02-architecture/OCTO全组件服务清单.md
- 03-deployment-ops/基础设施依赖映射.md
- 03-deployment-ops/OCTO部署形态总览.md
单机 Docker Compose 部署 SOP v1.0
本文档面向单机评估/PoC/内部试用场景,提供从裸机到可用的全流程。生产多节点部署请参考 K8s Helm SOP。
所有命令、端口、路径、环境变量均来自 `docker-compose.yaml` 和 `docker-compose-setup.sh`,不确定处标注待验证。
一、前置要求
1.1 操作系统
- Linux x86_64(推荐 Ubuntu 22.04 / Debian 12 / CentOS 8+)
- kernel ≥ 4.18(支持 OverlayFS)
- macOS(Docker Desktop 4.x,注意文件系统性能)
- 不推荐 Windows/WSL2(文件权限和挂载路径易踩坑)
1.2 软件版本
| 软件 | 最低版本 | 推荐版本 | 验证命令 |
|---|---|---|---|
| Docker Engine | ≥ 24.0 | 26.x+ | docker --version |
| Docker Compose (v2 plugin) | ≥ 2.20 | 2.24+ | docker compose version |
| openssl | ≥ 1.1.1 | 3.x | openssl version |
⚠️ 必须使用 Docker Compose v2(`docker compose` 命令,无连字符),不支持 `docker-compose` v1 Python 版本。
1.3 硬件最低配置
| 场景 | CPU | 内存 | 磁盘 |
|---|---|---|---|
| 核心7件套(最小评估) | 2核 | ≥4 GiB | ≥10 GiB 空闲 |
| +summary/speech/docs/drive | 4核 | ≥8 GiB | ≥30 GiB |
| +全套(含search/fleet所有模块) | 8核 | ≥16 GiB | ≥50 GiB SSD |
⚠️ 以上为单机评估参考值,来自 docker/README.md 说明(≥4 GiB/≥10 GiB)。生产资源规格待产品管家确认。
1.4 网络与域名
- 对外唯一端口:HTTP
28080(默认)或 HTTPS28443(默认),仅需在防火墙开放这一个端口 - 内部服务端口全部绑定
127.0.0.1,不对外暴露 - 域名/IP:准备一个可被客户端访问的域名(如
octo.example.com)或 IP 地址(如192.168.1.100) - 证书:自签名证书由
docker-compose-setup.sh自动生成;生产环境请使用可信 CA 证书(Let's Encrypt 等) - Docker 网络:compose 自动创建
octo-net网桥(默认子网172.28.0.0/24)
二、步骤0:克隆部署仓库
# 内部部署仓库(根据实际地址替换)
git clone octo-deployment
cd octo-deployment/docker
仓库路径:`source-repos-internal/octo-deployment/`,实际部署时替换为客户侧部署包路径。
三、步骤1:环境准备
3.1 自动方式(推荐):运行 docker-compose-setup.sh
cd octo-deployment/docker
# 最简用法:一个参数指定域名/IP
./docker-compose-setup.sh octo.example.com
# 指定内网镜像仓库 + LLM 网关(内网部署示例)
./docker-compose-setup.sh 192.168.216.98 \
--registry hub2.intra.mlamp.cn/octo \
--llm-url https://llm-gateway.mlamp.cn \
--llm-key sk-****
# 指定 HTTPS 端口(默认 28443)
OCTO_HTTPS_PORT=443 ./docker-compose-setup.sh octo.example.com
# 自定义启用哪些模块(默认全启)
COMPOSE_PROFILES=summary,speech,docs,drive ./docker-compose-setup.sh octo.example.com
# 强制重新生成证书和 .env(⚠️ 会覆盖已有密钥,已运行的生产禁用)
FORCE=true ./docker-compose-setup.sh octo.example.com
- 证书生成在
certs/fullchain.pem(公开证书/信任锚)和certs/privkey.pem(私钥,chmod 600) .env生成在当前目录(chmod 600)- nginx 443 server block 被自动启用
3.2 手动方式:从 .env.example 开始(不推荐)
cp .env.example .env # 如果存在 .env.example
# 或者直接创建空 .env,逐项填入以下必填项
| 环境变量 | 用途 | 生成命令 | 长度要求 |
|---|---|---|---|
OCTO_DOMAIN |
对外访问域名/IP | 手动填写 | — |
MYSQL_ROOT_PASSWORD |
MySQL root 密码 | openssl rand -hex 16 |
仅允许 [A-Za-z0-9._-] |
MINIO_ROOT_PASSWORD |
MinIO root 密码 | openssl rand -hex 16 |
≥8 字符 |
OCTO_MINIO_APP_PASSWORD |
MinIO 应用用户 octo-app 密码 | openssl rand -hex 24 |
仅允许 [A-Za-z0-9._-] |
OCTO_MASTER_KEY |
OCTO 主加密密钥(32字节) | openssl rand -hex 16 |
必须恰好 32 hex 字符 |
OCTO_NOTIFY_INTERNAL_TOKEN |
服务间 HMAC 鉴权令牌 | openssl rand -hex 32 |
≥32 hex;禁止 CHANGE_ME 占位 |
OCTO_WUKONGIM_MANAGER_TOKEN |
WuKongIM Manager API 令牌 | openssl rand -hex 32 |
≥32 hex;禁止 CHANGE_ME 占位 |
OCTO_ADMIN_PWD |
首次创建的超管密码 | openssl rand -base64 18 |
非空即生效 |
OCTO_MARKETPLACE_DB_PASSWORD |
Marketplace DB 密码 | openssl rand -hex 16 |
不能是字面默认 "marketplace" |
| 模块 | 变量 | 生成命令 |
|---|---|---|
| summary | OCTO_SUMMARY_DB_PASSWORD, OCTO_SUMMARY_READER_PASSWORD |
openssl rand -hex 16 (各一个) |
| summary | LLM_API_URL, LLM_API_KEY, LLM_MODEL(默认 claude-sonnet-4-6) |
手动填写 LLM 网关信息 |
| speech | SPEECH_DB_PASSWORD, SPEECH_ADMIN_PASSWORD, SPEECH_ADMIN_JWT_SECRET |
hex 16/16/32 |
| speech | VOICE_QWEN_URL, VOICE_QWEN_KEY(默认 qwen 引擎) |
手动填写语音 API |
| docs | OCTO_DOCS_DB_PASSWORD, OCTO_DOCS_COLLAB_SECRET, OCTO_DOCS_ATTACHMENT_SECRET |
hex 16/32/32 |
| drive | OCTO_DRIVE_DB_PASSWORD |
openssl rand -hex 16 |
| fleet | FLEET_POSTGRES_PASSWORD, FLEET_JWT_SECRET, FLEET_LOOP_CREDENTIAL_HMAC_KEY |
hex 16/32/32 |
3.3 TLS 证书手动准备(如不用 setup.sh)
mkdir -p certs
# 将你的证书文件放到 certs/ 目录下:
# certs/fullchain.pem — 完整证书链(含 CA)
# certs/privkey.pem — 私钥
chmod 600 certs/privkey.pem
# 同时需手动取消 nginx 443 端口、certs 挂载、drive AWS_CA_BUNDLE 的注释
四、步骤2:核心服务启动
2.1 启动核心基础服务(无 profile)
cd octo-deployment/docker
# 启动核心服务(mysql/redis/minio/wukongim/nginx/octo-server/web/admin/marketplace + 所有 init 容器)
docker compose up -d
# 等待所有服务 healthy(--wait 阻塞等待)
docker compose up -d --wait
- `preflight` — 检查密钥非空、非 CHANGE_ME 占位符
- `mysql` — 冷启动 30-90s,首次启动运行 `init-extra-dbs.sh` 创建各模块 DB
- `minio` + `minio-init` — 创建 IAM 用户 octo-app + 13 个 bucket + 匿名下载策略
- `wukongim` — 启动 IM 长连接服务
- `market-preflight` — 幂等创建 octo_marketplace 库和用户
- `octo-server` — 核心后端启动(start_period 60s)
- `botfather-robot` — 设置 botfather 用户 robot=1
- `nginx` + `web` + `admin` + `marketplace` — 前端和网关
2.2 查看启动状态
# 查看所有容器状态
docker compose ps
# 查看实时日志
docker compose logs -f
# 查看特定服务日志
docker compose logs -f octo-server
五、步骤3:健康检查
| # | 服务 | 健康检查 URL/命令 | 预期输出 | 常见失败原因 |
|---|---|---|---|---|
| 1 | nginx | curl -s http://localhost:28080/_nginx_up |
200 ok |
nginx 配置错误/证书缺失 |
| 2 | mysql | docker compose exec mysql mysqladmin ping -h 127.0.0.1 -u root -p"$MYSQL_ROOT_PASSWORD" --silent |
mysqld is alive |
首次启动 init 脚本错误;密码含特殊字符 |
| 3 | redis | docker compose exec redis redis-cli ping |
PONG |
— |
| 4 | minio | curl -s http://localhost:29000/minio/health/live |
200 | MINIO_ROOT_PASSWORD < 8 字符 |
| 5 | wukongim | curl -s -H "token: $OCTO_WUKONGIM_MANAGER_TOKEN" http://localhost:25001/health |
200 | token 不对;start_period 内还在初始化 |
| 6 | octo-server | curl -s http://localhost:28081/v1/ping |
pong(或类似文本) |
依赖服务未就绪;OCTO_MASTER_KEY 长度不对 |
| 7 | web | curl -s -o /dev/null -w "%{http_code}" http://localhost:28083/ |
200 |
octo-server 未 healthy |
| 8 | admin | curl -s -o /dev/null -w "%{http_code}" http://localhost:28082/admin/ |
200 |
octo-server 未 healthy |
| 9 | marketplace | curl -s http://localhost:28080/market/healthz(经 nginx) |
200 | DB 密码不对;market-preflight 未执行 |
| 10 | HTTPS | curl -sk https://localhost:28443/_nginx_up |
200 ok |
证书路径错误;nginx 443 block 未启用 |
# setup.sh 生成的环境可直接 curl
curl -s http://localhost:28080/_nginx_up && echo " ✅ nginx ok"
curl -s http://localhost:28080/v1/ping && echo " ✅ octo-server ok"
curl -sk https://localhost:28443/_nginx_up && echo " ✅ HTTPS ok"
六、步骤4:初始化超管账号
方式A(推荐):.env 自动引导(docker-compose-setup.sh 默认支持)
- 用户名:
superAdmin - 密码:
.env中OCTO_ADMIN_PWD的值
# 查看自动生成的 admin 密码
grep OCTO_ADMIN_PWD .env
⚠️ 该引导是 one-shot:admin 行创建后重启不再执行。登录后请立即修改密码,并考虑从 `.env` 删除 `OCTO_ADMIN_PWD`。
方式B:手动创建(如果未设 OCTO_ADMIN_PWD)
# 生成 bcrypt hash
docker compose exec octo-server wget -qO- --post-data="..." # 待验证:推荐通过API或直接SQL
# 直接SQL方式(在mysql容器内执行)
# 密码需要是 bcrypt hash;可用 htpasswd 或 python bcrypt 生成
# 角色必须是字符串 'superAdmin'
七、步骤5:开启内部模块(按 Profile 逐个开启)
开启 Profile 的通用方法
# 例如开启 summary 和 speech
# 编辑 .env,设置:
# COMPOSE_PROFILES=summary,speech
docker compose up -d
docker compose up -d --wait
5.1 开启 Summary(智能摘要)
- 核心服务 healthy
- LLM API 可用(
LLM_API_URL/LLM_API_KEY/LLM_MODEL已配置) OCTO_SUMMARY_DB_PASSWORD/OCTO_SUMMARY_READER_PASSWORD已生成
# 在 .env 中加入/修改:
# COMPOSE_PROFILES=summary
docker compose up -d
# summary-api 健康检查
curl -s http://localhost:28087/ # 直连 summary-api:8080
# 经 nginx 路由
curl -s http://localhost:28080/summary/api/v1/health # 待验证:具体路径
# 查看容器
docker compose ps summary-api summary-worker
5.2 开启 Speech(语音转写)
- 核心服务 healthy
- 语音引擎 API 可用(默认 qwen,需
VOICE_QWEN_URL/VOICE_QWEN_KEY/VOICE_QWEN_MODELS) SPEECH_DB_PASSWORD/SPEECH_ADMIN_PASSWORD/SPEECH_ADMIN_JWT_SECRET已生成
# COMPOSE_PROFILES=speech
docker compose up -d
# speech-admin 控制台(仅 SSH 隧道可达)
ssh -L 28088:127.0.0.1:28088 user@host
# 浏览器访问 http://localhost:28088/speech-admin
# 登录后创建应用,获取 SPEECH_API_KEY
# 在 .env 中添加:
# SPEECH_API_KEY=sk-***
# 重启 octo-server
docker compose up -d --force-recreate octo-server
5.3 开启 Docs(文档协同)
- 核心服务 healthy(mysql/redis/minio-init 均已完成)
OCTO_DOCS_DB_PASSWORD/OCTO_DOCS_COLLAB_SECRET/OCTO_DOCS_ATTACHMENT_SECRET已生成(均 ≥32 hex)
# COMPOSE_PROFILES=docs
docker compose up -d
# docs-backend REST API
curl -s http://localhost:28080/api/v1/docs/ # 经 nginx
# 查看 docs-preflight/migrate 是否成功
docker compose logs docs-preflight
docker compose ps octo-docs-backend
5.4 开启 docs-html(HTML文档渲染,依赖docs)
- 已启用
docsprofile 且 octo-docs-backend healthy DOCS_BACKEND_INTERNAL_REGISTER_TOKEN已生成(32 hex)
# COMPOSE_PROFILES=docs,docs-html
docker compose up -d
curl -s http://localhost:28080/docs-html/ # 经 nginx
docker compose logs docs-html-migrate
5.5 开启 Drive(企业网盘)
- 核心服务 healthy
OCTO_DRIVE_DB_PASSWORD已生成- ⚠️
OCTO_DOMAIN不能设为 localhost/127.0.0.1(drive-config 会警告,容器内无法访问宿主机 loopback)
# COMPOSE_PROFILES=drive
docker compose up -d
# drive 无 liveness probe(distroless 镜像),通过 nginx 验证
curl -s http://localhost:28080/v1/drive/ # 经 nginx
docker compose ps drive
docker compose logs drive-config drive-migrate
5.6 开启 Fleet/Loop(回路与运行时管理)
- 核心服务 healthy(redis/octo-server healthy)
FLEET_JWT_SECRET(≥32 hex)、FLEET_LOOP_CREDENTIAL_HMAC_KEY(≥32 hex)已生成- 使用内置 PG 时还需
FLEET_POSTGRES_PASSWORD
# 使用内置 PostgreSQL:
# COMPOSE_PROFILES=fleet,fleet-db
# 使用外部 PostgreSQL(需设 FLEET_DATABASE_URL):
# COMPOSE_PROFILES=fleet
docker compose up -d
# fleet-postgres 健康
docker compose exec fleet-postgres pg_isready -U fleet -d fleet
# fleet API
curl -s http://localhost:28089/healthz # 直连
curl -s http://localhost:28080/fleet/api/healthz # 经 nginx(待验证具体路径)
docker compose ps octo-fleet fleet-postgres
5.7 开启 Search(消息全文搜索)
- 核心服务 healthy(尤其是 mysql/octo-server 已至少启动过一次,确保
octo_etl_es_cursor表已由 octo-server migration 创建) - 预留足够内存(OpenSearch + Kafka 各约 0.5-1 GiB)
# COMPOSE_PROFILES=search
docker compose up -d
# 1. Kafka 启动
docker compose ps search-kafka
# 2. OpenSearch 启动(首次较慢)
curl -s http://localhost:29200
docker compose ps search-opensearch
# 3. search-kafka-init 创建 topic octo.message.v1 + .dlq
docker compose logs search-kafka-init
# 4. search-ensure 创建索引 octo-message + alias wukongim-messages-read
docker compose logs search-ensure
# 5. es-indexer 启动消费
docker compose ps es-indexer
# 待验证:脚本路径和参数
# cd octo-deployment/docker
# bash scripts/search-upgrade.sh
# 手动分步操作(脚本失败时参考):
# 1. 种子游标(防止 producer 回放全历史)
COMPOSE_PROFILES=search,search-tools docker compose up -d search-cursor-seed
docker compose logs search-cursor-seed
# 2. 历史回填
COMPOSE_PROFILES=search,search-tools docker compose up -d search-backfill
docker compose logs -f search-backfill
# 等待 backfill 完成(exit 0)
# 3. 切换 octo-server 到 ES 搜索后端
# 在 .env 中设置:
# OCTO_SEARCH_BACKEND=es
# OCTO_SEARCH_PRODUCER_ON=true
docker compose up -d octo-server
# OpenSearch 集群健康
curl -s http://localhost:29200/_cluster/health | python3 -m json.tool
# 索引文档数
curl -s http://localhost:29200/wukongim-messages-read/_count
# Kafka topic 列表
docker compose exec search-kafka /opt/kafka/bin/kafka-topics.sh --bootstrap-server localhost:9092 --list
5.8 开启 doc-index(文档索引,依赖 docs+search)
# COMPOSE_PROFILES=docs,search,doc-index
docker compose up -d
# doc-indexer 健康检查(容器内端口3100,无host映射,需docker exec)
docker compose exec doc-indexer wget -qO- http://localhost:3100/readyz
# 预期:返回 ok
docker compose ps doc-indexer
docker compose logs doc-index-kafka-init doc-index-ensure
OCTO_DOCS_SEARCH_INDEX_ENABLED=true
OCTO_DOCS_SEARCH_ENABLED=true
5.9 开启 drive-index(网盘文件索引,依赖 drive+search)
# COMPOSE_PROFILES=drive,search,drive-index
docker compose up -d
# Tika 文本提取服务
curl -s http://localhost:9998/version # tika(drive-index profile)
# drive-indexer(无 shell,通过日志验证)
docker compose logs drive-index-kafka-init drive-index-ensure
docker compose ps drive-indexer tika
OCTO_DRIVE_KAFKA_DISABLED=false
OCTO_DRIVE_SEARCH_DISABLED=false
5.10 Marketplace(默认启动)
curl -s http://localhost:28080/market/healthz
docker compose ps marketplace
八、步骤6:Nginx 验证与 HTTPS 配置
6.1 HTTP 验证
curl -s http://:28080/_nginx_up
# 预期:200 ok
curl -s http://:28080/_octo_up
# 预期:HTML 欢迎页
6.2 HTTPS 配置
curl -sk https://:28443/_nginx_up
# 预期:200 ok
certs/fullchain.pem— 服务器证书(含 CA 链)certs/privkey.pem— 服务器私钥
# 将你的证书文件覆盖到 certs/ 目录
cp /path/to/your/fullchain.pem certs/fullchain.pem
cp /path/to/your/privkey.pem certs/privkey.pem
chmod 600 certs/privkey.pem
docker compose restart nginx
MINIO_SERVER_URL=https://:
TS_MINIO_DOWNLOADURL=https://:
TS_EXTERNAL_BASEURL=https://:
OCTO_WK_WSS_ADDR=wss://:/ws
docker compose up -d nginx octo-server minio
6.3 前置反向代理(推荐生产做法)
# 让栈内 nginx 只监听 loopback
echo "OCTO_NGINX_BIND=127.0.0.1" >> .env
docker compose up -d nginx
⚠️ 不能用 `ufw deny 28080` 代替——Docker 端口走 iptables DOCKER chain,ufw 规则不生效。
九、步骤7:首次登录验证
7.1 登录信息
| 项 | 值 |
|---|---|
| Web 登录地址 | https://(HTTPS)或 http://(HTTP) |
| 管理后台地址 | https:// |
| 默认超管账号 | superAdmin |
| 默认超管密码 | .env 中 OCTO_ADMIN_PWD 的值 |
7.2 功能检查清单
- [ ] 登录成功,进入 Web 主界面
- [ ] 能看到联系人列表
- [ ] 能发送/接收文本消息
- [ ] WebSocket 连接正常(浏览器 F12 → Network → WS,
/ws连接 101 Switching Protocols) - [ ] 能上传图片/文件(验证 MinIO presigned URL)
- [ ] 头像/图片能正常显示(验证 MinIO 匿名下载策略)
- [ ] 管理后台
/admin/能正常访问 - [ ] 创建群聊,能邀请成员
- [ ] (如启用 summary)左侧「智能总结」入口可见,能触发总结
- [ ] (如启用 docs)左侧「文档」入口可见,能创建文档
- [ ] (如启用 drive)左侧「网盘」入口可见,能上传文件
- [ ] (如启用 fleet)管理员开启 dmloop 配置后左侧「回路」入口可见
- [ ] (如启用 speech)用户设置→语音设置能开启,能使用语音输入转文字(⚠️Web端不能发送语音消息type=4)
7.3 前端入口开关
- 登录 `https://
:28443/admin/` - 进入「系统配置」
- 分别开启:`docs配置`、`drive配置`、`dmloop配置`(回路)、`dmpersonal配置`
十、部署验证 Checklist
- [ ] 操作系统版本 ≥ Ubuntu 22.04 / Docker ≥ 24.0 / Docker Compose v2 ≥ 2.20
- [ ] 磁盘空间 ≥ 10 GiB 空闲(全模块 ≥ 50 GiB)
- [ ]
.env中所有密钥已生成(无 CHANGE_ME 占位符) - [ ]
OCTO_MASTER_KEY恰好 32 hex 字符 - [ ]
certs/fullchain.pem和certs/privkey.pem已就位 - [ ]
docker compose up -d无错误退出 - [ ] 所有核心容器状态为
Up(healthy) - [ ]
curl http://返回:28080/_nginx_up 200 ok - [ ]
curl http://返回正常响应:28080/v1/ping - [ ] HTTPS
curl -k https://返回:28443/_nginx_up 200 ok - [ ] 能用
superAdmin+OCTO_ADMIN_PWD登录 Web - [ ] WebSocket
/ws连接成功 - [ ] 文件上传/下载正常
- [ ] (按需)各内部模块 profile 已按顺序开启并验证
- [ ] 管理后台功能门控已正确开启
- [ ] 防火墙仅开放 28080/28443,内部端口仍绑定 127.0.0.1
- [ ] 已备份
.env文件到安全位置(密钥丢失 = 数据无法解密)
十一、常见报错与快速排查(Top 10)
1. preflight 容器 FATAL: XXX is still a CHANGE_ME placeholder
# 查看是哪个变量
docker compose logs preflight
# 重新生成
sed -i 's/^OCTO_NOTIFY_INTERNAL_TOKEN=.*/OCTO_NOTIFY_INTERNAL_TOKEN='$(openssl rand -hex 32)'/' .env
docker compose up -d
2. minio 容器反复重启,日志显示 "Server startup failed" 或密码长度错误
sed -i 's/^MINIO_ROOT_PASSWORD=.*/MINIO_ROOT_PASSWORD='$(openssl rand -hex 16)'/' .env
docker compose up -d minio minio-init
3. octo-server 启动失败,日志 "invalid master key" 或 "OCTO_MASTER_KEY length"
# 必须恰好 32 hex 字符 = openssl rand -hex 16
sed -i 's/^OCTO_MASTER_KEY=.*/OCTO_MASTER_KEY='$(openssl rand -hex 16)'/' .env
docker compose up -d octo-server
4. MySQL 启动后 init-extra-dbs.sh 报错或模块 DB 未创建
docker compose exec mysql mysql -u root -p"$MYSQL_ROOT_PASSWORD" -e "SHOW DATABASES;"
# 手动创建缺失的 DB(参考 scripts/init-extra-dbs.sh)
5. wukongim 健康检查失败,日志显示 token 认证错误
docker compose exec wukongim env | grep WK_MANAGERTOKEN
# 应与 .env 中 OCTO_WUKONGIM_MANAGER_TOKEN 一致
6. 浏览器访问显示证书不安全/自签名证书警告
- 评估/内部使用:浏览器点"高级"→"继续访问"即可
- 正式部署:替换
certs/下的证书为可信 CA 签发的证书 - OpenClaw/octo-daemon 信任问题:参见 docker/README.md 的证书配置章节(设置
NODE_EXTRA_CA_CERTS/SSL_CERT_FILE)
7. drive 上传文件失败,HeadObject 报连接拒绝
sed -i 's/^OCTO_DOMAIN=.*/OCTO_DOMAIN=192.168.x.x/' .env
docker compose up -d drive-config
docker compose restart drive
8. fleet 容器启动慢/反复重启(start_period 300s 内未 ready)
docker compose logs octo-fleet
# 常见原因:DATABASE_URL 不对/JWT_SECRET 太短
9. search profile 启动后搜索无结果
grep OCTO_SEARCH_BACKEND .env
grep OCTO_SEARCH_PRODUCER_ON .env
# 应为 es 和 true
curl -s http://localhost:29200/wukongim-messages-read/_count
# 应返回文档数
10. docker compose down -v 误删其他实例数据
- 部署前设置独立的 project name:
export COMPOSE_PROJECT_NAME=octo-prod
# 或在 .env 中加入 COMPOSE_PROJECT_NAME=octo-prod
down -v 前先确认卷名前缀: docker volume ls | grep "${COMPOSE_PROJECT_NAME:-octo}_"
docker volume rm octo_opensearch-data octo_kafka-data octo_search-dlq-spill
十二、运维速查
启停命令
# 启动所有(含已启用的 profiles)
docker compose up -d
# 停止
docker compose stop
# 重启单个服务
docker compose restart octo-server
# 查看日志
docker compose logs -f --tail=100
# 进入容器
docker compose exec octo-server sh
端口速查
| 端口 | 服务 | 说明 |
|---|---|---|
| 28080 | nginx | HTTP 主入口(0.0.0.0) |
| 28443 | nginx | HTTPS 主入口(0.0.0.0,setup.sh 自动启用) |
| 28081 | octo-server | REST 直连(127.0.0.1) |
| 28082 | admin | 管理后台直连(127.0.0.1) |
| 28083 | web | Web 直连(127.0.0.1) |
| 28086 | matter | AI 助手/任务服务直连(127.0.0.1) |
| 23306 | mysql | MySQL 直连(127.0.0.1) |
| 26379 | redis | Redis 直连(127.0.0.1) |
| 29000/29001 | minio | API/Console(127.0.0.1) |
| 25001/25100/25200/25300 | wukongim | API/TCP/WS/Monitor(127.0.0.1) |
| 25432 | fleet-postgres | Fleet PG 直连(127.0.0.1) |
| 28089 | octo-fleet | Fleet 直连(127.0.0.1) |
| 29092 | kafka | Kafka 外部(127.0.0.1) |
| 29200 | opensearch | OpenSearch 直连(127.0.0.1) |
卸载
# 停止并删除容器(保留数据卷)
docker compose down
# 停止并删除容器+数据卷(⚠️ 数据全丢,需打 YES 确认)
docker compose down -v
# 精确删除特定 profile 的卷(不影响核心数据)
docker volume rm octo_opensearch-data octo_kafka-data octo_search-dlq-spill