私有化部署Excalidraw手绘白板全指南

发布时间:2026/11/3 8:30:47
私有化部署Excalidraw手绘白板全指南

1. 为什么需要私有化手绘白板?

最近两年远程协作成为新常态,但市面上大多数在线白板工具要么功能臃肿,要么存在数据安全隐患。Excalidraw作为一款开源手绘风格的白板工具,凭借极简设计、端到端加密和自托管特性,正在成为技术团队的新宠。

我最初接触Excalidraw是在一次开源项目协作中,需要快速绘制系统架构草图。相比其他商业产品,它的手绘风格能有效降低沟通的正式感,特别适合敏捷开发中的快速创意碰撞。更关键的是,当涉及敏感设计时,自建实例能确保商业数据不出内网。

2. 部署前的关键决策

2.1 环境方案选型

Excalidraw官方提供多种部署方式:

  • Docker单容器:适合快速验证
  • Kubernetes集群:适合企业级部署
  • Serverless架构:适合突发流量场景

对于大多数中小团队,我推荐使用Docker Compose方案。它在资源消耗(约500MB内存)和运维复杂度之间取得了最佳平衡。这是我经过三次不同规模部署后得出的经验:单容器版在10人同时协作时就会出现性能瓶颈,而K8s方案对小型团队又过于沉重。

2.2 硬件需求估算

根据实测数据,每个活跃用户会话约占用:

  • CPU:0.1 vCore
  • 内存:50MB
  • 带宽:20Kbps

这意味着一台2核4GB的云服务器可以轻松支持20人团队并发使用。但要注意:当白板元素超过500个时,内存占用会呈指数级增长。我曾遇到一个包含复杂架构图的板子直接吃掉了2GB内存。

3. 分步部署指南

3.1 基础环境准备

以Ubuntu 22.04为例,这些是必须的依赖项:

sudo apt update && sudo apt install -y \ docker.io \ docker-compose \ nginx \ certbot

重要提示:务必使用docker-compose-plugin而非传统的docker-compose,后者已停止维护。可以通过docker compose version命令验证。

3.2 编写docker-compose.yml

这是我优化过的配置模板,增加了:

  • 自动重启策略
  • 日志轮转
  • 本地存储持久化
version: '3.8' services: excalidraw: image: excalidraw/excalidraw:latest restart: unless-stopped environment: - NODE_ENV=production volumes: - excalidraw-data:/usr/src/app/public ports: - "3000:80" logging: driver: "json-file" options: max-size: "10m" max-file: "3" volumes: excalidraw-data:

3.3 Nginx反向代理配置

为提高安全性,建议通过Nginx暴露服务。这是我的生产级配置:

server { listen 443 ssl; server_name whiteboard.yourdomain.com; ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem; location / { proxy_pass http://localhost:3000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 重要:支持WebSocket proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } }

使用Certbot获取SSL证书:

sudo certbot --nginx -d whiteboard.yourdomain.com

4. 高级配置技巧

4.1 自定义主题

在Docker环境变量中添加:

environment: - REACT_APP_DEFAULT_THEME=dark - REACT_APP_ALLOWED_THEMES=light,dark

4.2 数据持久化方案

我强烈建议配置定期备份,因为Excalidraw默认使用浏览器IndexedDB存储数据。这是我的备份脚本:

#!/bin/bash BACKUP_DIR=/opt/excalidraw-backups docker exec excalidraw tar czf - /usr/src/app/public > \ $BACKUP_DIR/backup-$(date +%Y%m%d).tar.gz find $BACKUP_DIR -type f -mtime +30 -delete

4.3 性能调优

在/etc/docker/daemon.json中添加:

{ "default-ulimits": { "nofile": { "Name": "nofile", "Hard": 65535, "Soft": 65535 } } }

然后重启Docker服务:

sudo systemctl restart docker

5. 常见问题排雷手册

5.1 白板加载缓慢

现象:打开包含大量元素的白板时卡顿解决方案:

  1. 检查服务器内存使用:free -h
  2. 修改Nginx缓冲参数:
    proxy_buffers 16 32k; proxy_buffer_size 64k;

5.2 WebSocket连接中断

现象:协作时频繁掉线排查步骤:

  1. 验证Nginx配置是否包含WebSocket支持头
  2. 检查防火墙规则:
    sudo ufw allow 3000/tcp

5.3 字体显示异常

解决方案:在Docker启动时挂载本地字体:

volumes: - /usr/share/fonts:/usr/share/fonts:ro

6. 安全加固措施

6.1 访问控制

推荐使用Authelia或OAuth2 Proxy实现:

# docker-compose.yml新增服务 auth: image: bitnami/oauth2-proxy environment: - OAUTH2_PROXY_PROVIDER=github - OAUTH2_PROXY_CLIENT_ID=your_client_id - OAUTH2_PROXY_CLIENT_SECRET=your_secret - OAUTH2_PROXY_COOKIE_SECRET=random_string ports: - "4180:4180"

6.2 数据加密

对持久化卷启用加密:

docker volume create --driver local \ --opt type=tmpfs \ --opt device=tmpfs \ --opt o=size=100m,uid=1000 \ excalidraw-encrypted

6.3 更新策略

建议使用Watchtower自动更新:

docker run -d \ --name watchtower \ -v /var/run/docker.sock:/var/run/docker.sock \ containrrr/watchtower \ --cleanup \ --interval 3600

7. 实际使用建议

经过半年生产环境运行,我总结出这些最佳实践:

  1. 为每个项目创建独立白板链接,格式如:https://whiteboard.example.com/#room=项目名,key=随机字符串
  2. 定期使用Ctrl+Shift+D导出工程文件备份
  3. 复杂图表建议拆分为多个关联白板
  4. 启用REACT_APP_DISABLE_TRACKING=true彻底禁用分析追踪

对于技术团队,可以结合Git版本控制管理重要设计图。每次重大修改后,将导出的.excalidraw文件存入代码仓库,实现设计稿与代码的版本同步。