所谓云控系统,就是一个跑在服务器上的管理后台:设备连上来,你在网页里发任务、看状态、收数据。
为什么自建,架构和部署怎么走
市面上有各种 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,用通配符方便后续扩展子域名,另留一个 cloud 子域给控制台专用。
部署有两种方式。一是 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。二是宝塔面板(国内用户更熟悉),一键安装后装 MySQL 8.0、Redis、Nginx 1.24、Supervisor 四个软件。两种方式各有优劣:Docker 适合需要严格隔离环境的团队,宝塔适合快速上手且运维深度要求不高的场景。
数据库这边,核心是设备表和任务表。
| 字段 | 类型 | 说明 |
|---|---|---|
| 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 | 设备属性(品牌、型号、系统版本等) |
| 字段 | 类型 | 说明 |
|---|---|---|
| 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 发给服务端,服务端再转发到所有订阅了该设备画面的浏览器页面。关键在按需推送——只有有人打开某台设备的投屏页面时才建立视频流连接,没人看的时候关掉编码节省 CPU。为什么按需推送?没人看还开着编码,纯烧 CPU。
前端 Dashboard 是用户唯一操作入口,几个模块缺一不可:设备管理页以卡片或表格展示所有设备,显示设备名、在线状态、平台图标、电量,支持筛选、搜索、分页、批量操作;实时监控大屏用设备树加缩略图墙,顶部放总设备数、在线数、今日任务数、成功率;任务编排页支持拖拽创建步骤、设置条件分支、设置循环和并发策略、保存模板复用;数据分析看板展示近 7 天/30 天的活跃趋势、执行成功率 Top/Bottom、掉线频率分布。
设备接入时,Agent 是每个设备上的核心进程,负责上报心跳和设备信息、接收并执行云端指令、采集屏幕画面推送、报告结果和异常。Android 端通常是一个 APK,可以扫码下载或 OTA 静默安装;iOS/鸿蒙则通过各自平台的分发机制。装完后在控制台刷新设备列表,应该能看到新设备变为“在线”,检查四件事:设备能否被正常选中、心跳是否持续更新、能否成功下发一条简单指令、投屏画面是否流畅。四步都通过,说明接入链路完全正常。
最后是安全加固,云控系统暴露在公网后防护必须跟上:强制 HTTPS(TLS 1.2 以上、强制 HTTP 跳转)、API 认证(Token/JWT 鉴权、过期不超过 24 小时)、设备认证(Agent 连接时携带设备指纹或共享密钥)、上线前装 WAF 挡常见 Web 攻击、操作日志审计且不可篡改、敏感信息加密存储、对登录和 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:手机自动化脚本开发平台,覆盖安卓免 ROOT、iOS 免越狱、鸿蒙三大手机生态,还提供苹果脚本编写、苹果群控、安卓群控、远程云控、AI 群控手机等。→ 了解全部产品
想要真实跑起来?
本文介绍的方案均可在 EasyClick 手机自动化平台落地。官网提供完整文档、开发工具与群控云控产品,免费体验。