基于群辉 + Docker + Flask 搭建企业内部自动化服务平台
记录一次使用群辉 NAS 搭建企业内部自动化服务平台的实践,包括 Docker 容器部署、自动更新、远程访问以及局域网设备调度。
前言
随着团队内部自动化需求越来越多,需要一个统一的平台来管理各种自动化流程。相比购买云服务器,群辉 NAS 具有成本低、易维护、存储能力强等优势,因此最终选择以群辉作为服务中心,结合 Docker 与 Flask 搭建整个自动化平台。
一、整体架构
整个系统主要分为四部分:
- 主服务:负责业务接口、定时任务、自动化调度。
- 群辉副服务:负责调用群辉系统能力。
- 自动部署服务:监听代码更新并自动部署。
- 局域网设备:运行自动化程序,由主服务统一调度。
开发机 │ Git Push │ 自动部署 │ Docker │ Flask 主服务 ├────────────┐ │ │ 副服务 局域网设备二、主服务设计
主服务是整个系统的核心,基于 Flask 开发,对外统一提供 HTTP API。
除了业务接口之外,还承担了整个自动化平台的调度职责。
1、统一接口管理
所有业务能力均通过接口提供,例如:
- 创建自动化任务
- 查询任务执行状态
- 获取设备列表
- 调度局域网设备
- 获取执行结果
统一接口能够降低模块之间的耦合,后续新增功能时也更加方便。
2、定时任务
除了响应外部请求之外,主服务还维护了一系列定时任务,例如:
- 定时同步业务数据;
- 定时扫描指定目录;
- 定时检测局域网设备是否在线;
- 定时触发自动化流程。
相比依赖操作系统计划任务,统一放在服务端管理更加直观,也方便维护。
3、自动化调度
当收到业务请求后,主服务会根据当前设备状态选择可用设备,并发送执行指令。
整个流程如下:
收到请求 │ 创建任务 │ 查找可用设备 │ 发送执行命令 │ 等待执行完成 │ 返回执行结果这样后续新增自动化程序时,仅需增加新的接口即可,不需要修改整体架构。
三、副服务设计
由于部分群辉能力无法直接在 Docker 容器中调用,因此额外部署了一个副服务。
副服务主要负责:
- 文件操作;
- 共享目录管理;
- 与群辉系统交互。
主服务只需要调用对应接口即可,无需关心底层实现,从而降低系统耦合。
四、自动部署
为了减少人工部署,采用 Git 推送触发自动部署。
部署脚本主要完成以下工作:
- 防止重复部署;
- 拉取最新代码;
- 检查 requirements.txt 是否变化;
- 必要时重新构建 Docker 镜像;
- 停止旧容器并启动新容器;
- 清理无用镜像。
通过比较 requirements 文件哈希值,仅在依赖发生变化时重新构建镜像,能够有效缩短部署时间。
五、内外网访问
内网访问
局域网内设备可直接访问部署在群辉上的 Flask 服务。
所有自动化设备均通过内网与主服务通信,速度快且稳定。
外网访问
由于服务部署在企业内网,外部网络默认无法直接访问,因此需要借助远程访问工具。
目前主要有两种方案:
方案一:DDNS
如果拥有公网 IP,可以通过 DDNS 配置远程访问。
这种方式访问速度快,但依赖公网环境,对网络要求较高。
方案二:向日葵 Docker 镜像
实际项目中采用的是向日葵官方 Docker 镜像。
部署流程如下:
拉取向日葵镜像 │ 启动 Docker 容器 │ 获取设备 SN 与验证码 │ 绑定向日葵账号 │ 远程访问群辉 │ 访问内部服务相比安装群辉套件,Docker 部署更加灵活,也方便后续升级。
容器启动后,可以从日志中获取设备 SN 和验证码,登录向日葵后台完成绑定即可。
绑定成功后,无论身处公司还是外网,都可以直接远程连接群辉,进一步访问部署在群辉中的内部服务,无需额外配置复杂的网络环境。
对于没有公网 IP 的中小团队来说,这种方案部署简单、维护成本低,也是目前项目中长期采用的方式。
六、局域网设备通信
为了调度局域网中的自动化程序,采用 UDP + TCP 的组合方式。
首先通过 UDP 广播发现在线设备。
设备收到广播后返回自身信息,包括:
- IP 地址;
- 设备名称;
- 当前状态。
随后建立 TCP 连接,同步设备支持执行的自动化程序。
当主服务收到执行请求后,只需要选择目标设备并发送命令即可。
客户端则通过本地文件触发器启动对应自动化流程,实现整个调度过程。
七、总结
目前整个平台已经能够稳定运行。
具备以下能力:
- Flask 服务管理;
- Docker 容器部署;
- Git 自动部署;
- 定时任务管理;
- 局域网设备调度;
- 向日葵远程访问;
- 群辉文件管理。
整体部署成本较低,维护简单,比较适合中小团队搭建企业内部自动化平台。
附录 A:自动部署脚本
部署脚本主要流程如下:
获取部署锁 │ Git Pull │ 检查依赖 │ 按需构建镜像 │ 停止旧容器 │ 启动新容器 │ 清理镜像通过 requirements.txt 哈希检测,实现镜像增量构建,提高部署效率。
