WBO 2.18.31 介绍与选型指南
WBO 2.18.31 介绍与选型指南:基于 2.18.31 实例实测的实时协作白板组件画像,覆盖核心架构、WebSocket 协议画像、持久化格式、功能特性与同类自托管白板选型对比。
WBO 2.18.31 介绍与选型指南
本文是 WBO 专栏的认知篇。文中架构、协议与持久化结论均来自一套 2026-10-30 实测运行的 WBO 2.18.31 实例(
package.json版本号与页面data-wbo-version="2.18.31"双重核实),选型对比数据截至 2026-10。部署实操见《WBO 2.18.31 Docker Compose 部署指南》,参数逐项调优见《WBO 2.18.31 配置参数详解》,WebSocket 消息与 HTTP 端点实测见《WBO 2.18.31 常用操作与 API 详解》。
一、环境信息
| 项目 | 取值 |
|---|---|
| 实测组件版本 | WBO 2.18.31(data-wbo-version="2.18.31") |
| 运行时 | Node.js,官方声明 engines.node >= 22.23.4 |
| 操作系统 | Linux x86_64 |
| 许可证 | AGPL-3.0-or-later(package.json 中 license 字段原文) |
| 实测时间 | 2026-10-30 |
| 服务形态 | 单进程 HTTP 服务,内置 WebSocket 通道,无外部数据库依赖 |
WBO 对操作系统没有额外要求,只要 Node.js 版本达标即可运行;数据落盘为普通 SVG 文件,不需要预装数据库或消息队列,这也是它在极简自托管场景下最容易跑起来的原因。
二、软件概述
WBO(开源仓库名 whitebophir,作者 lovasoa)是一款自由开源的实时协作 Web 白板:打开浏览器即可多人同时在一块无限画布上画图、写字、贴便签,无需注册账号。它的核心卖点是把「匿名可用」做到了极致——任意访问者输入一个板名(或直接从首页随机进入)就拥有一块独立白板,所有看到同一板名的人实时共享内容。
💡 技术拓展(实时协作白板的同步架构):协作白板的同步方案主要有三类。① 消息广播型:服务端把每个用户的绘图操作原样转发给其他客户端,服务端不理解语义,实现简单但断线重连需要全量补发,WBO 即属此类(配合序号回放做增量补发);② OT(Operation Transformation):对并发操作做变换归位,Google Docs 一脉的代表,实现复杂度最高;③ CRDT(无冲突复制数据类型):每个操作满足交换律,天然支持离线合并,Yjs/Automerge 生态多用。WBO 的操作是「画一笔、加一个点」这类不可变事件,冲突面天然很小,用广播 + 服务端权威序号(seq)已足够,这也是它单文件持久化的设计基础。
版本节奏方面,WBO 采用持续演进的小版本号(2.x 系列滚动迭代),实测仓库最近一次推送在 2026-01(awesome-repositories 收录口径),属于活跃但非高频发布的节奏;镜像与源码同步发布,部署时锁定版本号即可获得确定性。
三、核心架构
实测版本的服务端为模块化 Node.js 工程,入口 server.mjs,目录职责划分清晰(以下结构摘自实测运行目录):
/opt/app/
├── server.mjs # 进程入口
├── server/ # 服务端模块
│ ├── http/ # HTTP 分发、压缩、模板渲染
│ ├── routes/ # 路由(板页、静态资源、板资产)
│ ├── socket/ # WebSocket 核心
│ │ ├── index.mjs # 连接生命周期、事件分发
│ │ ├── replay.mjs # 断线重连的序号回放(baselineSeq 机制)
│ │ ├── message_validation.mjs # 消息契约校验(工具编码、字段范围)
│ │ ├── rate_limits.mjs # 多档限流
│ │ ├── bans.mjs / presence.mjs / temporary_moderators.mjs # 管理能力
│ │ └── turnstile.mjs # Cloudflare Turnstile 人机校验
│ ├── auth/ # 板级 JWT 鉴权
│ ├── board/ # 板状态(内存权威副本)
│ ├── persistence/ # SVG 持久化(whitebophir-svg-v2 格式)
│ ├── configuration.mjs # 全部环境变量装载
│ └── observability/ # OpenTelemetry 日志/指标/追踪
├── client-data/ # 前端代码(工具、消息契约、协议常量)
└── server-data/ # 板持久化目录(WBO_HISTORY_DIR 默认值)
三个实测确认的架构要点:
- 实时通道是 Socket.IO(实测依赖
socket.io ^4.8.4):WebSocket 端点挂在/socket.io路径,板名通过连接查询参数board传入。客户端到服务端的写入事件名是broadcast,服务端回推也复用broadcast、boardstate、user_joined等事件名(完整事件与消息格式见 D1)。 - 持久化格式为带序号的 SVG:每块板在
WBO_HISTORY_DIR下对应一个<板名>.svg文件。实测文件头为<svg ... data-wbo-format="whitebophir-svg-v2" data-wbo-seq="4" data-wbo-readonly="false">,data-wbo-seq记录已持久化到的操作序号,服务端重启后以该文件为基线恢复板内容——这也是白板「无限画布」却只需单文件的原因:画布尺寸固定 5000×5000,元素按 SVG 标准标签(path/rect/text等)存储。 - 序号回放(replay)是重连同步的核心:2.18.31 的服务端为每条被接受的写操作分配全局递增
seq,客户端重连时携带自己的基线序号baselineSeq,服务端只回放baselineSeq之后的增量(replay.mjs实现)。若基线已超出可回放窗口(日志被压缩或序号超前),连接会被拒绝并返回baseline_not_replayable错误——该行为已在实测中完整复现并记录于 D1,运维排障时值得重点关注。
另外,实测服务端带完整的可观测性依赖(OpenTelemetry 全家桶:logs/metrics/traces 三个 exporter),日志级别由 LOG_LEVEL 控制(debug/info/warn/error,默认 info),这是同体量自托管组件里少见的配置。
四、功能特性
以下特性均经实测页面与协议验证:
- 匿名板:板名即访问凭据,首页随机进入或自取名字;私有板走
板名 + JWT鉴权(server/auth/),配合AUTH_SECRET_KEY使用。 - 绘图工具全家桶:画笔(pencil)、直线、矩形、椭圆、文本、橡皮擦,另有视角手型、网格、缩放、光标等辅助工具,协议层共 12 个工具编码(pencil=1 … cursor=12,完整表见 D1)。
- 实时同步与在线感知:写操作广播回显带全局
seq与acceptedAtMs时间戳;成员进出触发user_joined/user_left,在线用户带随机昵称与代表色(实测user_joined回显含userId、name、color、position)。 - 多人管理:板级版主(
WBO_BOARD_MODERATORS环境变量按板配置用户密钥)、临时版主授予、封禁(ban)、举报(report)、强制断开(moderation_disconnect),服务端事件active_bans会在连入时同步封禁名单。 - 防滥用三件套:四档按 IP 限流(总 emit、建设性操作、破坏性操作、文本创建,档位语法见 C1)、Cloudflare Turnstile 人机校验(含官方测试密钥)、工具/按钮禁用(
WBO_BLOCKED_TOOLS等)。 - 导出:SVG/PNG 导出由前端完成(工具栏 download 工具,编码 9);注意实测中服务端旧版的
/export、/historyHTTP 端点已不存在(分别返回 400/404),导出不占服务端资源。 - 无外部依赖的水平扩展限制:板状态是单进程内存权威副本 + 单文件落盘,天然单机定位;多实例负载均衡会导致同一板分裂在两个进程,不属于官方支持形态。
五、快速开始(最小可用示例)
最短路径是容器化部署(完整实测步骤与 compose 文件见《WBO 2.18.31 Docker Compose 部署指南》);源码方式则要求 Node.js ≥ 22.23.4,官方启动命令为 npm ci && npm start(package.json 中 start 脚本原文:node ./server/server.mjs)。
服务起来后,两条命令即可确认实例健康(回显为 2.18.31 实测原文,节选):
# 1) 首页可达性:确认版本口径
curl -s http://127.0.0.1:80/ | head -c 200
<!DOCTYPE html>
<html lang="en" dir="ltr" data-wbo-version="2.18.31">
<head>
<meta charset="utf-8" />
<title>WBO — Collaborative whiteboard</title>
# 2) 板页按需创建:访问不存在的板名即自动建板
curl -s http://127.0.0.1:80/boards/demo | head -c 160
<!DOCTYPE html>
<html lang="en" dir="ltr" data-wbo-version="2.18.31" data-ui-direction="ltr">
<head>
<meta charset="utf-8" />
<title>demo | WBO | Collaborative whiteboard</title>
浏览器打开板页即可多人协作;程序化写入(WebSocket 消息格式、工具编码、实测脚本与逐条回显)见《WBO 2.18.31 常用操作与 API 详解》。
六、适用场景与限制
适用场景:
- 团队站会、头脑风暴、远程教学涂鸦——免注册、开链接即用的场景是它的主场;
- 嵌入自有产品的轻量协作画布:AGPL-3.0 允许商用集成(注意网络服务分发义务),协议层有完整的工具编码与消息校验契约,程序化驱动可行;
- 低资源长期挂着的家庭服务器/内网工具:单进程 Node.js、无数据库、数据为单个 SVG 文件,备份即复制文件。
限制与注意:
- 不支持多实例:板状态单进程权威 + 单文件持久化,不能横向扩容,多人高并发大板时注意
WBO_MAX_ITEM_COUNT(默认 32768)与限流档位; - 画布固定 5000×5000:坐标超出
WBO_MAX_BOARD_SIZE(默认 655360,协议换算后仍受 5000 画布约束)会被校验拒绝,超大尺寸构图需要规划; - 重连依赖序号回放窗口:
WBO_SEQ_REPLAY_RETENTION_MS(默认 60 秒)之外的增量不可回放,服务端会拒绝过旧/超前的基线并返回baseline_not_replayable,客户端需全量刷新——网关层长连接超时务必大于该窗口; - AGPL 传染性:对外提供网络服务时需遵守 AGPL-3.0 的源码提供义务,商业闭源集成需法务评估;
- 导出依赖前端:服务端无服务端渲染导出端点,自动化批量导出需自行驱动无头浏览器。
七、同类选型对比
与主流可自托管的协作白板对比(数据截至 2026-10,星数取自 openalternative/awesome-repositories 收录口径):
| 维度 | WBO (whitebophir) | Excalidraw | tldraw |
|---|---|---|---|
| GitHub 星数 | 约 2.6K | 约 134K | 约 51K |
| 许可证 | AGPL-3.0 | MIT | SDK 4.0(2025-09)起商用需付费授权 |
| 技术栈 | 原生 JS + Socket.IO + Node.js | React + TypeScript | React + TypeScript |
| 服务端依赖 | Node.js 单进程,零外部服务 | 同步服务需另配(官方快照方案) | 需 WebSocket 后端(官方示例用 Cloudflare Durable Objects) |
| 持久化 | 单文件 SVG(whitebophir-svg-v2 + 序号) | 场景 JSON(快照存储) | 依赖所选后端实现 |
| 匿名可用 | 原生支持,板名即凭据 | 支持实时协作房间 | 需自建多用户方案 |
| 防滥用/治理 | 内置限流、Turnstile、版主/封禁 | 无内置,需自加 | SDK 层无,需自建 |
| 版本节奏 | 2.x 滚动迭代,2026-01 仍有推送 | 高频发布 | 高频发布(SDK 商业化节奏) |
| 兼容矩阵 | 现代浏览器;服务端 Node ≥ 22.23.4 | 现代浏览器 | 现代浏览器 + React 18/19 |
| 适合谁 | 要一个「开箱即用的多人白板服务」且愿意自己管治理 | 要手绘风格 diagram + 生态插件 | 要把画布当 SDK 嵌进自家产品 |
选型结论:把「多人同时涂画、零账号、低运维」作为第一诉求时 WBO 的综合成本最低——治理(限流/人机校验/版主)开箱即有,持久化与备份最简单;要手绘风图表与庞大生态选 Excalidraw;要做画布型产品选 tldraw(注意其 2025-09 起的商用授权变化)。