news 2026/5/6 16:19:43

本地部署Excalidraw手绘白板指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
本地部署Excalidraw手绘白板指南

本地部署 Excalidraw 手绘白板指南

在远程协作日益频繁的今天,一个轻量、直观且安全的可视化工具几乎成了每个技术团队的刚需。无论是画架构草图、梳理业务流程,还是开一场即兴的头脑风暴,一张“能写会动”的数字白板往往比复杂的建模软件更高效。而Excalidraw正是这样一款让人眼前一亮的开源工具——它用极简的手绘风格还原了纸笔书写的自然感,却又无缝集成了现代协作能力。

更难得的是,它的整个技术栈设计得非常友好:前端基于 React + Canvas 实现,后端协作服务使用 Node.js 和 WebSocket,整体结构清晰,部署成本低。尤其适合希望将白板系统私有化部署、保障数据不出内网的企业或个人开发者。

本文不讲概念堆砌,直接带你从零开始,在本地快速搭建一个支持实时协作、具备基础持久化能力的 Excalidraw 私有实例。全程基于 Docker 部署,兼顾效率与可维护性,最后还会补充手动构建静态版本的方法,满足不同场景需求。


环境准备:别让依赖卡住第一步

动手前先确认你的主机已经装好了以下组件:

  • Git:用来拉取官方源码
  • Docker(建议 20.10+):容器运行时核心
  • Docker Compose v2.x:注意是新版docker compose(无横杠),不是旧版docker-compose

💡 小贴士:如果你还在用老版本的 Compose 插件,可以通过以下命令检查:

bash docker compose version

如果提示找不到命令,说明需要安装或升级。参考官方文档:
https://docs.docker.com/compose/install/

内存方面,至少预留 512MB 给容器使用。网络要通畅,毕竟第一次部署得下载镜像。


一键启动:用 Docker 快速跑起来

Excalidraw 官方提供了完整的docker-compose.yml模板,省去了自己打包前端的麻烦。我们只需要几步就能让服务跑起来。

首先克隆仓库:

git clone https://github.com/excalidraw/excalidraw.git cd excalidraw

这个仓库不仅包含前端代码,还有生产用的 Nginx 镜像配置和开发服务器设置。

接着直接启动默认服务:

docker compose up -d

这条命令会自动完成三件事:

  1. 拉取excalidraw/excalidraw镜像(基于 Alpine + Nginx 的静态站点)
  2. 后台运行容器
  3. 把宿主机的3000端口映射到容器的80,即访问 http://localhost:3000

等几秒后查看运行状态:

docker ps | grep excalidraw

你应该能看到类似输出:

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES abc123def456 excalidraw/excalidraw "nginx -g 'daemon of…" 2 minutes ago Up 2 mins 0.0.0.0:3000->80/tcp excalidraw-excalidraw-1

此时打开浏览器访问 http://localhost:3000,就能看到干净清爽的手绘界面了。

但别高兴太早——这时候的 Excalidraw 只是一个“单机版”,没有协作功能,刷新页面就丢内容。要想真正发挥它的潜力,还得加上后端同步服务。


自定义配置:改端口、设环境变量

默认映射到3000端口虽然方便,但在实际环境中容易冲突。比如你本机可能已经有其他服务占用了这个端口。所以最好提前修改一下配置。

编辑项目根目录下的docker-compose.yml文件:

vi docker-compose.yml

找到services.excalidraw.ports这一项,改成你喜欢的端口,比如3002

services: excalidraw: image: excalidraw/excalidraw ports: - "3002:80" environment: - NODE_ENV=production

这里顺手加上NODE_ENV=production是个好习惯。它可以关闭开发模式下的调试日志,减少不必要的输出,也让前端资源加载更快一点。

改完之后重启服务:

docker compose down docker compose up -d

现在访问 http://localhost:3002 即可生效。


加入协作能力:让多人同时画画

这才是 Excalidraw 的灵魂所在。默认的单容器部署只是个静态页面,真正的“实时协同编辑”依赖于另一个独立的服务:excalidraw-room

这是一个轻量级的 WebSocket 服务,负责处理客户端之间的连接、消息广播和房间管理。它的设计很巧妙——前端会自动探测是否存在名为room的服务,如果发现,就会自动启用协作模式。

所以我们只需在docker-compose.yml中新增一个服务即可:

version: '3' services: excalidraw: image: excalidraw/excalidraw ports: - "3002:80" environment: - NODE_ENV=production depends_on: - room room: image: excalidraw/excalidraw-room environment: - HTTP_SERVER_PORT=80 - COLLABORATION_PORT=443 expose: - "80"

几点说明:

  • depends_on确保前端等待room服务启动后再运行,避免连接失败。
  • COLLABORATION_PORT=443是协议要求,即使实际通信走的是 80 端口,也建议保留该变量。
  • expose: 80表示该端口仅对内部网络开放,无需对外暴露,提升安全性。

保存后重新部署:

docker compose down && docker compose up -d

刷新网页,点击右上角的「Share」按钮,你会发现多了一个选项:“Collaborative realtime editing”。点击后生成的链接就可以分享给同事,邀请他们加入同一个画布协同编辑。

⚠️ 注意:当前这种部署方式下,所有房间数据都存在内存里。一旦容器重启,所有正在进行的协作会话都会中断,未导出的内容也会丢失。这在演示或临时会议中问题不大,但如果想长期使用,就得考虑持久化方案。


数据持久化尝试:留住关键记录

虽然excalidraw-room目前不支持数据库存储(如 PostgreSQL 或 Redis),但它会在运行时生成一些日志文件,记录连接事件和错误信息。我们可以把这些日志挂载出来,便于排查问题。

room服务中添加卷挂载:

room: image: excalidraw/excalidraw-room environment: - HTTP_SERVER_PORT=80 - COLLABORATION_PORT=443 expose: - "80" volumes: - ./logs:/app/logs

下次启动时,容器内的/app/logs目录就会映射到宿主机的./logs文件夹,日志得以保留。

当然,这不是真正意义上的“数据持久化”。如果你想保存画布内容,目前最可行的方式是在客户端手动导出为.excalidraw文件(本质是 JSON),然后集中归档管理。未来如果有社区插件或自研后端接入,也可以通过扩展room服务来实现自动备份。


使用体验:不只是好看,更要好用

打开 http://localhost:3002,你会被那种“纸上作画”的质感吸引。左侧工具栏简洁明了,右侧属性面板提供颜色、粗细、字体等调节项,顶部菜单则藏着导出、共享、主题切换等功能。

常用功能一览:

功能说明
🖊️ 手绘线条支持压感笔触,模拟真实书写抖动感
▢ 图形绘制包括矩形、圆形、箭头、菱形判断等流程图元素
🧩 对齐与分布自动吸附、智能辅助线提升排版效率
📤 导出图像支持 PNG/SVG 格式,透明背景开箱即用
🔗 共享协作获取链接即可发起实时会话
🎨 主题切换支持亮色 / 暗色模式,保护夜间视力

特别值得一提的是它的端到端加密协作机制:即便通过公网传输,每个房间的数据在客户端就已经加密,服务端无法解密。这意味着哪怕你把服务部署在公有云上,别人也无法窥探你们的讨论内容——非常适合敏感项目的内部协作。

不过也有局限:比如不支持用户认证、不能限制访问权限。如果你打算对外发布,强烈建议加一层反向代理(如 Nginx),配合 HTTPS 和 Basic Auth 做基础防护。


脱离容器:构建静态版本用于内网展示

有些人可能不想依赖 Docker,或者只想在一个简单的 HTTP 服务器上运行 Excalidraw。比如嵌入公司内部 Wiki、培训系统或离线文档站。

这时你可以选择手动构建前端静态资源。

进入项目目录:

cd excalidraw

确保已安装 Node.js(推荐 v16+),然后安装依赖并构建:

npm install npm run build

构建完成后,所有静态文件会输出到build/目录,包括 HTML、JS、CSS 和资源文件。

接下来可以复制到任意 Web 服务器。例如 Nginx:

sudo cp -r build/* /var/www/html/

然后访问http://your-server-ip/index.html即可。

❗ 重要提醒:这种方式只能作为离线白板使用,完全不支持协作功能。因为缺少room服务,WebSocket 连接无法建立。但它非常适合做产品原型展示、教学演示或静态文档附图。


这种高度集成又灵活可拆解的设计思路,正是 Excalidraw 能迅速赢得开发者喜爱的原因之一。它既可以用最简单的方式快速上手,也能通过模块化组合满足进阶需求。

随着 AI 辅助设计的兴起,我们甚至可以看到更多可能性:比如结合 OpenAI API,输入“画一个订单支付流程”,自动生成带节点和连线的草图;或是通过图像识别,把手机拍的手绘稿转成数字化图表。

而现在,你已经有了一个属于自己的私有化实例。下一步怎么玩,取决于你的想象力。

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/4 20:31:00

YOLO + PyTorch 实时检测黄金组合

YOLO PyTorch 实时检测黄金组合 在智能制造工厂的流水线上,一台嵌入式视觉系统正以每秒50帧的速度扫描经过的PCB板。突然,一个微小的贴片电阻被识别为反向安装——这个肉眼几乎难以察觉的缺陷,在毫秒级内触发了剔除机制。背后驱动这一切的&a…

作者头像 李华
网站建设 2026/5/4 21:03:58

基于 (java) validation-api、hibernate-validator 的数据校验扩展

在Java 开发中,数据校验是保证系统健壮性和数据完整性的重要环节。validation-api和hibernate-validator功能强大,在这个基础上,做了一些检验简单扩展处理,在处理复杂业务场景时提供一些支持。 项目简介 brilliant-validation是…

作者头像 李华
网站建设 2026/5/5 11:22:26

GPT-OSS-20B性能对比:低延迟与高效推理解析

GPT-OSS-20B性能解析:如何在16GB设备上跑出类GPT-4的推理表现? 你有没有遇到过这样的场景:本地部署一个“轻量级”大模型,结果显存爆了、响应慢如蜗牛、生成内容还经常卡壳?这几乎是每个尝试将大模型落地到消费级硬件…

作者头像 李华
网站建设 2026/5/4 22:39:01

C#通过HTTP请求调用GPT-SoVITS WebUI接口

C#通过HTTP请求调用GPT-SoVITS WebUI接口 在AI语音技术迅速渗透内容创作、智能交互和个性化服务的今天,越来越多开发者希望将高质量语音合成功能集成到自己的应用中。传统方案往往依赖昂贵的商业API或复杂的模型部署流程,而开源项目 GPT-SoVITS 的出现打…

作者头像 李华
网站建设 2026/5/4 22:39:02

HuggingFace镜像加速下载Seed-Coder-8B模型

本地化代码助手的起点:高效获取 Seed-Coder-8B 模型 在千兆宽带普及、算力触手可及的今天,真正卡住我们落地 AI 编程助手的,往往不是显卡不够强,而是——连不上模型仓库。 当你兴冲冲地打开终端,准备从 Hugging Face 下…

作者头像 李华
网站建设 2026/5/6 2:08:15

专业解析:泳池刷的面漆如何兼顾美观与耐用?

许多业主和管理方都困惑游泳池刷的什么漆才能既美观又耐用。作为水上游乐地坪的专业从业者,我去年亲自跟进过数十个泳池翻新项目,发现选择合适的装饰面漆至关重要。 装饰面漆的核心功能 游泳池刷的什么漆直接关系到整体视觉效果。传统材料容易褪色开裂。…

作者头像 李华