# 2026-05-23 — 脚本/健康检查改 SSH，弱化 8601

## 摘要

远程脚本执行与手动健康检查改为经 **SSH（22）**；Agent 仅负责 **HTTPS 出站心跳（443）**。子机 Agent HTTP 默认只监听 `127.0.0.1:8601`，**不要求**公网放行 8601。

## 动机

大量宝塔子机未开放 8601；推送与文件已走 SSH。统一命令通道为 SSH，监控仍靠 Agent 心跳，减少防火墙与双通道维护成本。

## 涉及文件

- `server/application/services/script_service.py` — `_call_ssh_exec`，移除 Agent HTTP 执行路径
- `server/application/services/server_service.py` — `check_all_servers` 改 SSH 探测
- `server/infrastructure/ssh/remote_probe.py` — 新增 SSH 健康/指标探测
- `server/api/servers.py` — 健康检查 API 文档说明
- `web/agent/install.sh` — Python 3.12 venv、127.0.0.1 绑定、不再自动放行公网 8601
- `web/app/servers.html` — 安装说明文案
- `server/config.py` — 注释

## 端口模型（变更后）

| 方向 | 端口 | 用途 |
|------|------|------|
| 子机 → 中心 | 443 出站 | Agent 心跳、长任务 curl 回调 |
| 中心 → 子机 | 22 入站 | 推送、文件、脚本、手动健康检查 |
| 127.0.0.1:8601 | 仅本机 | Agent 进程（可选，不暴露公网） |

## 迁移 / 重启

- 需重启 Nexus 后端以加载 Python 变更
- 已装 Agent：建议重装或手动改 systemd 为 `127.0.0.1` + venv；**不必**再开公网 8601
- 确保各服务器 SSH 凭据可用（与推送相同）

## 验证

1. 子机 Agent 运行：`journalctl -u nexus-agent -f`，心跳 200
2. 未开公网 8601 时：脚本页执行命令应成功（`channel: ssh`）
3. `POST /api/servers/check` 返回 `channel: ssh` 且 `status: online`（SSH 可达时）
