# 2026-05-27 fmtTime Invalid Date修复 + install.sh venv健壮性 + batch install错误上报

## 变更摘要
1. 修复6个页面的 fmtTime() 函数对带时区后缀(+00:00)的时间戳解析为 Invalid Date
2. install.sh 创建 venv 后检测 activate 文件，缺失时自动安装 python3-venv 重试
3. batch install API 异常时保留 server_name、检测 stdout 中 "Status: FAILED"、stderr 为空时返回提示信息

## 动机
1. API 返回的 last_heartbeat 格式为 `2026-05-26T16:22:14.444657+00:00`，fmtTime() 无脑追加 `Z` 导致双重时区标记 `+00:00Z`，JS Date 解析失败返回 Invalid Date
2. Debian 12 默认不带 python3-venv 包，`python3 -m venv` 创建目录但不生成 activate 脚本，source 报错且无明确提示
3. batch install API 返回 `success:false, stdout:"", error:""` 无具体错误信息，无法排查失败原因

## 涉及文件

### 前端（6个页面）
- `web/app/servers.html` — fmtTime: 先 new Date(t)，失败再 new Date(t+'Z')
- `web/app/index.html` — 同上
- `web/app/credentials.html` — 同上
- `web/app/push.html` — 同上
- `web/app/retries.html` — 同上
- `web/app/schedules.html` — 同上

### Agent 安装脚本
- `web/agent/install.sh` — venv 创建后检测 activate 文件是否存在，不存在则 apt install python3-venv 后重试

### 后端
- `server/api/servers.py` — batch install _install_one(): server_name 提前赋值、检测 "Status: FAILED"、stderr 空时返回提示、超时改为180s

## 需要迁移/重启
- 是：需重启 Nexus 后端（`supervisorctl restart nexus`）
- 否：无数据库迁移

## 验证方式
1. 浏览器打开 servers.html → 最后心跳列显示 "5月27日 00:52" 而非 "Invalid Date" ✅
2. 在缺少 python3-venv 的 Debian 12 服务器运行 install.sh → 自动安装 python3-venv 后继续 ✅
3. batch install 失败时返回具体错误信息 ✅

## 审计8步
- H1: install.sh apt-get 需 root — ✅ 正常（脚本以 root 运行）
- H2: install.sh 检测 activate 而非 -d 目录 — ✅ 修复旧 bug
- H3: servers.py shlex.quote 防注入 — ✅ 已有
- H4: servers.py "Status: FAILED" 字符串匹配 — ✅ 无注入风险
- H5: fmtTime 纯前端日期解析 — ✅ 无 XSS（用 esc() 函数）
- DoD: 无明文密码/命令注入/SQL注入/静默吞错/硬编码 ✅

## 进度条
☑实现 ☑WSL验证 ☑审计8步 ☑部署 ☑健康检查 ☑浏览器验证 ☐changelog（本文件）
