云控系统怎么搭建?从0到跑通的免root群控实操教程
一、为什么你需要自建云控系统
市面上有各种SaaS群控产品,但很多团队最终选择自建的原因很实际——
数据完全可控。 所有设备日志、脚本内容、执行记录都在你自己的服务器上,不经过任何第三方。对于跨境电商、金融测试等对数据安全敏感的场景,这是刚需。
深度定制自由。 你可以对接内部ERP、CRM系统,实现自然语言控制、自定义AI Agent工作流、甚至为特定App编写专属自动化模板。SaaS产品做不到这些。
长期成本更低。 当设备量达到50台以上时,按台付费的SaaS方案总成本远高于一次性自建投入。自建是一次性硬件投入 + 少量运维人力,规模越大边际成本越低。
理解了这个决策前提后,我们开始动手搭建。
二、架构拆解:云控系统的核心组件
一个完整的云控系统包含以下模块:
| 组件 | 作用 | 选型 |
|---|---|---|
| API网关 | 处理登录、设备管理、任务调度请求 | Node.js / Python FastAPI / Go |
| 关系型数据库 | 存储设备信息、用户信息、任务记录 | MySQL 8.0 / PostgreSQL |
| 缓存层 | 高频读写缓存、设备心跳检测 | Redis |
| 消息队列 | 指令队列、断线重传、异步任务 | Redis Queue / RabbitMQ |
| 实时通道 | WebSocket/H.264视频流转发投屏 | Nginx RTMP / WebRTC |
| 进程守护 | 服务异常退出自动重启 | Supervisor / PM2 |
架构图可简化为三层:
Web浏览器 → Nginx(反代+TLS) → API网关 → Redis/MySQL
↓ WSS/UDP
┌───┴───┐
Agent手机1 Agent手机N
理解了架构后,直接进入部署环节。
三、服务器准备与初始化
推荐云厂商与规格
国内环境建议使用阿里云、腾讯云或华为云的ECS/CVM产品:
- 带宽:单台设备投屏上行约1-3 Mbps,20台至少需40-60 Mbps公网带宽;预算有限可用“带宽包+中转加速”降低单次成本
- CPU/内存:4核8G支撑50台以内;100台以上建议8核16G起步
- 地域:选离业务主力区域最近的机房,延迟越低投屏体验越好
系统初始化(Ubuntu 22.04)
# 1. 更新系统
apt update && apt upgrade -y
# 2. 安装常用工具
apt install -y curl git wget htop net-tools unzip jq
# 3. 创建非 root 用户
adduser cloudadmin
usermod -aG sudo cloudadmin
# 4. SSH密钥登录+禁用密码登录
ssh-keygen -t ed25519
cat ~/.ssh/id_ed25519.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
# 5. 防火墙只开放必要端口
ufw allow 22/tcp && ufw allow 443/tcp && ufw enable
域名解析
购买域名并添加A记录指向服务器公网IP:
*.yourdomain.com → 服务器IP (通配符方便后续扩展子域名)
cloud.yourdomain.com → 服务器IP (控制台专用)
接下来安装核心依赖。
四、两种部署方式
方式一:Docker Compose(推荐新手)
首先安装Docker:
curl -fsSL https://get.docker.com | sh
systemctl enable docker
docker compose version
项目目录下创建 docker-compose.yml:
version: '3.8'
services:
# MySQL 数据库
db:
image: mysql:8.0
restart: always
environment:
MYSQL_ROOT_PASSWORD: your-strong-password
MYSQL_DATABASE: easyclick_cloud
MYSQL_USER: clouduser
MYSQL_PASSWORD: another-strong-password
volumes:
- mysql_data:/var/lib/mysql
ports:
- "127.0.0.1:3306:3306" # 仅本机可访问
# Redis 缓存与消息队列
redis:
image: redis:7-alpine
restart: always
command: redis-server --requirepass your-redis-password
volumes:
- redis_data:/data
ports:
- "127.0.0.1:6379:6379"
# API 后端服务
api:
build: ./backend
restart: always
environment:
DB_HOST: db
DB_PORT: 3306
REDIS_URL: redis://:your-redis-password@redis:6379/0
depends_on:
- db
- redis
ports:
- "8080:8080"
# Nginx 反向代理 + 静态文件
nginx:
image: nginx:alpine
restart: always
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
- ./frontend/dist:/usr/share/nginx/html:ro
ports:
- "80:80"
- "443:443"
depends_on:
- api
volumes:
mysql_data:
redis_data:
启动全部服务:
docker compose up -d
方式二:宝塔面板(国内用户更熟悉)
一键安装宝塔面板:
yum install -y wget && wget -O install.sh https://download.bt.cn/install/install_6.0.sh && sh install.sh ed8484bec
安装以下软件:
- MySQL 8.0:创建数据库和用户
- Redis:缓存与消息队列
- Nginx 1.24:反向代理和站点配置
- Supervisor:后端服务的进程守护
两种方式各有优劣:Docker适合需要严格隔离环境的团队,宝塔适合快速上手且运维深度要求不高的场景。根据技术栈自选。
五、数据库设计与初始化
核心数据模型包括以下几张表:
设备表(devices)
| 字段 | 类型 | 说明 |
|---|---|---|
| id | BIGINT AUTO_INCREMENT | 主键 |
| name | VARCHAR(100) | 设备昵称/编号 |
| status | ENUM(‘online’,‘offline’,‘error’) | 在线状态 |
| platform | ENUM(‘android’,‘ios’,‘harmonyos’) | 设备平台 |
| agent_version | VARCHAR(20) | Agent客户端版本号 |
| last_seen_at | DATETIME | 最后心跳时间 |
| created_at | DATETIME | 注册时间 |
| properties | JSON | 设备属性(品牌、型号、系统版本等) |
任务表(tasks)
| 字段 | 类型 | 说明 |
|---|---|---|
| id | BIGINT AUTO_INCREMENT | 主键 |
| title | VARCHAR(200) | 任务名称 |
| script_content | TEXT | 脚本内容/JSON参数 |
| target_devices | JSON | 目标设备ID列表 |
| status | ENUM(‘pending’,‘running’,‘completed’,‘failed’) | 任务状态 |
| progress | INT | 进度百分比 |
| started_at | DATETIME | 开始时间 |
| finished_at | DATETIME | 结束时间 |
创建表的SQL可以在项目仓库的 sql/ 目录中找到初始迁移脚本。生产环境推荐使用Flyway或类似工具管理数据库版本迭代升级。
六、后端服务核心模块
不讲完整框架代码,列出几个最容易踩坑的核心模块。
设备心跳检测
每个Agent客户端需要按固定间隔(建议10-30秒)向云端发送心跳。云端侧后台进程轮询数据库,标记超过阈值(比如3×心跳间隔)没发消息的设备为离线:
import time
def heartbeat_monitor():
while True:
now = datetime.now()
offline_threshold = now - timedelta(seconds=90) # 3 × 30s
cursor.execute("""
UPDATE devices
SET status = 'offline'
WHERE status = 'online'
AND last_seen_at < %s
""", (offline_threshold,))
time.sleep(10) # 每10秒检查一次
这就是 EasyClick 实际的状态监控面板——在左侧你可以看到中控服务、桥接服务和 AI Agent 的在线状态。如果某台设备掉线了,右侧列表会实时更新最后心跳时间戳,方便你一眼定位问题设备。点击「查看日志」按钮可以直接跳转到底层日志页,不需要额外翻服务器日志文件。
指令队列设计
指令进入Redis消息队列,由Agent主动拉取。这样断线重连后不会丢指令:
device_queue = f"task:{device_id}"
payload = json.dumps({
"task_id": task_id,
"action": "run_script",
"params": {...},
"timestamp": int(time.time())
})
r.lpush(device_queue, payload)
Agent端则定期LPOP自己的队列消费指令。队列为空就阻塞等待一段短时间再重试。这个模式叫“推拉结合”,兼顾了实时性和可靠性。
WebSocket实时投屏
网页上的实时屏幕镜像最佳方案是WebRTC或WebSocket+H.264编码。Agent端持续录屏并编码成H.264视频流通过WebSocket发送给服务端;服务端再通过WebSocket转发到所有订阅了该设备画面的浏览器页面。
关键点在于按需推送:只有有人打开某台设备的投屏页面时才建立视频流连接,没人看的时候关掉编码节省CPU。这部分涉及复杂的实时通信优化,建议优先使用成熟的开源方案做基座再二次开发。
七、前端Dashboard功能清单
Web控制台是用户唯一操作入口,以下功能模块缺一不可:
1. 设备管理页
以卡片或表格形式展示所有已注册设备。每张卡片显示设备名、在线状态(绿/灰圆点)、平台图标、电量(如果有)。支持筛选、搜索、分页、批量操作(选中多台设备同时下发指令)。
2. 实时监控大屏
类似指挥中心的可视化视图:左侧列出现有设备树状结构,右侧显示选中设备的实时画面缩略图墙。点击任意缩略图可以展开全屏查看。顶部放聚合统计指标:总设备数、在线数、今日执行任务数、成功率。
3. 任务编排页
可视化的任务编排编辑器。用户可以:
- 拖拽创建任务步骤(如“打开App A → 点击按钮B → 等待3秒 → 滑动100px”)
- 设置条件分支(“如果弹出弹窗C则点击取消”)
- 设置循环次数和并发策略(顺序执行/并行执行)
- 保存模板供后续复用
4. 数据分析看板
统计报表页面,展示近7天/30天的活跃趋势、脚本执行成功率Top/Bottom分析、设备掉线频率分布等图表。帮助企业评估自动化投入产出比、发现潜在问题。
八、设备接入与测试验证
安装Agent客户端
Agent是每个设备上的核心进程,负责:
- 定时向云端上报心跳和设备信息
- 接收云端下发的脚本和指令并执行
- 采集屏幕画面并通过视频通道推送
- 报告执行结果和异常日志
Android端的Agent通常是一个APK,用户可以通过扫码下载或云控后台OTA静默安装。iOS/HarmonyOS则需要通过各自平台的分发机制。
验证接入成功
安装完成后,在Web控制台刷新设备列表,应该能看到新设备状态变为“在线”。检查一下:
- 设备能否被正常选中?
- 心跳是否正常更新(last_seen_at字段在持续变化)?
- 是否能成功下发一条简单指令(比如打开一个App)?
- 投屏画面是否流畅无严重卡顿?
如果这四步都通过了,说明设备接入链路完全正常。
九、安全加固 checklist
把云控系统在公网暴露出去后安全防护就必须跟上:
- 强制HTTPS:全站启用TLS 1.2以上,强制HTTP→HTTPS跳转
- API认证:所有接口使用Token/JWT鉴权,Token过期时间不超过24小时
- 设备认证:Agent连接时需要携带设备指纹或共享密钥,防止伪造设备接入
- WAF防护:上线前装个免费WAF挡掉常见Web攻击(XSS、SQL注入等)
- 日志审计:记录所有管理员操作日志(谁在什么时间删除了哪个设备),不可篡改
- 数据加密:敏感信息(设备账号密码、API Key)在数据库中要加密存储
- 速率限制:对登录接口和API调用频率做限流,防止爆破和滥用
十、FAQ
Q1:云控系统搭建大概需要多少成本? A:纯自建方案最低配置(4核8G云主机+免费SSL+MySQL开源版+自制前端)大约每月200-400元服务器费用。带宽是主要变动因素——设备越多需要的上行带宽越大。
Q2:有没有开箱即用的云控系统产品? A:市面上有几个选择但大多是SaaS模式而非私有化部署。如果需要完全自主可控(数据在自己服务器上),自建是唯一选项。自建的优点是完全掌控代码、可以随时定制功能、不存在第三方数据泄露风险。
Q3:搭建难度如何?需要什么技术水平? A:中等偏上水平即可胜任。需要具备的能力:Linux服务器管理、Docker/宝塔部署经验、后端服务开发(Node.js/Python/Go任一语言)、数据库设计和基本的前端知识。如果一个团队里有1名全栈工程师,大约2-3周可以跑通MVP(最小可用版本)。
Q4:能不能在家庭NAS或小机上运行? A:理论上可以但有明显的硬件瓶颈。NAS的小机通常CPU和内存都很有限,跑几台设备的轻量管理还凑合,但如果要实时投屏的话几乎扛不住。建议至少保证2核4G的配置。
Q5:多久需要维护和升级? A:正常使用下每周做一次数据库备份就够了。系统本身更新频率取决于你选的框架——主流框架一般每月发布安全补丁,建议及时跟进。
关于 EasyClick:EasyClick 是手机自动化AI智能体平台,覆盖安卓免 root、iOS 免越狱、鸿蒙 Next 三大生态,提供脚本开发、苹果群控、本地中控投屏与云控系统。→ 了解全部产品
想要真实跑起来?
本文介绍的方案均可在 EasyClick 手机自动化平台落地。官网提供完整文档、开发工具与群控云控产品,免费体验。