乐于分享
好东西不私藏

从CRDT到PostgreSQL:JitWord如何用七重防线,让企业文档安全可溯源

从CRDT到PostgreSQL:JitWord如何用七重防线,让企业文档安全可溯源

体验地址:https://jitword.com

先讲一个反常识的观点:自动保存,是企业文档安全的最大幻觉

做 JitWord 协同AI文档之前,我调研了市面上几乎所有文档工具。它们都会告诉我:”我们支持自动保存。”

但当我们真正开始为企业客户做私有化部署时,发现了一个可怕的事实——自动保存这四个字,掩盖了太多”以为安全,实则裸奔”的真相。

举个例子:

  • 保存文档时,服务器恰好 OOM 重启,内存里的半截内容会不会刷到磁盘上?

  • 网络抖动导致同步中断,客户端重连时,会不会用本地缓存的空白状态覆盖掉服务器上完好的旧版本?

  • 文档保存一年后,法务审计时:”这段合同条款是谁、在什么时候改的?”——你的系统还答得上来吗?

这些问题,单点的”自动保存”根本回答不了。

真正的企业级安全,不是一道墙,而是一套纵深防御体系。 任何一层失效,下一层立刻接住。这是我们从第一行代码开始就刻在 JitWord 协同AI文档里的设计哲学。

下面,我就详细和大家拆解一下 JitWord 协同AI文档的七重防护机制。

JitWord 七重防护架构设计

┌─────────────────────────────────────────┐│  第七重 · 编辑历史与字符级审计 (不可篡改)   │  ← 法务审计、合规追责├─────────────────────────────────────────┤│  第六重 · 独立版本与里程碑 (一键回溯)       │  ← 人为误操作、合同修订├─────────────────────────────────────────┤│  第五重 · 数据库持久化 (PostgreSQL事务)     │  ← 企业级高可用、双机热备├─────────────────────────────────────────┤│  第四重 · 内容镜像JSON (人类可读副本)       │  ← 全文检索、API集成、兜底恢复├─────────────────────────────────────────┤│  第三重 · 原子快照 (主力防线)               │  ← 防崩溃、防半截文件├─────────────────────────────────────────┤│  第二重 · 协同二进制态 (.ydoc底片)          │  ← 离线同步、CRDT完整历史├─────────────────────────────────────────┤│  第一重 · 内存实时态 (Y.Doc + CRDT)         │  ← 实时协同、永不冲突丢字└─────────────────────────────────────────┘                    ↓              防空写护栏 (防"假空覆盖")

每一层都是独立的、可单独恢复的数据源。 这不是冗余,这是工程上的”冗余即安全”。

第一重 · 内存实时态防护

JitWord 的文档一旦被打开,它就以一个实时内存模型(Y.Doc)的形式活在服务器中。

我们采用业界公认最可靠的协同算法 CRDT(无冲突复制数据类型),由成熟的 Yjs 引擎驱动。这意味着:多人同时编辑同一段落,不会互相覆盖、不会冲突丢字

更关键的是我们设计的“文档保温”机制

当最后一位协作者离开后,文档不会立刻被清出内存,而是在内存中”保温”一段时间(默认120秒,可配置)。如果用户只是刷新页面、网络瞬断后重连,文档可直接从内存快速恢复,省去重新冷加载的开销。

第二重 · 协同二进制态:可追溯到任意时刻

内存态之外,我们把完整的协同状态以 Yjs 二进制格式独立落盘(.ydoc 文件 / 数据库 BYTEA 字段)。

这份二进制不是简单的”当前内容快照”,而是包含了完整 CRDT 操作历史的”底片”

它的价值在于:即便某个离线了很久的客户端重新上线,系统也能用它精确地、无损地完成合并同步——没有任何一次离线编辑会被丢弃

第三重 · 快照机制:原子落盘,杜绝”写了一半”的残缺文件

这是我们数据安全的主力防线,也是我们在架构评审时最坚持的一层。

文档每次发生变化,系统会在去抖动(默认3秒可配置)后生成一份快照。但快照不是粗暴地往文件里写——它采用原子写入先写入临时文件,完整无误后再通过操作系统级的 rename 一步到位替换

这意味着:进程哪怕在写入的瞬间崩溃,我们的磁盘上也永远不会出现”写了一半”的残缺文件。 要么是完整的新版本,要么是完好的旧版本,绝对不会出现中间态。

我们的快照还有更智能的一面——双格式智能重建

  • 状态快照:保留完整协同状态,用于精确同步;

  • 重建快照:当所有人都离开后,系统在空闲时自动把文档”重新誊写”一遍,剥离冗余的协同历史,在不丢失任何内容的前提下大幅压缩体积。

第四重 · 内容镜像:随时可读的”人类副本”

协同二进制对机器友好,但不便于直接读取、检索、导出。因此我们额外维护一份结构化 JSON 内容镜像(去抖动默认5秒落盘)。

它是文档当前形态的”明文誊本”,让全文检索、内容导出、API调用、跨系统集成都能直接、高效地拿到数据——同时它本身也是一道额外的恢复来源

第五重 · 数据库持久化:企业级存储,为私有化而生

面向企业私有化部署,我们提供双存储后端架构

模式
适用场景
切换方式
本地文件模式
演示、试用、轻量部署
开箱即用
PostgreSQL模式
生产环境、高可用集群
环境变量STORAGE_PROFILE一键切换

业务代码零改动 所有数据——文档、版本、评论、编辑历史、字符级署名——全部落在企业自己的数据库里,不依赖任何外部云服务,不发起任何外部网络调用。数据主权,牢牢握在自己手中。

数据库层面,我们采用如下模式:

  • PostgreSQL事务(BEGIN/COMMIT/ROLLBACK): 保证每一次写入的原子性;

  • 咨询锁(advisory lock): 保证多节点环境下编辑历史序号的严格单调、绝不错乱;

  • JSONB + 全文检索向量 :让海量文档依然可被高效检索。

第六重 · 独立版本:一键回到任意里程碑

自动保存解决的是”不丢”,而版本机制解决的是”可回溯“。

用户可以在任意时刻为文档保存一个命名版本(支持手动里程碑与自动存档两种)。每个版本都是一份完整、独立的内容快照,携带完整元数据:

  • 谁创建的(作者 / 作者ID)

  • 什么时候(精确时间戳)

  • 标题与描述

  • 内容哈希(SHA-256,用于完整性校验)

需要恢复时,我们可以一键把文档恢复到指定的历史版本。而且文档恢复本身也会被记录为一次新的编辑事件,整个操作链路全程留痕,可被审计

第七重 · 编辑历史与字符级审计:每一个字,都有名字

这是最让企业客户安心的一层,也是普通文档工具最缺失的一层。

我们为每一份文档维护一条仅追加(append-only)的编辑历史事件流。每一次编辑会话结束,系统都会记录:

  • 变更了哪些内容块

  • 操作摘要(插入、删除的统计)

  • 字符级署名(author runs):精确到”第几个字到第几个字,是哪位用户写的”

为了做到这一点,我们在 WebSocket 连接建立时,就由服务端把协同客户端ID与经过JWT鉴权的真实用户身份强绑定——而不是采用客户端自己上报的身份。这意味着署名无法被伪造,经得起审计与追责。

我们通过历史事件流配合周期性内容检查点(gzip压缩存储、按内容哈希自动去重),共同构成一条不可篡改的完整审计轨迹。

我们专门写了一段代码,防”假空覆盖”

分享一个典型的场景:服务器重启后,某份文档的内存模型因为加载失败或同步竞态,暂时是空的。如果此时触发了一次自动保存——它会不会用这个”假空”状态,把磁盘上原本完好的文档,覆盖成永久空白?

很多系统就栽在这里。

我们专门设计了防空护栏。系统会严格区分两种”空”:

类型
判断逻辑
系统行为
用户真实清空
本次会话确实有过内容,然后被用户删除
正常保存空文档
加载失败导致的”假空”
本次会话从未加载到内容
坚决拒绝写入

,保护磁盘上的原文

这就是”企业级”三个字真正的重量——它藏在那些用户永远不会注意到、但一旦缺失就会追悔莫及的细节里。

最后

JitWord 协同AI文档设计的七重防护机制,不是过度设计,而是对企业数据的敬畏。

当然没有一个完美的方案能解决所有数据问题,但是我们会持续关注企业文档数据安全,持续演进更优秀的安全防护技术,为企业知识资产“”保驾护航。

也欢迎关注我们的公众号,会定期分享我们的开源、AI产品创业的最新进展:
大家在使用 JitWord 的过程中有任何问题,也欢迎随时留言区反馈~
体验地址:https://jitword.com

往期精彩

【JitWord 2.9.2 重磅更新】文档也能”时光倒流”?编辑记录+版本对比高亮,让每一次修改都有迹可循

JitWord协同AI文档2.9.1,正式发布

死磕1个月,我们造了个Word公式渲染引擎

JitWord V2.9.0重磅更新!模板变量一键批量生成海量文档

JitWord 协同AI文档 V2.8.0 发布:思维导图多人协同 + API 文档生成,效率拉满

JitWord V2.7.0发布:可视化拖拽+高精度Docx解析,打造高效AI Word协同文档编辑器