# 云端服务器整理与优化卡（零停机优先）

> 背景：服务器 `43.167.209.150` 上同时跑着**实盘交易系统**与 Agent OS。
> 任何操作的第一原则：**不许中断交易链路**。
> 出卡人：验收方（DeepSeek Harness）　依据：2026-10-17 真机审计

---

### P1-06B 云端服务器整理与优化（先安全、再稳定、后容量）

```text
【任务 P1-06B】整理并优化云端服务器（零停机优先）

一、审计现状（验收方真机实测，2026-10-17，不要再重新审计）
  机器：Windows Server 2022 Datacenter，主机名 10_7_0_14，**2 核 / 2 GB 内存 / 50 GB 盘**
  磁盘：total=49.9GB  free=5.7GB (11.4%)   ← 偏低
  进程（全部 python）：
    PID 3440  "C:\Program Files\Python311\python.exe" -m uvicorn app.main:app --host 0.0.0.0 --port 8000
              ← 真正的 Agent OS，占 :8000，WS=15MB，CPU=27s
    PID 5096  "C:\agent-os\backend\venv\Scripts\python.exe" -m uvicorn ... --port 8000
              ← **重复实例**：抢端口失败但进程仍在（WS=212KB），白占资源、混淆排障
    PID 1812  relay_server.py  **监听 0.0.0.0:8001**（中继，安全风险，见 P0-2）
    PID 992   silicon_proxy.py（硅基→deepseek 通道）
    PID 5064  hermes.exe gateway run（交易大脑，CPU 已累计 901s，**绝不能动**）
  端口：22 sshd / 80,443 nginx / 445 SMB / 3389 RDP / 8000 uvicorn / **8001 relay** / 19527 btPanel
  服务化状况：Agent OS **没有** Windows 服务、<b>没有</b>计划任务（裸进程，崩了不会自愈）
             对比 Hermes 有 HermesGateway / HermesGatewayBoot / HermesGatewayWatchdog 三个守护
  .env：DEBUG=true（生产环境不该开）
  uvicorn 未开 --reload（这点是对的，保持）
  可回收空间：C:\BtSoft 1732MB、winevt\Logs 149MB(345文件)、Windows\Installer 196MB、
              WU Download 46MB、回收站 36MB、Windows\Temp 10MB(769文件)

二、【绝对禁止】以下任何一项都会造成真实资金损失或服务中断
  1. 禁止停止/重启/杀以下进程或它们的任务：
     hermes.exe gateway run(PID 5064)、silicon_proxy.py(PID 992)、relay_server.py(PID 1812)、
     任何 Hermes* / ydguard / cua-driver-serve / CreatorHub 计划任务
  2. 禁止改动 C:\Users\Administrator\AppData\Local\hermes\ 下任何脚本与 cron 配置
  3. 禁止卸载/重装宝塔(C:\BtSoft) 与 nginx
  4. 禁止修改 Windows 防火墙的"远程桌面(3389)/SSH(22)"放行策略（可能把你锁在门外）
  5. 禁止格式化/重建分区、禁止磁盘压缩
  6. 禁止改 .env 里除 DEBUG 以外的任何值（DATABASE_URL/REDIS_URL/ENCRYPTION_KEY/HERMES_* 都要原样）

三、分级任务（按顺序做，每步做完必须验证，验证不过就回滚并停下）

P0-1【清理重复 uvicorn】风险：极低
  动作：确认 PID 5096 不是服务端口持有者后结束它
        Get-NetTCPConnection -State Listen -LocalPort 8000 | Select OwningProcess   # 应为 3440
        Stop-Process -Id 5096 -Force
  验证：Get-CimInstance Win32_Process -Filter "Name LIKE '%python%'" 里只剩 1 个 uvicorn
        curl http://127.0.0.1:8000/api/v1/health  →  {"status":"ok","version":"0.1.0"}

P0-2【中继 relay 的安全处置】**需要用户拍板，做之前必须问**
  事实：relay_server.py 监听 0.0.0.0:8001，同目录有 ssh_tunnel.zip/connect.bat/worker.zip/config.json。
  请：① 把它的用途、谁在用、是否仍需常驻写进 done.json 的 notes；
      ② 给出三个选项供用户选：保留但对来源 IP 限流/限制、改监听 127.0.0.1（仅本机用）、
         确认不需要则停用并移除开机自启；
      ③ **在用户明确选择前，不要停止它、不要删除任何文件**。

P0-3【防火墙收敛，只做"加严"不做"放宽"】
  目标：8000 端口不应对公网直开（应只允许本机/nginx）。
  动作：加一条入站规则：只允许 127.0.0.1 访问 8000；若现有规则放开了 8000 到 Any，则禁用那条。
  验证：从本机 `curl http://127.0.0.1:8000/api/v1/health` 仍 200；
        外部访问 8000 应失败（可用另一台机器或在线端口探测确认）。
  回滚：重新启用原规则。
  ⚠ 不要碰 3389/22 的规则。

P1-1【Agent OS 服务化 + 自动重启】这是本轮最大收益
  目标：uvicorn 由一个带"失败自动重启"的服务/任务承载，机器重启后自动恢复。
  要求：
    - 用 **项目自带 venv** 的 python（C:\agent-os\backend\venv\Scripts\python.exe）启动，
      工作目录设为 C:\agent-os\backend，这样依赖与项目锁定，不再依赖系统 Python
    - 命令行：-m uvicorn app.main:app --host 127.0.0.1 --port 8000 --workers 1 --log-level info
      （2 核机器不要开多 worker；host 改 127.0.0.1 由 nginx 反代，见 P1-3）
    - 配置失败自动重启（NSSM 服务，或计划任务 + 每分钟检查 + 进程不在则拉起，二选一）
  迁移方式（零停机思路）：
    ① 先建好服务但**不启动**
    ② 停 3440 → 立刻启动服务 → 验证 health 200
    ③ 若 5 秒内 health 不通，立刻回滚：停服务 → 用原命令手工拉起 uvicorn
  验证：health 200；`Get-Service`（或任务）显示 Running；**重启一次服务，确认能自动起来**；
        记录重启前后 PID 变化。

P1-2【DEBUG 关掉】风险：极低
  把 .env 里 DEBUG=true 改为 DEBUG=false（只改这一项），重启服务后验证 health 200 与日志量下降。
  回滚：改回 true。

P1-3【收进 nginx 反代（获得 TLS/限流/访问日志）】
  前提：nginx 已在跑（80/443）。把 /api/ 反代到 127.0.0.1:8000。
  这一步若涉及证书与域名（ldeh.asia），**先只做一条最小反代并用本机 curl 验证**，
  不要一次性改掉现有站点配置；配置改动前先备份 nginx conf。
  验证：经 nginx 访问 /api/v1/health 返回 200；原直连方式按 P0-3 关闭。

P2-1【磁盘回收，目标回收 ≥ 2 GB】
  按安全顺序，每项做完报告回收量：
    ① 回收站：Clear-RecycleBin -Force
    ② Windows\Temp：删除超过 2 天的文件（不要整目录删）
    ③ winevt\Logs：先 `wevtutil set-log <name> /maxsize:...` 把上限压到 20MB，
       再清理最老的日志，**不要清安全日志**
    ④ Windows\Installer：**只报告体积，不要删**（删了会导致无法修复/卸载）
    ⑤ C:\BtSoft：只清理安装包/临时下载（如 .zip、install 缓存），**不要动面板本体与网站**
    ⑥ Windows\SoftwareDistribution\Download：先停 wuauserv → 清 → 再启动
  验证：报告整理前后 free space 对比；health 仍 200；nginx 仍 200。

P2-2【日志与备份轮转】
  - Hermes 记忆目录有 12 个 .bak/.conv_/.sink/.nxai_backup 文件（体积很小，但会一直涨）：
    写一个轮转脚本，只保留最近 5 个备份文件。
  - 给 Agent OS 的日志加轮转（按大小 10MB × 5 份）。
  - 事件日志上限统一压到 20MB。
  验证：脚本跑一次后列出剩余文件；磁盘余量变化。

P2-3【计划任务梳理（只报告不改）】
  现有非 Microsoft 任务：CreatorHub、CreatorHub_Logon、cua-driver-serve、EnableOpenSSHOnce、
    hermes-reload、HermesGateway、HermesGatewayBoot、HermesGatewayWatchdog、HermesGwReloadOnce、
    HermesReloadTest、ydguard。
  请梳理成表：任务名 / 触发方式 / 实际执行的命令 / 是否仍需要 / 建议（保留/合并/禁用）。
  **本项只出报告，不执行禁用**，等用户确认。

四、每一步结束都要写进 done.json 的 verify 字段，格式：
   "P0-1: 结束前 uvicorn 进程 2 个 → 结束 1 个后剩 1 个；health=200；
    P1-2: DEBUG true→false；重启后 health=200；P2-1: free 5.7GB→X GB"

五、验收标准（全满足才算完成）
  □ 8000 端口只有一个 uvicorn 进程，且由服务/任务托管（重启能自动起来）
  □ health 始终 200（每一次改动后都验过）
  □ 日志里不再有 DEBUG 级刷屏
  □ free space 至少回收 1.5 GB，并给出前后对比
  □ 交易相关进程/任务【一个都没被动过】（列出它们的 PID 与启动时间证明未变）
  □ relay 的处置已写成选项交用户决策（无论用户怎么选，都要有记录）
  □ 计划任务梳理表已产出
  □ 全部改动都有回滚说明
```

---

## 附：为什么不用暂停整台服务器

用户曾提出可以暂停服务器再优化。**不要这么做**，原因：

1. 这台机器上 `hermes.exe gateway run` 是交易大脑，另有播报自愈(10min)/盯盘(30min)/link_check(30min) 等 cron，
   记忆里明确写着 `margin_gate`、`止损·反手照常`、`watch_only.flag` —— 停摆期间**止损不会执行**。
2. 本轮所有优化**都不需要停机**：清理是文件操作；服务化可以用"先建后切、5 秒内回滚"；
   DEBUG 与监听地址只影响 Agent OS 这个 PWA 后端，与交易进程无关。
3. 真要停，也只能停 Agent OS 服务本身（秒级），而不是整台机器。

**因此：本卡全程零停机（最多 Agent OS 秒级重启），任何需要停机才能做的项一律不做、写进报告。**
