私有化部署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.com4. 高级配置技巧
4.1 自定义主题
在Docker环境变量中添加:
environment: - REACT_APP_DEFAULT_THEME=dark - REACT_APP_ALLOWED_THEMES=light,dark4.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 -delete4.3 性能调优
在/etc/docker/daemon.json中添加:
{ "default-ulimits": { "nofile": { "Name": "nofile", "Hard": 65535, "Soft": 65535 } } }然后重启Docker服务:
sudo systemctl restart docker5. 常见问题排雷手册
5.1 白板加载缓慢
现象:打开包含大量元素的白板时卡顿解决方案:
- 检查服务器内存使用:
free -h - 修改Nginx缓冲参数:
proxy_buffers 16 32k; proxy_buffer_size 64k;
5.2 WebSocket连接中断
现象:协作时频繁掉线排查步骤:
- 验证Nginx配置是否包含WebSocket支持头
- 检查防火墙规则:
sudo ufw allow 3000/tcp
5.3 字体显示异常
解决方案:在Docker启动时挂载本地字体:
volumes: - /usr/share/fonts:/usr/share/fonts:ro6. 安全加固措施
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-encrypted6.3 更新策略
建议使用Watchtower自动更新:
docker run -d \ --name watchtower \ -v /var/run/docker.sock:/var/run/docker.sock \ containrrr/watchtower \ --cleanup \ --interval 36007. 实际使用建议
经过半年生产环境运行,我总结出这些最佳实践:
- 为每个项目创建独立白板链接,格式如:
https://whiteboard.example.com/#room=项目名,key=随机字符串 - 定期使用
Ctrl+Shift+D导出工程文件备份 - 复杂图表建议拆分为多个关联白板
- 启用
REACT_APP_DISABLE_TRACKING=true彻底禁用分析追踪
对于技术团队,可以结合Git版本控制管理重要设计图。每次重大修改后,将导出的.excalidraw文件存入代码仓库,实现设计稿与代码的版本同步。