知行札记
DocFlow 实现与复用调查

DocFlow 外部后端与工程交付

说明仓库内外边界、鉴权刷新、上传、观测、Docker 与 CI。

本页整理自 2026-10-04 的 DocFlow 静态调查材料。原材料没有提供仓库 URL、分支或提交哈希;正文中的路径、行号、计数与依赖版本均指向该未锚定快照。本轮整理读取了归档报告,未取得原工作副本、启动产品或验证外部后端。下文的“复核”指原材料记载的复核,前端路径存在与运行可用性分别判断。

后端与部署真相

"无后端"的证据链(原材料逐项复核)

  1. workspace 结构:apps/ 仅 DocFlow;packages/ 为 transformer/bilibili/alert 三个编辑器与转换库包。
  2. NestJS/Prisma 零落地:grep '@nestjs' 全仓库零命中;无 *.prisma 文件;无 PrismaClient/@prisma/client/typeorm/mongoose/mysql2/pg 引用;pnpm-lock.yaml 中唯一 prisma 字符串是 @prisma/instrumentation@7.2.0(行 2677/11417/12362)——挂在 @sentry/node-core@10.38.0 依赖块下(复核勘误:调研原称 @sentry/opentelemetry,实为 @sentry/node-core),是 Sentry 的传递依赖,与业务无关。
  3. Hocuspocus 服务端零使用:@hocuspocus/server 在 package.json:52-53 声明(lockfile 实装 3.4.4),源码零 import;@hocuspocus/provider 恰好 4 个文件 import(useCollaboration.ts:3、extension-kit.ts:3、canvas.tsx:22、cursors-layer.tsx:3)。grep 'hocuspocus' 另命中 README.md:41-43 与 CONTRIBUTING.md:5 的文字提及(文档声明而非代码)。
  4. Next 服务端能力近零:src/app/api 仅 health 一个静态 route(9 行);AGENTS.md:15 明文 "Next.js App Router for routing only; no API routes";grep 'use server' 零命中——README.md:25 "通过 Server Actions 实现前后端通信" 不属实。
  5. 部署编排:docker-compose.yml 仅 1 个 app 服务(ghcr.io/xun082/docflow:latest,healthcheck 打 /api/health);Dockerfile 四阶段仅 turbo build DocFlow;prometheus/grafana/minio/rabbitmq/elasticsearch/kibana 全仓库仅 README 命中(lockfile 0 命中;logstash 连 README 都没有)。
  6. 佐证后端存在于仓库之外:Dockerfile:42 注释 "transformer excluded, backend-only"——packages/transformer 是为那个未开源后端准备的共享转换库,故意不进前端镜像。

鉴权流(原材料复核)

GitHub OAuth(auth/page.tsx:56-63 跳 ${SERVER_URL}/api/v1/auth/github;回调页用 code 调 GET /api/v1/auth/github/callback,auth/callback/page.tsx:10、services/auth/index.ts:58-66)+ 邮箱验证码(:29-36,43-46)/ 密码登录注册(:93-106)。token 存 cookie auth_token/refresh_token(utils/auth/cookie.ts:66-77);请求封装 401 时自动以 refresh_token + X-CSRF-Token 头调 /api/v1/auth/refresh 并重放排队请求(client.ts:131-205,244-253),业务请求带 Authorization Bearer(:285-289);src/proxy.ts:113-130 按 cookie 做路由守卫;协同 WS 连接携带 token: getAuthToken()。

请求层为自研双封装:client.ts(带认证/401 刷新/SSE 解析/Sentry 埋点)与 server.ts(RSC 无认证调用,:335 同以 NEXT_PUBLIC_SERVER_URL 为 baseURL);21 个业务模块全部调 /api/v1/* 前缀。ofetch 虽在依赖中但仅用于导出工具拉取二进制 blob(utils/export-doc/utils.ts:6,146),主请求层采用前述 client.ts 与 server.ts。

上传协议(原材料复核)

services/upload/index.ts:GET check-file?fileHash(秒传,:21-31)→ GET chunk-info/:fileId(断点续传,:38-50)→ POST chunk(FormData 分块,:64-101)→ POST complete-file(合并,:122-150)→ POST avatar(图片直传,:187-206);视频转写/下载走 /api/v1/video/*(services/video/index.ts:12-27),图片元数据 /api/v1/image/:hash(services/image/index.ts:4)。前端无任何 MinIO/S3 SDK——"对象存储由外部服务私有实现"是基于代码证据的合理推断。

可观测性

Sentry 三端真实接入(client 硬编码 DSN + sessionReplay + tracesSampleRate 1,instrumentation-client.ts:7-29;server 仅生产、采样 0.1,sentry.server.config.ts:7-29;edge config 与 onRequestError,instrumentation.ts:13、next.config.ts:83-88)。Datadog browser-logs 只挂在 LiveKit 调试组件(rooms/_components/Debug.tsx:16-43),需 NEXT_PUBLIC_DATADOG_CLIENT_TOKEN/SITE 两个未配置的 env,默认不生效。prom-client 零接入。

Docker 与 CI

Dockerfile 四阶段(node:24-alpine、corepack pnpm@10.28.2、npmmirror 源、非 root 用户、HEALTHCHECK 打 /api/health),CMD next start(:107)。docker-compose 单前端容器。CI 四个 workflow:build(推多 arch 镜像)、deploy(定时 SSH 拉镜像)、lint、preview。

最后更新于

本页目录