Centurion:基于WebSocket与Agent架构的云端服务器统一管理平台设计与实践

发布时间:2026/8/18 3:19:35
Centurion:基于WebSocket与Agent架构的云端服务器统一管理平台设计与实践 1. 项目概述云端控制中枢的诞生最近在折腾一个个人项目我把它命名为“Centurion”。这个名字的灵感来源于古罗马的百夫长寓意着它像一个可靠、强大的指挥官能够统一调度和管理我散落在各处的数字资产与服务。简单来说Centurion 是一个部署在云服务器上的 Web 应用它的核心目标是通过一个统一的 Web 界面安全、便捷地控制和管理我所有的其他服务器、智能设备、应用服务乃至自动化脚本。为什么会有这个想法作为一个经常需要维护多台 VPS、测试不同服务、同时家里还有一堆智能家居设备的人我发现自己每天都在不同的终端、不同的 IP 地址、不同的登录凭证之间反复横跳。SSH 客户端开了一堆浏览器书签里全是各种内网穿透后的管理地址密码管理器都快记不过来了。这种碎片化的管理方式不仅效率低下更关键的是它不安全也不优雅。我需要一个“指挥中心”一个无论我在哪里只要打开浏览器就能看到所有“兵力”状态并能下达指令的地方。这就是 Centurion 要解决的问题。它不是一个简单的服务器监控面板也不是一个单纯的远程桌面网关。Centurion 的设计理念是“协议聚合与控制抽象”。它通过 Web 界面将背后复杂的 SSH、WebSocket、HTTPS、私有 API 等连接封装成统一、安全的操作。对我而言这意味着我可以在咖啡馆用 iPad 安全地重启我的数据库服务器或者半夜在床上用手机检查自动化备份脚本是否正常运行而无需打开电脑启动一堆专业工具。2. 核心架构设计与技术选型构建这样一个“云端控制一切”的系统架构设计是重中之重。它必须在安全性、可扩展性和易用性之间找到最佳平衡点。2.1 整体架构蓝图Centurion 采用典型的前后端分离架构但在此基础上增加了关键的“代理桥接层”。前端控制面板一个单页面应用SPA使用现代前端框架如 React 或 Vue构建。它提供用户交互界面通过 WebSocket 和 HTTPS API 与后端实时通信。所有敏感操作如输入服务器密码都在前端通过非对称加密初步处理确保明文密码不通过网络传输也不在后端日志中留存。后端主控服务核心大脑使用高性能的异步框架如 Node.js Express/Fastify 或 Go Gin开发。它负责用户认证、会话管理、指令路由、日志记录以及最关键的——与“代理桥接层”通信。代理桥接层安全执行单元这是 Centurion 的安全核心。它不是简单的命令转发器。对于需要控制的目标如另一台 Linux 服务器Centurion 会在其上部署一个轻量级的常驻代理程序Agent。这个 Agent 与主控服务之间建立基于 TLS 的双向认证长连接如 WebSocket over TLS。所有指令由主控服务加密后发送给 Agent由 Agent 在目标服务器本地执行再将结果加密返回。这种方式实现了“指令不下发执行在本地”主控服务永远不直接接触目标服务器的 SSH 密钥或密码极大缩小了攻击面。数据库用于存储用户信息、服务器元数据、操作日志等。考虑到结构相对固定和查询需求我选择了 PostgreSQL它的 JSONB 类型非常适合存储动态的服务器配置信息。注意很多人第一反应是用 SSH 隧道或直接在前端用 JavaScript SSH 客户端。这非常危险。前者需要将 SSH 私钥或密码放在前端或后端容易暴露的地方后者则让复杂的 SSH 协议处理和安全问题暴露在浏览器环境中。通过专用的 Agent 进行桥接是更安全、更可控的方案。2.2 关键技术选型解析结合热搜词我们来拆解几个关键技术的选型原因通信协议HTTPS 与 WebSocket 的职责分离HTTPS (RESTful API)负责所有非实时的请求。例如登录认证、获取服务器列表、修改配置、触发一次性任务如备份。使用 HTTPS 是为了利用其成熟、标准的请求-响应模型和广泛的安全基础设施如证书、CORS 策略。WebSocket负责需要实时双向通信的场景。这是 Centurion 的“大动脉”。主要用在两个地方一是前端与控制面板后端的实时控制台输出例如当你点击“查看实时日志”时日志流通过 WebSocket 源源不断地推送到浏览器二是后端与众多 Agent 之间的指令与状态同步通道。一个稳定的 WebSocket 连接避免了 HTTP 轮询带来的延迟和开销是实现实时控制的关键。为什么不是纯 HTTP/2 或 Server-Sent EventsWebSocket 提供真正的全双工通信更适合需要服务端主动、频繁向客户端推送数据的控制类场景。前端实时控制台实现这是用户体验的核心。当用户通过前端发起一个需要在目标服务器执行并查看实时输出的命令如tail -f logfile时流程如下前端通过 HTTPS API 向后端发起“执行命令”请求。后端验证权限后通过与该目标服务器 Agent 的 WebSocket 连接发送加密指令。Agent 执行命令并将标准输出stdout和标准错误stderr以流式方式通过 WebSocket 实时回传给后端。后端再将这个流通过与前端的另一个 WebSocket 连接实时推送到浏览器。前端使用xterm.js或类似的终端模拟器库将收到的数据流渲染成仿真的终端界面。这样就实现了在浏览器中安全地操作远程服务器的体验。安全性设计双向 TLS 认证 (mTLS)在主控服务与所有 Agent 之间强制使用。每个 Agent 都必须持有由 Centurion 私有 CA 签发的客户端证书主控服务只信任这些证书。即使服务器 IP 暴露没有合法证书也无法连接。指令签名所有由主控服务发送给 Agent 的指令都附带数字签名Agent 会验证签名确保指令未被篡改且来源合法。基于角色的访问控制 (RBAC)精细控制哪个用户可以操作哪台服务器执行哪些命令。例如可以设置“开发人员”只能重启测试环境的服务而“运维人员”可以执行所有操作。完整的审计日志所有用户操作、执行的命令、返回结果可配置脱敏都被永久记录便于事后审计和故障排查。3. 核心功能模块深度实现Centurion 的功能模块围绕“控制”二字展开以下是几个核心模块的实现细节。3.1 服务器与资产管理这是所有控制的基础。你需要先告诉 Centurion “你有什么”。资产录入支持手动添加和自动发现。手动添加就是填写服务器 IP/域名、昵称、分组如“生产环境”、“数据库集群”。更高效的方式是提供一段安装脚本在目标服务器运行后Agent 会自动向主控服务注册并上报基础信息OS、CPU、内存、磁盘等。连接测试与状态监控添加资产后Centurion 会通过 Agent 连接立即进行一次基础状态检查CPU、内存、负载。之后Agent 会定期如每30秒发送心跳包。前端界面用彩色指示灯直观展示服务器状态绿色在线健康、黄色在线高负载、红色离线或心跳丢失、灰色未配置Agent仅手动管理。凭证管理Centurion绝不存储明文密码或私钥。对于需要通过 SSH 管理的传统服务器未安装Agent采用“凭证库”方式。用户在后端添加凭证时前端使用主控服务提供的 RSA 公钥加密密码/私钥加密后的密文才被发送到后端存储。当需要使用该凭证时后端将密文发送给具有解密权限的组件或由前端在安全环境下解密整个过程明文不落盘、不传输。3.2 安全远程终端与文件管理这是使用频率最高的功能要求既安全又流畅。终端实现如前所述基于xterm.js WebSocket 实现。会话恢复网络中断或浏览器刷新后可以重新连接到之前的终端会话不会丢失正在运行的命令如top或vim。这需要后端维护会话状态并将缓冲的输出在重连后推送给前端。权限控制可以限制终端使用的用户。例如某台服务器只允许以deploy用户身份登录操作。操作拦截与审批对于高风险命令如rm -rf /dd 或修改关键配置可以设置为“拦截模式”。当用户输入此类命令时终端会暂停并需要另一位具有审批权限的用户在界面上确认后命令才会真正下发执行。文件管理实现一个类 FTP 的浏览器内文件管理器。通过 Agent 在目标服务器上执行ls,find,stat等命令获取文件列表和元数据并以 JSON 格式返回给前端渲染。文件上传/下载通过 HTTPS API 分块传输。上传时前端将文件切片逐块加密上传至后端后端转发给 Agent 在服务器上拼接。下载反之。全程使用 TLS 加密。在线编辑对于文本文件可以调用前端代码编辑器组件如 Monaco Editor在线打开。保存时内容通过安全通道写回服务器。这比vim更适合不熟悉终端编辑器的用户。3.3 批量操作与任务编排管理一台服务器是基础同时管理成百上千台才是价值所在。批量命令执行在界面上勾选多台服务器输入一个命令如sudo systemctl restart nginxCenturion 会并发地向所有选中服务器的 Agent 发送指令。前端会以“任务”视图展示实时滚动每条命令在每个服务器上的执行状态等待、执行中、成功、失败和输出摘要。脚本库与分发将常用的运维脚本Shell、Python、Ansible Playbook上传到 Centurion 的脚本库。可以一键将脚本分发到指定服务器组并执行。脚本支持参数化执行时填入变量。定时任务Cron管理提供一个比直接编辑crontab更友好的界面。可以可视化地创建、管理分布在多台服务器上的定时任务。Centurion 的 Agent 会负责将任务写入目标服务器的 crontab并监控其执行结果在控制面板上集中展示日志。工作流编排这是高级功能。可以定义一个包含多个步骤的工作流例如“1. 在服务器A上拉取代码 - 2. 在服务器B上执行数据库迁移 - 3. 在服务器组C上滚动重启服务”。每个步骤可以设置依赖关系、失败重试策略和通知规则。3.4 监控告警与仪表盘Centurion 需要提供基本的监控能力让你一眼知全局。数据采集Agent 除了心跳还定期采集系统指标CPU、内存、磁盘、网络、进程数。也可以通过配置让 Agent 执行自定义的监控脚本采集应用层面的指标如 MySQL 连接数、Redis 内存使用率。数据存储与展示采集到的指标数据通过 Agent 上报后端可以选择存储到时序数据库如 InfluxDB或直接使用 PostgreSQL对于小规模场景。前端集成图表库如 ECharts可以自定义仪表盘将关键指标以折线图、仪表盘、表格等形式可视化。告警机制用户可以设置阈值告警规则。例如“当某服务器内存使用率超过90%持续5分钟时触发告警”。告警触发后可以通过 Centurion 内置的通知渠道如邮件、Webhook 到钉钉/飞书/Slack发送消息。告警事件也会在活动日志中高亮显示。4. 部署与运维实践一个系统设计得再好部署和运维不友好也是白搭。4.1 主控服务部署推荐使用 Docker Compose 或 Kubernetes 部署这能解决环境依赖和编排问题。# docker-compose.yml 示例片段 version: 3.8 services: postgres: image: postgres:15-alpine environment: POSTGRES_DB: centurion POSTGRES_USER: centurion POSTGRES_PASSWORD: your_strong_password_here volumes: - pg_data:/var/lib/postgresql/data networks: - centurion-net redis: image: redis:7-alpine command: redis-server --appendonly yes volumes: - redis_data:/data networks: - centurion-net centurion-server: image: your-registry/centurion-server:latest depends_on: - postgres - redis environment: - DB_HOSTpostgres - REDIS_HOSTredis - JWT_SECRETyour_super_secret_jwt_key - EXTERNAL_URLhttps://centurion.yourdomain.com ports: - 443:443 # HTTPS - 80:80 # 可选用于HTTP重定向到HTTPS volumes: - ./certs:/app/certs:ro # 挂载SSL证书 - ./data:/app/data # 挂载持久化数据上传文件等 networks: - centurion-net volumes: pg_data: redis_data: networks: centurion-net: driver: bridge关键点SSL 证书必须使用有效的 TLS 证书如 Let‘s Encrypt。EXTERNAL_URL环境变量必须与证书的域名匹配否则 WebSocket 连接可能因安全策略失败。数据持久化数据库、Redis 以及应用上传的文件目录必须做卷映射防止容器重启数据丢失。网络隔离使用自定义网络确保服务间通信安全。4.2 Agent 部署与注册Agent 需要部署到所有待管理的目标服务器上。为了安全推荐以下流程生成安装令牌在 Centurion 控制面板上为某个服务器或服务器组生成一个一次性或短期有效的安装令牌。执行安装脚本登录目标服务器运行 Centurion 提供的安装命令该命令会附带安装令牌。curl -sSL https://centurion.yourdomain.com/install.sh | sudo bash -s -- --token YOUR_INSTALL_TOKEN --server https://centurion.yourdomain.com自动注册安装脚本会自动下载对应系统的 Agent 二进制文件使用令牌向主控服务认证获取长期有效的客户端证书并完成注册。之后Agent 会以系统服务systemd 或 supervisor的形式常驻运行。实操心得安装脚本一定要做完整性校验如校验SHA256并且最好提供离线安装包。对于无法直接访问公网的内网服务器可以先在一台能通公网的机器上下载好所有文件再通过内网方式分发安装。4.3 高可用与备份策略对于生产环境单点部署的主控服务是不可接受的。主控服务高可用可以将 Centurion 后端设计为无状态服务通过负载均衡器如 Nginx暴露。多个后端实例共享同一个数据库和 Redis 集群。WebSocket 连接的状态可以存储在 Redis 中从而实现实例间的会话同步。数据库高可用PostgreSQL 可以采用主从复制或流复制集群。Agent 重连与容错Agent 必须具备强大的重连机制。当与主控服务的网络中断时Agent 应在本地缓存待执行的指令如果安全策略允许或等待重连。重连成功后同步丢失的状态。备份定期备份数据库和存储在/app/data下的文件。备份脚本本身可以作为 Centurion 的一个定时任务来管理。5. 常见问题与故障排查实录在实际开发和运维 Centurion 的过程中我踩过不少坑这里记录一些典型问题和解决方法。5.1 WebSocket 连接不稳定或频繁断开这是初期最常见的问题表现就是终端突然卡住或者控制面板显示服务器离线又上线。原因1网络中间件超时。Nginx 等反向代理对 WebSocket 连接有默认的超时设置如 60s。解决在 Nginx 配置中为 WebSocket 连接路径增加超时设置。location /ws/ { # 你的 WebSocket 路径 proxy_pass http://backend_server; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection upgrade; proxy_set_header Host $host; # 以下是关键设置长连接超时 proxy_read_timeout 3600s; # 读超时 proxy_send_timeout 3600s; # 写超时 proxy_connect_timeout 75s; # 连接超时 }原因2防火墙或安全组策略。只开放了 443 端口但可能拦截了长时间的 TCP 连接。解决检查云服务商安全组和服务器本地防火墙如ufw或firewalld确保对 443 端口的 TCP 连接没有异常的中断策略。原因3客户端浏览器休眠。笔记本电脑合盖或手机锁屏后浏览器可能节流或暂停页面导致 WebSocket 心跳包发送失败。解决在前端实现“连接健康度检测”当检测到连接异常时自动尝试静默重连并在 UI 上给出友好提示。同时适当缩短 WebSocket 心跳间隔如 25秒以便更快地发现死连接。5.2 Agent 注册失败或显示“未授权”排查步骤检查令牌安装令牌是否过期是否已被使用过一次性令牌检查网络连通性在目标服务器上执行curl -v https://centurion.yourdomain.com/api/health看是否能正常访问主控服务的 API并检查证书是否有效。检查 Agent 日志Agent 通常有日志文件如/var/log/centurion-agent.log。查看日志中的错误信息常见的有“连接被拒绝”、“证书错误”、“令牌无效”等。检查主控服务日志查看主控服务在 Agent 尝试注册时的日志看是否有更详细的错误记录如 IP 被限制、请求格式错误等。5.3 在浏览器中执行命令速度慢或输出有延迟原因1网络延迟。这是物理限制如果主控服务在海外你在中国访问延迟是必然的。缓解可以考虑在不同区域部署多个主控服务节点让用户就近接入。或者对于文件传输等大流量操作启用压缩。原因2后端或 Agent 处理瓶颈。单个命令输出巨大如cat一个几 GB 的日志文件可能会阻塞通道。解决在 Agent 端实现输出流控Throttling限制每秒发送回的数据量。或者对于查看大文件提供“分页查看”或“下载”功能而不是在终端里直接cat。原因3前端渲染性能。xterm.js在渲染极快速度的输出流时例如yes命令可能会导致浏览器卡顿。解决调整xterm.js的缓冲区大小或在前端对接收到的数据进行适当的缓冲和节流渲染。5.4 安全相关注意事项最小权限原则给 Centurion Agent 在目标服务器上配置的运行时用户权限必须严格控制。通常创建一个专用的centurion系统用户并仅通过sudo授权其执行必要的、预先定义好的命令在/etc/sudoers.d/中精细配置而不是给予ALL权限。定期轮换证书用于 mTLS 的客户端和服务端证书应设置合理的有效期如一年并建立流程定期轮换。审计日志的存储与保护操作日志是安全事件追溯的最后防线。必须确保日志存储在安全、防篡改的地方如只追加的存储系统并定期备份。对于高风险操作的日志如提权命令应进行额外加密。控制面板的访问安全主控服务的 Web 界面本身必须加固强制使用强密码、启用双因素认证2FA、设置登录失败锁定策略、限制访问 IP 范围如果条件允许。开发 Centurion 的过程是一个不断在便利性与安全性之间权衡的过程。它极大地提升了我的运维效率但同时也让我对“控制”一词背后的责任有了更深的理解。任何强大的工具都必须配以严谨的使用规范和持续的安全审视。目前我已经用它管理着几十台服务器和数百个定时任务那种一切尽在掌握的从容感是之前碎片化管理时无法比拟的。如果你也受困于多环境管理的繁琐不妨尝试构建一个属于自己的“Centurion”从设计到实现这本身就是一个极具价值的学习过程。