流程图工具我见过不少,但真正在自己电脑上跑起来当在线服务用的,Draw.io 算是最省心的一个。前阵子我需要在一台 Windows 机器上搭一套私有化的流程图服务,让团队在浏览器里直接画架构图、时序图,同时人在外面也能访问。折腾下来发现这件事并不复杂,但网上讲 Windows 版完整流程的不多,很多教程一上来就让你装一堆环境。这篇就用我自己的实操记录,把“本地部署 Draw.io 并实现外部访问”的完整链路拆开讲一遍。无论你是个人想跨设备用,还是小团队想在内网搭一个免费画图服务,这篇都能直接照着做。
1. 为什么要在本地部署 Draw.io:先把需求想清楚
1.1 在线版和自托管版到底差在哪
Draw.io 大家用得多的是官方在线版,功能免费、模板多、导出格式丰富。但有一个问题被很多人忽略了:在线版虽然默认把文件存在浏览器本地,可一旦你选择保存到云盘或分享链接,业务流程、网络拓扑这些信息就跑到第三方平台上了。很多公司对这类文件非常敏感,哪怕是免费工具,也不敢让员工随意上传外部平台。
自托管方案就解决了这个顾虑。Draw.io 的源码是开源的,官方也提供配套的容器镜像,你可以把它当成一个普通的 Web 应用部署到自己的服务器或电脑上。部署之后,访问地址变成了http://内网IP:8080这种形式,所有前端资源都从自己的服务器加载,数据文件也完全控制在本地。核心上,它就是把一个原本依赖第三方站点的在线工具,变成了自己内网里的私有工具,功能和操作习惯与在线版几乎一致。
这种“数据不出门”的特性,才是本地部署真正的价值点,而不是单纯为了“免费”或“离线”。理解这一点之后,下面很多技术选型就顺理成章了。
1.2 Windows 本地部署适合哪些场景
不是所有人都需要本地部署 Draw.io,动手之前最好先对照一下自己的场景。
最常见的是小团队内网协作。比如研发部门有专门的隔离网络,外部网站一律不能访问,但项目组需要画架构图、时序图、部署图。这时候在 Windows 机器上搭一个 Draw.io 服务,整个网段的人打开浏览器就能用,不需要安装任何客户端,也不需要申请外网权限。
其次是数据敏感的场合。比如给客户做方案时画的系统架构图,里面包含了内网 IP、中间件版本、服务器节点信息,这种东西放到第三方图床显然不合适。自托管之后,文件全部留在自己手里,流程上也更合规。
还有一类是个人跨设备需求。家里有一台常开的 Windows 主机,把它变成一个小型画图服务器,出差时通过远程访问方案打开同一套工具,比在每台设备上装桌面版方便得多。
当然,如果你是那种“只在固定一台电脑上画图、不需要给别人用”的情况,我建议直接用桌面版,省掉所有网络配置的麻烦。所谓“在线流程图工具”,核心在于多人通过浏览器访问同一个服务,这个前提不确定,后面的一切都没有意义。
2. 部署形态选型与环境准备
2.1 三种部署方式对比
Draw.io 在 Windows 上本地部署,基本有三条路:官方 Docker 镜像、静态 Nginx 托管、直接跑桌面版。我放在表格里对比一下。
| 部署方式 | 是否适合当作在线服务 | 难度 | 适用场景 |
|---|---|---|---|
| 官方 Docker 镜像 | 适合,天然就是 Web 服务 | 低,一条命令启动 | 长期跑服务、需要局域网/公网访问 |
| Nginx 托管静态 Web 应用 | 适合,但要自己准备静态资源和 Web 服务器 | 中 | 已有 Nginx 服务、想在反向代理层加认证 |
| 桌面版 | 不适合,只在本机运行 | 极低 | 单机使用、离线画图 |
如果你问我推荐哪个,我首选 Docker。原因很直接:官方镜像把运行时、Web 服务器、依赖全打包好了,你不需要关心 Java 环境、Jetty 配置之类的东西,一条docker run就能起来。Windows 上无非是多装一个 Docker Desktop,一次性投入换长期省心。
Nginx 方案更适合那些已经有一台 Nginx 服务器的人,比如你本来就用 Nginx 做公司内部其他系统的反向代理,那把 Draw.io 作为其中一个站点托管进来,顺带加上访问认证和日志,确实很优雅。缺点是需要自己想办法拿到完整的 Draw.io Web 静态资源,构建或下载这一步对新手不太友好。
桌面版这里就不多说了,它解决不了“外部访问”,只适合个人单机。
2.2 Windows 环境准备
如果走 Docker 路线,Windows 上需要准备 Docker Desktop。安装过程不复杂,但有几个细节会影响后面的使用体验。
第一是确认 WSL2 是否开启。Docker Desktop 默认会依赖 WSL2 作为后端,安装前可以先在 PowerShell 里执行wsl --status看一下状态。如果没有开启,Docker Desktop 安装向导会提示你,按提示重启并更新内核即可。
第二是检查 Docker 命令是否可用。安装完成后,PowerShell 里执行:
docker --version能输出版本号就说明环境正常。如果提示找不到命令,多半是 Docker Desktop 没有启动,或者当前 PowerShell 会话还是旧的,重开一个窗口再试。
第三是硬件资源。很多人在 Windows 上跑 Docker 总觉得卡,其实不是 Docker 本身有问题,而是默认分配的资源不太够。建议在 Docker Desktop 的 Settings -> Resources 里给 CPU 和内存多分一点,尤其是内存,至少 4GB 比较稳妥。Draw.io 本身不重,但 Jetty 容器加操作系统的开销还是有的。
如果走 Nginx 路线,就不需要 Docker 了。准备一个 Windows 版 Nginx 的免安装压缩包,解压后编辑配置文件即可。注意 Nginx 在 Windows 上的进程管理有些怪异,频繁改配置后要用nginx -s reload重载,而不是反复启动多个进程。
2.3 镜像获取与项目目录规划
Docker 路线不需要手动下载任何源码包,直接拉取官方镜像就行:
docker pull jgraph/drawio这个镜像是官方维护的,里面已经内置了 Jetty 服务器和 Draw.io Web 应用。拉取过程取决于你的网络环境,如果镜像仓库访问速度很慢,可以检查一下是否需要给 Docker 配置合适的镜像加速源,这一步属于环境问题,每个网络环境情况不一样。
另外建议在磁盘上规划一个独立目录,比如D:\docker\drawio\data,后续用来挂载数据卷。虽然 Draw.io 在自托管模式下主要把绘图文件保存在浏览器端,服务端状态很少,但目录规整之后,你以后想加插件、做备份、排查日志都会方便很多。
3. 核心部署:Docker 容器与 Nginx 静态站点两种路线
3.1 路线一:用 Docker 镜像快速起服务
这是我最推荐的一条路,因为命令短、逻辑清晰、可复现程度高。启动命令如下:
docker run -d --name drawio --restart unless-stopped -p 8080:8080 jgraph/drawio逐段解释一下:
-d:后台运行,别让容器霸占当前终端。--name drawio:给容器起一个固定名字,后面docker stop drawio直接引用。--restart unless-stopped:让容器在 Docker Desktop 启动时自动运行。Windows 机器重启后,只要 Docker Desktop 是开机启动状态,Draw.io 也会跟着起来,省得你每次手工敲命令。-p 8080:8080:把容器内的 8080 端口映射到宿主机 8080 端口。冒号左边是宿主机端口,右边是容器端口。jgraph/drawio:官方镜像名。
启动之后,先看一眼容器状态:
docker ps如果 STATUS 列不是Up,多半是端口被占了,或者 Docker 没有真正启动。端口冲突时可以换一个端口,比如-p 18080:8080。
浏览器访问http://localhost:8080,看到 Draw.io 的欢迎界面就成了。到这一步,你的本地部署其实已经完成了一半,剩下的是网络开放的问题。
3.2 路线二:Nginx 托管 Draw.io Web 应用
不想用 Docker 的人,可以走静态托管路线。这里的关键是拿到 Draw.io 的纯 Web 静态资源,也就是包含index.html、js、styles等文件的整个 webapp 目录。可以使用官方 Release 包或源码构建,具体获取方式不同,但最终目的都是让 Nginx 指向一个完整的 Draw.io 前端目录。
假设你已经把 Web 应用放到了D:\drawio-webapp,那么 Nginx 配置可以这样写:
worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; gzip on; server { listen 8080; server_name localhost; root D:/drawio-webapp; index index.html; location / { try_files $uri $uri/ /index.html; } } }这里最容易被忽略的是include mime.types。很多新手解压 Draw.io 后直接丢给 Nginx,结果页面白屏,打开开发者工具一看,JavaScript 文件的 Content-Type 是text/plain,浏览器拒绝执行。加了这个 include 之后,所有静态资源的 MIME 类型才会正确识别。
启动 Nginx 的方式是在 Nginx 目录下打开命令行:
nginx.exe -c D:/nginx/conf/nginx.conf访问http://localhost:8080验证。Nginx 路线的优势是后续加认证、HTTPS、访问日志都非常顺手,毕竟是专业的 Web 服务器。
3.3 部署后的基础功能验证
不管用哪条路线,服务起来之后要完整验证一遍,不要只看首页能打开就急着做外部访问。
我一般会做这几项验证:
- 新建一个空白图,拖几个矩形、菱形、箭头出来,确认形状库正常加载。
- 试一试修改文本内容,看字体和样式是否正常。
- 导出一次
.drawio文件,然后再打开这个文件,确认保存、加载链路没问题。 - 试试导出 PNG、SVG,确认图形渲染没有异常。
如果这些操作都正常,说明本地服务已经具备日常使用条件了。此时哪怕不配置外部访问,局域网里也已经有同事能用了,只是还需要开放端口和防火墙。
4. 从本机访问到外部访问:网络配置全记录
4.1 本机访问:先确认监听地址
刚部署完,本地访问http://localhost:8080正常,但这一步不能跳过去。你需要确认服务到底监听在哪个网络地址上。
在 PowerShell 里执行:
netstat -ano | findstr :8080正常情况下会看到类似0.0.0.0:8080的监听地址。这个0.0.0.0表示宿主机所有网卡端口都开放了,局域网其他设备才有可能访问。如果你看到的是127.0.0.1:8080,那说明服务只回环在本地,外部设备怎么都连不上,需要检查 Docker 或 Nginx 的监听配置。
Docker 的-p 8080:8080默认就会绑定到0.0.0.0,所以这一步通常没问题。Nginx 的话,只要listen 8080不带127.0.0.1前缀,也会监听所有网卡。
4.2 局域网访问:防火墙与 IP 绑定
本机验证通过后,想让同一局域网里的其他电脑访问,核心是两个动作:确认 IP、放行防火墙。
先看 IP。在 Windows 机器上执行ipconfig,找到 IPv4 地址,比如192.168.1.100。同一网段的其他电脑直接访问http://192.168.1.100:8080就能打开。
如果访问不了,90% 的原因是 Windows 防火墙把入站请求拦了。用管理员身份打开 PowerShell,添加一条入站规则:
New-NetFirewallRule -DisplayName "Drawio Web 8080" -Direction Inbound -Protocol TCP -LocalPort 8080 -Action Allow这条规则的意思是:允许外部设备通过 TCP 协议访问本机 8080 端口。执行完后再试,基本就能通。
另一个容易被忽略的坑是无线路由器的 AP 隔离功能。有些办公 WiFi 开启了“客户端隔离”,同一个 WiFi 下设备之间互相访问会被禁止。遇到“IP 能 Ping 通但浏览器打不开”的情况,先检查路由器的无线设置。
这里有个经验:不要为了让局域网访问方便,就把 Docker 启动参数改成绑定127.0.0.1,那只会让你的服务只对本机开放,完全违背外部访问的目标。端口映射绑定0.0.0.0才是正确姿势。
4.3 公网访问:端口转发与内网穿透方案
局域网能用了,才轮到“外部访问”最关心的部分:公网访问。先说结论,如果你只是偶尔在外面看自己画的图,没必要申请固定公网 IP,内网穿透方案更灵活。
在配置之前,先区分两种典型需求:
- 需要从出差地、家里访问公司内网的 Draw.io 服务。
- 需要让合作伙伴或客户在外面访问你展示的流程图。
前者适合端口转发或内网穿透,后者要考虑更强的认证和 HTTPS,因为服务已经暴露在公网上了。
方案一:路由器端口转发
在办公室或家庭网络里,通常有一台路由器负责拨号上网。登录路由器管理界面,找到“端口转发”或“虚拟服务器”配置项,把公网侧的某个端口,比如18080,转发到内网 Windows 机器的8080。这样外部访问http://公网IP:18080,路由器会把请求转给内网机器的 Draw.io。
端口转发的前提是你有公网 IP。现在很多宽带实际拿到的是运营商分配的内部 IP,这种情况下端口转发就完全不可用。判断方法很简单:在路由器 WAN 口看到的 IP,和你在网上搜“IP”查到的公网 IP 对比一下,如果一致,说明有公网 IP;不一致就是没有。
公网 IP 总是变化的,搭配 DDNS 动态域名才能稳定访问。路由器自带 DDNS 功能,绑定一个域名,比如drawio.example.net,之后就能用域名访问了。
方案二:内网穿透工具
如果你的网络拿不到公网 IP,那就走内网穿透。思路是:借助一台有公网 IP 的云服务器作中转,让 Windows 本机的 Draw.io 主动和这台服务器建立通道。
以 frp 为例,公网服务器上运行 frps 服务端,Windows 机器上运行 frpc 客户端。服务端配置:
# frps.ini [common] bind_port = 7000客户端配置:
# frpc.ini [common] server_addr = 你的云服务器IP server_port = 7000 [drawio] type = tcp local_ip = 127.0.0.1 local_port = 8080 remote_port = 18080配置完成后,Windows 上启动 frpc,外面的人就可以访问http://云服务器IP:18080。这个方案完全不依赖家里的路由器设置,只要是 Windows 机能主动访问外网就行,适用性很强。
4.4 访问安全加固清单
不管通过哪种方式把 Draw.io 暴露到公网,裸奔都是不可接受的。哪怕只是给几个同事看,也建议做几件事:
第一,加访问认证。如果你用 Nginx,可以用htpasswd生成密码文件,然后在 server 配置里加两行:
auth_basic "Drawio Access"; auth_basic_user_file D:/nginx/conf/.drawio_htpasswd;没有 Nginx 的话,也可以在 Draw.io 前端外面套一层简单的认证服务,但 Nginx 是最省事的。
第二,开启 HTTPS。有域名的情况下,用免费证书工具签一张证书,配置到 Nginx 或 Docker 前面的反向代理上。没有域名就只能用自签名证书,浏览器会提示不受信任,但至少传输过程是加密的。
第三,限制来源 IP。如果使用者基本固定,可以在防火墙上限制只允许某些出口 IP 段访问。比如公司有个固定公网出口 IP,那就只放行这个 IP,其他一律拒绝。
第四,做好访问日志。Nginx 默认会记录每条请求的 IP、时间、路径。出问题的时候查日志是最快的排查手段。Docker 容器日志也可以看,docker logs drawio就能输出最近一段时间的容器日志。
公网访问永远是一个权衡:方便性和安全性此消彼长。我的经验是,先用内网穿透解决“能用”问题,再花半小时把认证和 HTTPS 补上,否则后期出了问题会花更多时间。
4.5 数据目录与备份策略
Draw.io 的绘图数据默认保存在浏览器本地,这一点在本地部署后依然成立。所以你在 Windows 机器上搭好服务,同事画的图默认存在各自的浏览器里,服务器端不会集中存放。如果希望文件不丢,需要建立团队层面的保存规范。
最简单的做法是:画完图后导出.drawio文件,统一保存到共享盘或 Git 仓库。这个文件本质上是 XML 文本,可以用版本管理工具追踪每次修改,非常轻量。
如果你在 Docker 启动命令里挂了数据卷,那服务端的数据目录也需要备份。通常数据卷里的内容很少,但备份一下总没错。Windows 下可以用定时任务把数据目录同步到另一块磁盘。
升级 Draw.io 时更要注意备份。Docker 路线下,升级操作是:
docker pull jgraph/drawio docker stop drawio docker rm drawio docker run -d --name drawio --restart unless-stopped -p 8080:8080 jgraph/drawio因为你已经导出的.drawio文件都在用户手里或共享盘上,重建容器不影响已有内容,风险其实很低。但如果有挂载数据卷,定期备份数据卷目录还是必要的。
5. 常见问题与排查技巧实录
5.1 页面打不开或白屏
页面打不开,先按这个顺序排查:
docker ps看容器是否为 Up 状态。如果不是,看日志:docker logs drawio。netstat -ano | findstr :8080看端口监听是否正常。- 浏览器访问
http://localhost:8080,如果本机可以但局域网不行,重点检查防火墙规则。
页面白屏,大概率是静态资源没加载成功。打开浏览器开发者工具,切到 Network 面板,刷新页面,看是否有script或css文件返回错误。Nginx 方案下,最常见的问题就是 MIME 类型没配置,请求到的 JS 文件 Content-Type 不对,浏览器直接拒绝执行。检查 Nginx 配置里有没有include mime.types。
也有可能是浏览器缓存了旧页面。部署新版本后白屏,先强制刷新一次,Ctrl+F5,排除缓存问题。
5.2 端口映射后外部仍无法访问
端口映射配好了,外面还是连不上,常见原因就三类。
第一,宽带没有公网 IP。这个前面提到过,直接换内网穿透方案。
第二,路由器端口转发没有生效。很多路由器同时有“端口转发”和“DMZ 主机”两个选项,如果两个都配置了,容易冲突。建议只保留精确的端口转发规则,不要开 DMZ。
第三,Windows 防火墙拦截。端口转发只负责把流量从公网送到内网机器,到了 Windows 之后防火墙还是要放行对应端口。前面写的New-NetFirewallRule规则必须存在。
排查外部端口是否可达的方法:从外网机器执行telnet 公网IP 18080,如果连接被拒绝或超时,说明端口没有真正开放到公网。
5.3 离线环境下的模板与图库问题
内网完全隔离的环境里,Draw.io 本身可以正常画图,但有些模板预览、部分资源库可能依赖外部 CDN,导致加载不出来。这不是部署问题,而是网络策略导致的。
解决办法是提前准备离线图形库。Draw.io 支持加载.xml格式的库文件,你可以从官方图库导出一些常用图标集,放到内网共享目录。画图时在左侧面板选择“展开库”,加载本地库文件即可。
也可以把常用的模板做成.drawio文件,放在一个固定目录,团队需要新建图时直接复制一份再修改。我们实践下来,这个做法比让每个人自己找模板高效得多。
5.4 版本升级与数据备份
升级本身不复杂,但有一个原则:先备份,再升级。尤其是你已经用了很久、导出了大量.drawio文件的情况,要把这些文件集中备份一次。
Docker 路线的升级命令我在 4.5 里写过了,关键是重建容器时保持相同的端口映射和挂载参数。如果之前用了--restart unless-stopped,重建后要记得加回去。
Nginx 路线升级时,把新版 Web 资源覆盖到原目录之前,先备份原目录。覆盖后浏览器如果有缓存,按 Ctrl+F5 强制刷新。
5.5 多人同时编辑同一文件的问题
很多人会把“在线流程图工具”和“多人实时协作工具”画等号,这是一个误区。Draw.io 自己支持的是单文件编辑,团队如果多人同时打开同一个.drawio文件,后保存的人会覆盖先保存的人。
如果团队协作很频繁,建议定一个规矩:一个项目一个文件,画图前先统一约定由谁维护;或者用 Git 等版本管理工具管理文件,每次修改都提交一次,至少能追溯历史版本。真正的多人实时协作需要另找方案,Draw.io 的定位始终是轻量、免费、可私有化。
结尾:一点个人体会
我实际用下来,Draw.io 本地部署最值钱的不是省那几块钱订阅,而是把团队的知识资产攥在自己手里。无论是画架构图、时序图还是网络拓扑,最终导出的是 XML 格式的文本文件,配合版本管理非常顺手。最后再分享一个小技巧:我把局域网地址和常用模板的链接做成一个内部导航页,团队点一下就能新建一张带规范模板的图,比官方在线版还省事。如果你也在 Windows 上准备搭这套,建议先把“到底是只给内网用,还是必须公网访问”这条需求确认清楚,再决定要不要上内网穿透和证书,网络策略往往是后面真正花时间的地方。