# 凭据轮询 / pending servers — 生产与健康检查验证

**日期**: 2026-06-06  
**关联**: [2026-06-06-frontend-14p-contract-audit.md](2026-06-06-frontend-14p-contract-audit.md)

## 生产 API

```bash
curl -sf https://api.synaglobal.vip/health
# → ok

curl -sf https://api.synaglobal.vip/openapi.json | jq '.paths | keys[] | select(test("pending|add-by-ip"))'
```

| 路径 | OpenAPI |
|------|---------|
| `/api/servers/add-by-ip` | ✓ |
| `/api/servers/pending` | ✓ |
| `/api/servers/pending/{pending_id}/retry` | ✓ |
| `/api/servers/pending/{pending_id}` | ✓ |

`AddByIpRequest` 字段：`domain`, `port`, `name`, `agent_port`, `target_path`, `category`, `platform_id`, `node_id`。

## 生产前端（SPA）

构建产物已与本地 `vite build` 一致（主包 `index-o0-2k-vI.js` 哈希相同）。

| 分块 | 关键字探测 |
|------|------------|
| `ServersPage-Z2EpNr-B.js` | `add-by-ip`, `servers/pending`, `快速添加`, `matched_preset` |
| `CredentialsPage-Cf9BpH3x.js` | `username`（24 处） |

**结论**: 后端与前端均已部署到生产，无需本轮再跑 `deploy-frontend.sh`（本地 SSH 别名 `nexus` 亦不可解析）。

## 单元 / 静态门控

| 检查 | 结果 |
|------|------|
| `pytest tests/test_credential_poller.py` | 7 passed |
| `ruff check server/ --select F` | All checks passed |
| `cd frontend && npx vite build` | ✓ built |

## 本地 `local_verify.sh`

**未通过** — 根因：宿主机进程无法完成 MySQL 握手（`OperationalError 2013`），但：

- Docker 内 `mysql` 服务名连接正常（`docker run --network nexus_default mysql:8.4 mysql -h mysql …` → OK）
- 容器 `docker exec nexus-mysql-1` 内查询正常
- 宿主机 `127.0.0.1:3306` / 桥接 IP `172.18.0.3:3306` 均 2013

属本机 Docker 端口转发 / 网络策略问题，与凭据轮询代码无关。

**建议本机恢复路径**：

1. `docker compose up -d nexus --build` — API 走容器内 `mysql` 主机名；或  
2. 修复宿主机→Docker MySQL 3306 转发后，对齐 `.env` 中 `NEXUS_DATABASE_URL` 与 `docker-compose` 卷内实际密码；或  
3. `NEXUS_TEST_ADMIN_PASSWORD=… python3 scripts/seed_local_admin.py` 后重跑 `bash scripts/local_verify.sh`

## 待用户终验（需登录生产控制台）

1. 凭据页：密码/SSH 预设填写 `username` 并保存  
2. 服务器页：「快速添加」输入测试 IP → 成功 toast 或失败弹窗 + 失败列表  
3. 失败列表：重试 / 删除

## 未提交工作区（文档 + 类型）

- 契约审计报告、功能指南 §12、附录 J、`types/api.ts` 共享类型  
- 代码功能已在 `4ba45ab` 合入；上述为审计收尾文档
