news 2025/12/25 7:16:21

本地部署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进行投诉反馈,一经查实,立即删除!
网站建设 2025/12/22 1:57:36

基于深度学习的安全帽检测系统(UI界面+YOLOv8/v7/v6/v5代码+训练数据集)

摘要 安全帽检测作为计算机视觉在工业安全领域的重要应用,对于预防工地安全事故具有重大意义。本文详细介绍了一种基于深度学习的安全帽检测系统,该系统采用YOLO系列算法(YOLOv5/YOLOv6/YOLOv7/YOLOv8/YOLOv10)进行目标检测,并配备了直观的用户界面。文章将深入探讨系统架…

作者头像 李华
网站建设 2025/12/23 3:28:47

LobeChat能否助力智慧城市?公共事务处理新方式

LobeChat能否助力智慧城市?公共事务处理新方式 在城市治理日益复杂的今天,市民对政务服务的期待早已不再局限于“能办”,而是追求“好办、快办、随时办”。一个简单的落户咨询,可能需要拨打多个电话、翻阅数个网页,甚至…

作者头像 李华
网站建设 2025/12/23 0:13:28

ACE-Step:让普通人也能生成结构化旋律

ACE-Step:让普通人也能生成结构化旋律 在短视频、在线课程和独立游戏内容爆炸式增长的今天,一个现实问题困扰着无数创作者:如何快速获得一段贴合情绪、结构完整又不“撞车”的背景音乐? 买版权音乐成本高,免费素材库…

作者头像 李华
网站建设 2025/12/22 20:45:03

Yolo系列模型的TensorRT-C++推理实践

Yolo系列模型的TensorRT-C推理实践 在边缘计算设备日益承担复杂视觉任务的今天,如何让YOLO这类目标检测模型跑得更快、更稳、更省资源,已经成为工业落地中的核心命题。尤其是在Jetson Orin、T4服务器等多路视频流并发场景下,Python PyTorch那…

作者头像 李华
网站建设 2025/12/22 19:44:36

Qwen3-VL-30B API调用与部署实战指南

Qwen3-VL-30B API调用与部署实战指南:构建你的视觉智能中枢 🧠📸 你有没有这样的经历?用户上传一份PDF财报,里面夹着三张柱状图和一张董事会合影,然后问:“今年营收增长主要靠哪个业务&#xff…

作者头像 李华
网站建设 2025/12/24 20:47:08

国内电商智能客服机器人选型指南:主流服务商实测对比与适配建议

着电商行业进入精细化运营深水区,智能客服已从“可选工具”升级为“核心竞争力枢纽”。据艾瑞咨询数据显示,国内电商行业智能客服渗透率已超75%,人力成本年均涨幅超8%、平台响应时效考核收紧等因素,让越来越多商家将智能客服选型列…

作者头像 李华