本地部署 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这条命令会自动完成三件事:
- 拉取
excalidraw/excalidraw镜像(基于 Alpine + Nginx 的静态站点) - 后台运行容器
- 把宿主机的
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),仅供参考