企业网盘
- 内部部署仓库 docker-compose.yaml / Helm values.yaml(deployment-drive.yaml/configmap-drive.yaml/job-drive-migrate.yaml)/ nginx 路由配置 / init-extra-dbs.sh(2026-09-21 阶段一+旧版解析)
- OCTO知识库建设组父群 / 2026-09-21 13:21-14:00 / Octo产品管家回答 (message_id:2101905330496507904, 2101915123915329536)
- 00-inbox/product-bot-answers/2026-09-21-P0扩展-Drive网盘模块回答.md
- 00-inbox/product-bot-answers/2026-09-22-P1-round2-Q6-Drive网盘深度回答.md(P1 Round2源码确认,message_id:2102200499716395008)
- 旧版 01-product/模块说明/网盘Drive模块.md(2026-09-21,部署配置推断版,已归档到99-archive/)
Drive网盘模块说明 v0.3
Drive(网盘)是 OCTO 内部版独有的企业级文件存储与协作模块,提供个人空间和共享空间两级文件管理能力,仅 Web 端可用。
🔴P0安全结论:Bot对网盘零攻击面(源码确认级,2026-09-22 P1 Round2)
售前/交付/安全审计硬口径:Bot不能直接读写/枚举/分享用户Drive网盘文件。
- `/v1/bot/drive/`路由全仓0命中——不存在Bot直接操作Drive的API
- Bot文件路由仅4个(`/v1/bot/files/*`):upload / download / STS credentials / presigned PUT
- 上传key硬编码前缀`chat/`——只能操作聊天附件命名空间,文件不进入Drive
- 三重隔离:扩展名白/黑名单 + MaxUploadSize限制 + `chat/`前缀硬编码
一、模块定位(一句话口径,v0.3 P1 Round2更新)
网盘 = Octo 内置企业级文件存储/协作模块:仅 Web 端,`drive_on` 开关门控(默认 false),个人+共享两级Space空间;已确认支持增删改查/移动复制/分享(组织外访问存在但完整功能待私有仓确认)/成员邀请/独立搜索(Drive有独立搜索后端,不走开源octo-search-indexer消息附件管道)/聊天转存/文档挂载。
🔴 安全硬口径:Bot对网盘零攻击面(`/v1/bot/drive/`全仓0命中,Bot仅操作`chat/`命名空间消息附件,不进Drive)。
⚠️ 私有仓边界:预览格式清单/分享链接完整功能(密码/有效期/权限/频次/组织外)/权限继承细节/Drive独立搜索后端实现/版本管理/回收站/分片续传/单文件上限均在私有octo-drive仓,当前不可见。
二、部署与基础设施硬事实
2.1 主服务 octo-drive
| 项目 | 事实 | 来源 |
|---|---|---|
| 服务镜像 | hub2.intra.mlamp.cn/octo/octo-drive:v0.5.0(pin版,内网registry;distroless Go二进制,无shell) |
docker-compose / Helm deployment |
| 容器端口 | 8080(HTTP API) | docker-compose / Helm |
| 启动命令 | ["-config", "/etc/octo-drive/config.yaml"] |
docker-compose |
| 数据库 | MySQL octo_drive 库(utf8mb4_unicode_ci),用户 drive |
docker-compose / drive-preflight |
| 跨库读权限 | octo_docs.doc_meta、octo_docs.doc_member(SELECT,用于挂载云文档列表) |
drive-preflight 初始化脚本 |
| 对象存储 | MinIO bucket octo-drive(独立bucket,不与docs附件混用;Q6确认) |
docker-compose / minio-init / Q6 |
| S3 配置 | 通过rendered config.yaml(storage.endpoint)+ DRIVE_STORAGE_ACCESS_KEY_ID / DRIVE_STORAGE_SECRET_ACCESS_KEY 环境变量 |
configmap-drive / Helm configmap |
| TLS 信任 | AWS_CA_BUNDLE=/etc/octo-drive-certs/fullchain.pem(自签证书S3端点信任) |
docker-compose |
| 健康检查 | ❌ 无liveness/readiness probe(distroless镜像无shell/curl,通过nginx代理可达/health) | Helm deployment |
| 存储卷 | drive-config(只读挂载rendered config)、certs(只读) | docker-compose / Helm |
| 依赖服务 | drive-config(渲染配置)、drive-migrate(schema迁移)、octo-server(认证/集成)、minio-init(bucket预创建) | docker-compose depends_on |
| 内部 Token | DRIVE_OCTO_SERVER_INTERNAL_TOKEN = OCTO_NOTIFY_INTERNAL_TOKEN(与octo-server内部通信鉴权) |
Helm / docker-compose env |
| Kafka 开关 | DRIVE_KAFKA_DISABLED=true(默认关闭,启用drive-index profile时设false) |
Helm values / configmap |
| 搜索开关 | DRIVE_SEARCH_DISABLED=true(默认关闭,启用时后端对接OpenSearch) |
Helm values / configmap |
| 搜索后端 | DRIVE_SEARCH_URL=http://search-opensearch:9200 |
configmap |
| Profile 开关 | drive_on(默认 false,需显式开启);drive-index 为附加profile(依赖 drive + search) |
docker-compose profiles / Helm values |
| 客户端 | 仅 Web 端,iOS/Android 未实现 | p1 产品管家回答 |
| nginx 路由 | /drive/(前端)、/drive-api/→octo-drive:8080、/v1/drive/(用户侧API)、/v1/user/drive/(用户侧别称);⚠️/v1/bot/drive/不存在(P1源码确认:全仓0命中,Bot文件路由仅在/v1/bot/files/*且硬编码chat/前缀,不进Drive) |
nginx web default.conf.template + P1 Round2 Q6源码确认 |
| SSRF 防护 | ALLOWED_DOWNLOAD_HOSTS / SSRF_ALLOW_LOOPBACK=false(drive-indexer侧配置) |
drive-indexer 配置 |
2.2 初始化/一次性服务
| 服务 | 镜像 | 功能 | 来源 |
|---|---|---|---|
| drive-config | busybox | 从 drive-config.yaml.template 渲染 /etc/octo-drive/config.yaml,替换 @@STORAGE_ENDPOINT@@ 为实际S3端点。因 octo-drive v0.5.0 不支持 storage.endpoint 环境变量覆盖,必须预渲染。 |
docker-compose / Helm configmap |
| drive-preflight | octo 内部镜像 | 创建 octo_drive 数据库(utf8mb4_unicode_ci)+ drive@'%' 用户 + GRANT ALL PRIVILEGES + 授予 octo_docs 读权限(doc_meta/doc_member SELECT)。含密码校验(非空/非CHANGE_ME/合法字符集)。 |
docker-compose / init-extra-dbs.sh |
| drive-migrate | migrate/migrate:v4.18.3 |
执行 docker/drive/migrations/ 下的SQL迁移文件(golang-migrate),"no change"视为成功。 |
docker-compose / Helm job-drive-migrate |
2.3 Drive-Index 关联组件(drive-index profile 附加,依赖 drive + search)
⚠️ Q6 P0纠偏后更新:部署配置中`drive-indexer`/Tika/Kafka `octo.driveindex.v1` topic/OpenSearch `octo-drive`索引均存在,但octo-search-indexer开源仓仅处理消息附件抽取(`octo.message.v1` topic),不处理Drive文件。Drive搜索后端是octo-drive私有仓独立实现,开源仓无`octo.driveindex.v1`消费逻辑。部署组件存在 ≠ 开源仓逻辑,需以私有仓octo-drive源码为准。
| 服务 | 端口 | 功能(部署配置描述) | 来源 |
|---|---|---|---|
| drive-indexer | 3200 | Kafka消费者(topic: octo.driveindex.v1),经Tika提取文件文本→写入OpenSearch octo-drive索引;⚠️Q6确认:此组件属私有octo-drive仓,非开源octo-search-indexer |
docker-compose / Helm + Q6 |
| tika | 9998 | Apache Tika 3.3.0.0,文件格式文本提取(PDF/Word/Excel/PPT等),供drive-indexer使用 | docker-compose + Q6 |
| drive-index-kafka-init | — | 创建 octo.driveindex.v1 / .retry.v1 / .dlq.v1 三个 Kafka topic |
docker-compose kafka-init job |
| drive-index-ensure | — | 等待 tika 就绪后创建 octo-drive OpenSearch index |
docker-compose ensure job |
- 开源octo-search-indexer仓不含drive-indexer逻辑——开源仓仅消费`octo.message.v1`做消息附件Tika抽取
- drive-indexer镜像是`hub2.intra.mlamp.cn/octo/octo-drive-indexer:v0.1.0`(内网pin版),属私有octo-drive仓组件
- 部署配置存在drive-index profile组件,但Q6确认octo-web `drive/search` POST走独立搜索后端(highlights.name/body双字段+content_meta.extractor走Tika+OS)
- 索引延迟/删除同步机制=私有仓不可见
三、已确认能力(P1 Round2 Q6源码确认更新)
3.1 文件操作
- 上传、下载文件
- 浏览(文件列表/目录)
- 搜索(文件名+文件内容全文搜索,Web v2026.08.24 起支持内容搜索)
- 删除、重命名、移动、复制文件与文件夹
- 新建文件夹(空间内目录管理)
- 大文件分片上传/断点续传机制
- 单文件大小上限
- 文件版本管理/版本历史
- 回收站机制与保留策略
3.2 文件预览机制(Q6源码确认级)
- server侧预览 = 302重定向到对象存储URL,直接由MinIO/S3返回文件
- ❌ 无OnlyOffice/LibreOffice/Tika服务端渲染引擎证据(Tika仅用于搜索索引正文抽取,不做在线预览渲染)
- 未知扩展名强制
Content-Disposition: attachment(触发浏览器下载而非内联渲染),防XSS - Web侧路由映射:blob文件→
/drive/f/,doc云文档→/d/
- 具体可预览格式清单(PDF/Office/图片/视频/音频/代码/文本哪些支持内联预览)
- 预览大小限制(大文件是否截断/分页)
- 预览缩略图生成机制
- 网盘可「挂载云文档」(
listMountedDocs) - Web v2026.09.14 优化了「网盘中文档的打开与访问体验」——文档类打开有专门优化(→
/d/路由)
3.3 分享链接(Q6源码确认级修正)
- 预签名URL = 对象存储级STS(STS credentials / presigned PUT/GET),由对象存储直接签名生成临时访问URL
- 组织外访问:产品管家前期确认外部成员可打开分享链接(但完整功能链路待私有仓确认)
- 预签名URL本身无密码保护
- 无权限粒度控制(只读/编辑/上传等)
- 无访问次数限制
- 无IP限制
- 有效期仅由对象存储签名过期时间控制
- 是否有密码保护分享链接功能
- 是否支持有效期自定义设置
- 是否有权限粒度(只读/可编辑/可上传)
- 是否有访问频次限制
- 组织外访问完整控制策略
⚠️ 售前口径:可表述"支持分享链接/组织外访问",但"密码保护/权限控制/有效期"等高级功能不能确认,需实测或等私有仓开放。
3.4 权限模型(Q6源码确认级补充)
- 两级空间:个人空间(Personal Space) + 共享空间(Shared Space)
- Space三档角色:
0=普通成员 /1=管理员 /2=拥有者 - 核心数据模型字段(源码确认):
space_id:所属空间owner_uid:拥有者UIDtype:类型枚举doc(云文档)|blob(文件)|folder(文件夹)parent_id=0:空间根目录scope:all(全部)|space(空间内)owner_scope:me(我的)|others(他人的)- 共享空间支持成员管理:
add/update/remove member - 共享空间支持角色调整
- 共享空间支持邀请链接:
create/list/revoke invite - 权限独立于聊天(Q6确认)
- 个人空间 vs 团队空间的精确隔离规则
- 文件夹级权限继承规则
- 协作者角色精确枚举(owner/editor/viewer/uploader等完整分级)
- Drive权限与Docs云文档权限的独立性边界
- 群转发文件的权限归属
3.5 搜索机制(Q6 P0纠偏+独立搜索后端确认)
- Kafka topic:仅
octo.message.v1(消息事件),consumer groupfile-extractor - 处理逻辑:
payload.type=8→ 下载消息附件 → Apache Tika → OpenSearch partial update写payload.file.content - Tika黑名单:
.mp4/.zip/.jpg等媒体/压缩/图片格式排除 - 内容截断:256KB
- DLQ错误分类处理
- tombstone + 读时MySQL join过滤revoke/delete
- ❌ 无
octo.driveindex.v1topic消费逻辑——开源仓不管Drive
- API:
POST drive/search - 高亮字段:
highlights.name(文件名)+highlights.body(文件正文)双字段 - 正文抽取:
content_meta.extractor走Tika+OpenSearch - Drive搜索后端位于私有octo-drive仓
- Drive独立搜索后端的完整实现(是否经Kafka/索引延迟/删除同步机制)
- 部署配置中
octo.driveindex.v1topic/drive-indexer与前端drive/search的对应关系 - 搜索权限过滤细节
四、Bot/API 能力与模块联动(Q6更新)
4.1 Bot API 能力(D-05 ✅ P0已关闭)
/v1/bot/drive/路由全仓0命中——不存在Bot直接操作Drive的API- Bot文件路由仅4个(
/v1/bot/files/*):upload / download / STS credentials / presigned PUT - 上传key硬编码前缀
chat/——只能操作聊天附件命名空间 - 结论:Bot对Drive零攻击面
4.2 存储架构补充(Q6确认)
- Drive文件存
octo-drivebucket(已确认) - Docs附件存
octo-docs-attachmentsbucket(独立bucket,不混用)
- 文件版本管理/版本历史机制
- 回收站机制与保留策略
- 大文件分片上传/断点续传机制
- 单文件大小上限
4.3 与其他模块联动
- Drive ↔ Docs:云文档可挂载到网盘空间(
listMountedDocs);Docs附件存独立bucketocto-docs-attachments - Drive ↔ 聊天:聊天文件可转存到网盘(Web v2026.08.10+);但Drive文件不进入Bot可操作的
chat/命名空间
- Drive文件反向作为消息附件发送的权限链路
- Drive文件作为AI Bot知识源(🔴Bot零面结论下,Bot不能直接读取Drive文件;若需作为知识源需经用户主动分享/转存链路)
- Drive与Docs的其他联动(如drive文件插入文档等)
4.4 典型场景
- 企业网盘:个人空间+共享空间集中存储管理
- 团队协作文件共享:共享空间+成员三档角色+邀请链接
- 聊天文件沉淀:聊天中收到的文件一键转存到网盘
- 文件内容搜索:独立搜索后端,文件名+正文全文检索
- 「AI 知识库文件源」——Bot对Drive零攻击面,不能直接读取Drive文件作为知识源;需经用户转存等中间链路
- 「在线预览编辑Office文档」——server侧无OnlyOffice/LibreOffice渲染证据
五、待确认项汇总(知识库行动项,v0.3更新)
| 编号 | 待确认项 | 确认方式 | 优先级 | 状态 |
|---|---|---|---|---|
| D-01🔴 | 大文件分片上传/断点续传/单文件大小上限 | 私有octo-drive仓/实测 | P1 | 待确认 |
| D-02🔴 | 文件预览格式清单/大小限制/缩略图机制 | 私有octo-drive仓/实测 | P1 | 待确认 |
| D-03🔴 | 分享链接完整功能(密码/有效期/权限粒度/频次/组织外控制) | 私有octo-drive仓,confidence最低,标"待确认需实测" | P1 | 待确认 |
| D-04🔴 | 文件夹级权限继承+协作者角色枚举+个人vs团队隔离+群转发权限+Docs权限独立性 | 私有octo-drive仓/实测 | P1 | 待确认 |
| ~~D-05~~ | ~~/v1/bot/drive/ Bot API 实际暴露能力~~ |
✅P0关闭:全仓0命中,Bot对Drive零攻击面 | P0 | ✅已关闭 |
| D-06 | Drive文件反向作为消息附件/知识源的链路(Bot零面约束下的可行路径) | 查octo-server源码+产品设计 | P1 | 待确认 |
| D-07🔴 | Drive独立搜索后端实现细节(索引延迟/删除同步/权限过滤);drive-indexer部署组件与前端drive/search的对应关系 |
私有octo-drive仓 | P1 | 待确认 |
| D-08🔴 | 文件版本管理/版本历史/回收站机制/保留策略 | 私有octo-drive仓 | P2 | 待确认(Q6新增) |
六、与其他模块的关系
| 模块 | 关系 | 状态 |
|---|---|---|
| Docs(云文档) | 独立模块;云文档可挂载到网盘空间(/d/路由);Docs附件存独立bucket octo-docs-attachments,不与Drive混用;权限独立性待确认 |
✅部分确认 |
| 聊天/IM | 聊天文件可转存到网盘(Web v2026.08.10+);Bot仅操作chat/命名空间附件,不进Drive |
✅已确认 |
| octo-server | 通过DRIVE_OCTO_SERVER_INTERNAL_TOKEN内部通信;/v1/bot/drive/不存在(P0确认);用户侧API经/v1/drive/和/v1/user/drive/;预览走302重定向到对象存储 |
✅P0安全确认+路由确认 |
| MinIO | 对象存储后端,octo-drive bucket;预签名URL=STS级(无密码/权限/次数/IP限制);Docs附件存octo-docs-attachments独立bucket |
✅部署事实+Q6确认 |
| MySQL | 元数据存储,octo_drive库;跨库读octo_docs.doc_meta/doc_member |
✅部署事实 |
| Tika | Drive搜索索引正文抽取(drive-indexer组件使用,非预览渲染) | ✅Q6确认(搜索用途) |
| OpenSearch | Drive独立搜索后端索引(octo-drive索引);DRIVE_SEARCH_URL配置 |
✅部署事实+Q6确认 |
| Kafka | drive-index profile下octo.driveindex.v1 topic存在;但开源octo-search-indexer不消费此topic,drive-indexer属私有仓组件 |
⚠️部署存在/开源仓不处理/私有仓确认 |
| octo-search-indexer(开源仓) | 🔴Q6确认:开源仓仅处理消息附件(octo.message.v1 topic, chat/命名空间),不处理Drive文件索引;Drive有独立搜索后端 |
✅Q6 P0纠偏 |
七、版本记录
- v0.1(2026-09-21):基于内部部署仓库硬事实 + 产品管家 Q1-Q2 回答新建;严格保留所有「待确认」标注
- v0.2(2026-09-22):P1 Round2 Q6第一阶段回填——①frontmatter升级(source新增Q6来源,confidence更新为medium含P0安全high/私有仓low分档);②🔴P0安全结论醒目标注(Bot对网盘零攻击面,
/v1/bot/drive/全仓0命中,chat/前缀三重隔离);③nginx路由修正(/v1/bot/drive/不存在,Bot文件路由仅/v1/bot/files/*);④D-05标注为P0关闭状态 - v0.3(2026-09-22):P1 Round2 Q6深度回答完整回填——①§预览机制重写:server侧=302重定向到对象存储URL、无OnlyOffice/LibreOffice/Tika渲染、未知扩展名attachment防XSS、Web路由blob→
/drive/f//doc→/d/、格式清单/大小限制=私有仓;②§分享链接修正:全仓无share外链产品级模块、预签名URL=对象存储STS级无密码/权限/次数/IP限制、密码/有效期/权限/频次/组织外=私有仓"待确认需实测";③§权限模型补充:Space三档角色0/1/2、数据模型字段space_id/owner_uid/type/parent_id=0/scope/owner_scope、个人vs团队/文件夹继承/协作者/群转发=私有仓;④§搜索机制P0纠偏:octo-search-indexer开源仓仅管消息附件(octo.message.v1/file-extractor/Tika黑名单/256KB截断/DLQ/tombstone),无octo.driveindex.v1消费,Drive有独立搜索后端(drive/searchPOST/highlights.name+body/content_meta.extractor走Tika+OS,私有octo-drive仓);⑤§存储架构补充:octo-drivebucket确认、Docs附件octo-docs-attachments独立bucket不混用、版本管理/回收站/分片续传/单文件上限=私有仓;⑥待确认项表更新:D-05关闭、新增D-08版本回收站/分片续传、所有私有仓项标注🔴;⑦§一模块定位更新,加入P0安全要点和私有仓边界;⑧§二部署硬事实中drive-index说明加入Q6纠偏;⑨§六模块关系表更新octo-search-indexer纠偏+Tika用途修正+MinIO bucket划分