flowchart LR
subgraph MySQL_vps_info[MySQL vps_info:单机 API 的事实表]
A1[id 主键]
A2[ip_port_info 远程 SSH 入口]
A3[username/password SSH 凭据]
A4[proxy_ip 当前代理出口 IP]
A5[score/delay 质量评分]
A6[status: ok/unavailable/networkError]
A7[message 异常或告警说明]
A8[time 最近更新时间]
end
subgraph Redis_keys[Redis:批量代理池运行态]
B1[vps_info hash:待管理机器清单]
B2[proxy_pool hash:addr -> 当前代理状态]
B3[proxy_catch zset:按 ts 保存新 IP 捕获记录]
B4[restricted_proxy set:暂停更新名单]
end
subgraph Interfaces[接口/外部系统]
C1["/api/vps/restart_dial 触发单台重拨"]
C2["/api/vps/get_ip 查询单台状态"]
C3["/api/vps/get_all 查询全部状态"]
C4[adm proxy_report 接收上报]
C5[adm proxylist 或 Redis vps_info 提供机器列表]
end
C1 --> A2
C1 --> A3
C1 --> D[SSH 重拨和测速]
D -->|成功| S1[status=ok;写新 proxy_ip、score、delay、time]
D -->|重拨异常| S2[status=unavailable;message 写失败原因]
D -->|VPS 内部 ping 失败| S3[status=networkError;说明远端出网异常]
D -->|SSH 失败| S4[update_info_ssh:只写 score/delay/message/status/time,不覆盖 proxy_ip]
S1 --> A4
S1 --> A5
S1 --> A6
S2 --> A6
S2 --> A7
S3 --> A6
S3 --> A7
S4 --> A5
S4 --> A7
C2 --> A4
C2 --> A5
C2 --> A6
C3 --> A4
C3 --> A5
C3 --> A6
C5 --> B1
B1 --> E[ProxyPool 创建 Host 队列]
B4 -->|命中| E1[Host 跳过更新]
E --> F[Host.update_proxy]
F -->|当前态读旧 IP| B2
F -->|新 IP 且不同| B3
F -->|每轮最终状态| B2
F -->|上报结果| C4
B2 --> G[下游代理消费者/管理面板读取当前可用代理]
B3 --> H[排查换 IP 频率、历史质量和代理捕获情况]