{ "started_at": "2026-06-01T16:29:53.805397+00:00", "base_url": "https://api.synaglobal.vip", "phases": { "core_api": { "exit_code": 0, "checks": 25, "duration_ms": 24836.29929999006, "stdout_tail": "" }, "extended_api": { "exit_code": 0, "checks": 30, "duration_ms": 31577.458899992052, "stdout_tail": "" }, "extra_api": { "checks": 3 } }, "features": [ { "id": "infra_health", "name": "健康检查 /health", "layer": "infra", "description": "Shell 守护与负载均衡探活", "status": "pass", "passed": 3, "failed": 0, "skipped": 0, "checks": [ { "name": "GET /health", "status": "pass", "feature_id": "infra_health", "layer": "api", "message": "", "duration_ms": 0 }, { "name": "GET /health", "status": "pass", "feature_id": "infra_health", "layer": "api", "message": "", "duration_ms": 0 }, { "name": "GET /health/detail", "status": "pass", "feature_id": "infra_health", "layer": "api", "message": "", "duration_ms": 0 } ] }, { "id": "infra_app", "name": "前端静态 /app/", "layer": "infra", "description": "SPA 入口可访问", "status": "pass", "passed": 1, "failed": 0, "skipped": 0, "checks": [ { "name": "GET /app/ (SPA 入口)", "status": "pass", "feature_id": "infra_app", "layer": "infra", "message": "", "duration_ms": 1020.7767999963835 } ] }, { "id": "auth", "name": "认证与 JWT", "layer": "api", "description": "登录、me、刷新", "status": "pass", "passed": 4, "failed": 0, "skipped": 0, "checks": [ { "name": "POST /api/auth/login", "status": "pass", "feature_id": "auth", "layer": "api", "message": "", "duration_ms": 0 }, { "name": "GET /api/auth/me", "status": "pass", "feature_id": "auth", "layer": "api", "message": "", "duration_ms": 0 }, { "name": "POST /api/auth/login", "status": "pass", "feature_id": "auth", "layer": "api", "message": "", "duration_ms": 0 }, { "name": "POST /api/auth/webssh-token", "status": "pass", "feature_id": "auth", "layer": "api", "message": "", "duration_ms": 0 } ] }, { "id": "dashboard", "name": "仪表盘统计", "layer": "api", "description": "服务器统计与概览", "status": "pass", "passed": 2, "failed": 0, "skipped": 0, "checks": [ { "name": "GET /api/servers/stats", "status": "pass", "feature_id": "dashboard", "layer": "api", "message": "", "duration_ms": 0 }, { "name": "GET /api/alert-history/stats", "status": "pass", "feature_id": "dashboard", "layer": "api", "message": "", "duration_ms": 0 } ] }, { "id": "servers", "name": "服务器管理", "layer": "api", "description": "CRUD、分类、日志", "status": "pass", "passed": 13, "failed": 0, "skipped": 0, "checks": [ { "name": "GET /api/servers/ (pre-cleanup)", "status": "pass", "feature_id": "servers", "layer": "api", "message": "", "duration_ms": 0 }, { "name": "POST /api/servers/ (create)", "status": "pass", "feature_id": "servers", "layer": "api", "message": "", "duration_ms": 0 }, { "name": "GET /api/servers/ (list)", "status": "pass", "feature_id": "servers", "layer": "api", "message": "", "duration_ms": 0 }, { "name": "GET /api/servers/53", "status": "pass", "feature_id": "servers", "layer": "api", "message": "", "duration_ms": 0 }, { "name": "PUT /api/servers/53 (update)", "status": "pass", "feature_id": "servers", "layer": "api", "message": "", "duration_ms": 0 }, { "name": "DELETE /api/servers/53", "status": "pass", "feature_id": "servers", "layer": "api", "message": "", "duration_ms": 0 }, { "name": "POST /api/sync/browse (no server)", "status": "pass", "feature_id": "servers", "layer": "api", "message": "", "duration_ms": 0 }, { "name": "GET /api/servers/categories", "status": "pass", "feature_id": "servers", "layer": "api", "message": "", "duration_ms": 0 }, { "name": "GET /api/servers/logs", "status": "pass", "feature_id": "servers", "layer": "api", "message": "", "duration_ms": 0 }, { "name": "GET /api/servers/meta/api_base_url", "status": "pass", "feature_id": "servers", "layer": "api", "message": "", "duration_ms": 0 }, { "name": "GET /api/servers/", "status": "pass", "feature_id": "servers", "layer": "api", "message": "", "duration_ms": 0 }, { "name": "GET /api/servers/8/logs", "status": "pass", "feature_id": "servers", "layer": "api", "message": "", "duration_ms": 0 }, { "name": "POST /api/sync/browse (real server)", "status": "pass", "feature_id": "servers", "layer": "api", "message": "", "duration_ms": 0 } ] }, { "id": "files", "name": "文件管理", "layer": "api", "description": "browse、files-capability", "status": "pass", "passed": 3, "failed": 0, "skipped": 0, "checks": [ { "name": "POST /api/sync/validate-source-path", "status": "pass", "feature_id": "files", "layer": "api", "message": "", "duration_ms": 0 }, { "name": "GET /api/servers/8/files-capability", "status": "pass", "feature_id": "files", "layer": "api", "message": "", "duration_ms": 936.1161999986507 }, { "name": "POST /api/sync/browse /tmp", "status": "pass", "feature_id": "files", "layer": "api", "message": "", "duration_ms": 1107.4050999886822 } ] }, { "id": "terminal", "name": "Web 终端", "layer": "api", "description": "快捷命令、webssh-token", "status": "pass", "passed": 1, "failed": 0, "skipped": 0, "checks": [ { "name": "GET /api/terminal/quick-commands", "status": "pass", "feature_id": "terminal", "layer": "api", "message": "", "duration_ms": 0 } ] }, { "id": "push_sync", "name": "推送与同步", "layer": "api", "description": "validate-source、sync", "status": "skip", "passed": 0, "failed": 0, "skipped": 0, "checks": [] }, { "id": "scripts", "name": "脚本库", "layer": "api", "description": "脚本 CRUD、执行记录", "status": "pass", "passed": 6, "failed": 0, "skipped": 0, "checks": [ { "name": "POST /api/scripts/ (create)", "status": "pass", "feature_id": "scripts", "layer": "api", "message": "", "duration_ms": 0 }, { "name": "GET /api/scripts/ (list)", "status": "pass", "feature_id": "scripts", "layer": "api", "message": "", "duration_ms": 0 }, { "name": "DELETE /api/scripts/34", "status": "pass", "feature_id": "scripts", "layer": "api", "message": "", "duration_ms": 0 }, { "name": "GET /api/scripts/exec-config", "status": "pass", "feature_id": "scripts", "layer": "api", "message": "", "duration_ms": 0 }, { "name": "GET /api/scripts/executions", "status": "pass", "feature_id": "scripts", "layer": "api", "message": "", "duration_ms": 0 }, { "name": "GET /api/scripts/credentials", "status": "pass", "feature_id": "scripts", "layer": "api", "message": "", "duration_ms": 0 } ] }, { "id": "schedules", "name": "调度任务", "layer": "api", "description": "调度 CRUD", "status": "pass", "passed": 4, "failed": 0, "skipped": 0, "checks": [ { "name": "POST /api/schedules/ (create)", "status": "pass", "feature_id": "schedules", "layer": "api", "message": "", "duration_ms": 0 }, { "name": "GET /api/schedules/ (list)", "status": "pass", "feature_id": "schedules", "layer": "api", "message": "", "duration_ms": 0 }, { "name": "PUT /api/schedules/28 (disable)", "status": "pass", "feature_id": "schedules", "layer": "api", "message": "", "duration_ms": 0 }, { "name": "DELETE /api/schedules/28", "status": "pass", "feature_id": "schedules", "layer": "api", "message": "", "duration_ms": 0 } ] }, { "id": "credentials", "name": "凭据预设", "layer": "api", "description": "密码/SSH 密钥预设", "status": "pass", "passed": 4, "failed": 0, "skipped": 0, "checks": [ { "name": "POST /api/presets/ (create)", "status": "pass", "feature_id": "credentials", "layer": "api", "message": "", "duration_ms": 0 }, { "name": "GET /api/presets/ (list)", "status": "pass", "feature_id": "credentials", "layer": "api", "message": "", "duration_ms": 0 }, { "name": "DELETE /api/presets/38", "status": "pass", "feature_id": "credentials", "layer": "api", "message": "", "duration_ms": 0 }, { "name": "GET /api/ssh-key-presets/", "status": "pass", "feature_id": "credentials", "layer": "api", "message": "", "duration_ms": 0 } ] }, { "id": "retries", "name": "重试队列", "layer": "api", "description": "失败任务重试列表", "status": "pass", "passed": 1, "failed": 0, "skipped": 0, "checks": [ { "name": "GET /api/retries/ (list)", "status": "pass", "feature_id": "retries", "layer": "api", "message": "", "duration_ms": 0 } ] }, { "id": "audit", "name": "审计日志", "layer": "api", "description": "操作审计分页", "status": "pass", "passed": 1, "failed": 0, "skipped": 0, "checks": [ { "name": "GET /api/audit/ (list)", "status": "pass", "feature_id": "audit", "layer": "api", "message": "", "duration_ms": 0 } ] }, { "id": "alerts", "name": "告警历史", "layer": "api", "description": "告警列表与统计", "status": "pass", "passed": 1, "failed": 0, "skipped": 0, "checks": [ { "name": "GET /api/alert-history/", "status": "pass", "feature_id": "alerts", "layer": "api", "message": "", "duration_ms": 0 } ] }, { "id": "assets", "name": "资产管理", "layer": "api", "description": "平台/节点/命令日志", "status": "pass", "passed": 8, "failed": 0, "skipped": 0, "checks": [ { "name": "GET /api/assets/platforms", "status": "pass", "feature_id": "assets", "layer": "api", "message": "", "duration_ms": 0 }, { "name": "GET /api/assets/nodes", "status": "pass", "feature_id": "assets", "layer": "api", "message": "", "duration_ms": 0 }, { "name": "GET /api/assets/nodes/tree", "status": "pass", "feature_id": "assets", "layer": "api", "message": "", "duration_ms": 0 }, { "name": "GET /api/assets/ssh-sessions", "status": "pass", "feature_id": "assets", "layer": "api", "message": "", "duration_ms": 0 }, { "name": "GET /api/assets/command-logs", "status": "pass", "feature_id": "assets", "layer": "api", "message": "", "duration_ms": 0 }, { "name": "POST /api/assets/platforms (e2e)", "status": "pass", "feature_id": "assets", "layer": "api", "message": "", "duration_ms": 0 }, { "name": "PUT /api/assets/platforms/7", "status": "pass", "feature_id": "assets", "layer": "api", "message": "", "duration_ms": 0 }, { "name": "DELETE /api/assets/platforms/7", "status": "pass", "feature_id": "assets", "layer": "api", "message": "", "duration_ms": 0 } ] }, { "id": "search", "name": "全局搜索", "layer": "api", "description": "跨资源搜索", "status": "pass", "passed": 1, "failed": 0, "skipped": 0, "checks": [ { "name": "GET /api/search/", "status": "pass", "feature_id": "search", "layer": "api", "message": "", "duration_ms": 0 } ] }, { "id": "settings", "name": "系统设置", "layer": "api", "description": "动态配置、IP 白名单", "status": "pass", "passed": 5, "failed": 0, "skipped": 0, "checks": [ { "name": "GET /api/settings/ (list)", "status": "pass", "feature_id": "settings", "layer": "api", "message": "", "duration_ms": 0 }, { "name": "PUT /api/settings/system_name", "status": "pass", "feature_id": "settings", "layer": "api", "message": "", "duration_ms": 0 }, { "name": "GET /api/settings/", "status": "pass", "feature_id": "settings", "layer": "api", "message": "", "duration_ms": 0 }, { "name": "GET /api/settings/ip-allowlist", "status": "pass", "feature_id": "settings", "layer": "api", "message": "", "duration_ms": 0 }, { "name": "GET /api/settings/bing-wallpapers", "status": "pass", "feature_id": "settings", "layer": "api", "message": "", "duration_ms": 0 } ] }, { "id": "health_detail", "name": "健康详情", "layer": "api", "description": "/health/detail", "status": "skip", "passed": 0, "failed": 0, "skipped": 0, "checks": [] }, { "id": "ui_dashboard", "name": "页面·仪表盘", "layer": "ui", "description": "路由 /", "status": "skip", "passed": 0, "failed": 0, "skipped": 0, "checks": [] }, { "id": "ui_servers", "name": "页面·服务器", "layer": "ui", "description": "路由 /servers", "status": "skip", "passed": 0, "failed": 0, "skipped": 0, "checks": [] }, { "id": "ui_terminal", "name": "页面·终端", "layer": "ui", "description": "路由 /terminal", "status": "skip", "passed": 0, "failed": 0, "skipped": 0, "checks": [] }, { "id": "ui_files", "name": "页面·文件", "layer": "ui", "description": "路由 /files", "status": "skip", "passed": 0, "failed": 0, "skipped": 0, "checks": [] }, { "id": "ui_push", "name": "页面·推送", "layer": "ui", "description": "路由 /push", "status": "skip", "passed": 0, "failed": 0, "skipped": 0, "checks": [] }, { "id": "ui_scripts", "name": "页面·脚本", "layer": "ui", "description": "路由 /scripts", "status": "skip", "passed": 0, "failed": 0, "skipped": 0, "checks": [] }, { "id": "ui_credentials", "name": "页面·凭据", "layer": "ui", "description": "路由 /credentials", "status": "skip", "passed": 0, "failed": 0, "skipped": 0, "checks": [] }, { "id": "ui_schedules", "name": "页面·调度", "layer": "ui", "description": "路由 /schedules", "status": "skip", "passed": 0, "failed": 0, "skipped": 0, "checks": [] }, { "id": "ui_retries", "name": "页面·重试", "layer": "ui", "description": "路由 /retries", "status": "skip", "passed": 0, "failed": 0, "skipped": 0, "checks": [] }, { "id": "ui_commands", "name": "页面·命令日志", "layer": "ui", "description": "路由 /commands", "status": "skip", "passed": 0, "failed": 0, "skipped": 0, "checks": [] }, { "id": "ui_alerts", "name": "页面·告警", "layer": "ui", "description": "路由 /alerts", "status": "skip", "passed": 0, "failed": 0, "skipped": 0, "checks": [] }, { "id": "ui_audit", "name": "页面·审计", "layer": "ui", "description": "路由 /audit", "status": "skip", "passed": 0, "failed": 0, "skipped": 0, "checks": [] }, { "id": "ui_settings", "name": "页面·设置", "layer": "ui", "description": "路由 /settings", "status": "skip", "passed": 0, "failed": 0, "skipped": 0, "checks": [] }, { "id": "ui_theme", "name": "页面·主题与登出", "layer": "ui", "description": "主题切换、退出", "status": "skip", "passed": 0, "failed": 0, "skipped": 0, "checks": [] }, { "id": "unit_core", "name": "单元测试(核心)", "layer": "unit", "description": "路径校验、权限、提权逻辑", "status": "skip", "passed": 0, "failed": 0, "skipped": 0, "checks": [] } ], "summary": { "passed_checks": 58, "failed_checks": 0, "skipped_checks": 0, "features_pass": 16, "features_fail": 0, "features_total": 16, "ok": true }, "checks": [ { "name": "GET /health", "status": "pass", "feature_id": "infra_health", "layer": "api", "message": "", "duration_ms": 0 }, { "name": "POST /api/auth/login", "status": "pass", "feature_id": "auth", "layer": "api", "message": "", "duration_ms": 0 }, { "name": "GET /api/auth/me", "status": "pass", "feature_id": "auth", "layer": "api", "message": "", "duration_ms": 0 }, { "name": "GET /api/servers/ (pre-cleanup)", "status": "pass", "feature_id": "servers", "layer": "api", "message": "", "duration_ms": 0 }, { "name": "POST /api/servers/ (create)", "status": "pass", "feature_id": "servers", "layer": "api", "message": "", "duration_ms": 0 }, { "name": "GET /api/servers/ (list)", "status": "pass", "feature_id": "servers", "layer": "api", "message": "", "duration_ms": 0 }, { "name": "GET /api/servers/stats", "status": "pass", "feature_id": "dashboard", "layer": "api", "message": "", "duration_ms": 0 }, { "name": "GET /api/servers/53", "status": "pass", "feature_id": "servers", "layer": "api", "message": "", "duration_ms": 0 }, { "name": "PUT /api/servers/53 (update)", "status": "pass", "feature_id": "servers", "layer": "api", "message": "", "duration_ms": 0 }, { "name": "DELETE /api/servers/53", "status": "pass", "feature_id": "servers", "layer": "api", "message": "", "duration_ms": 0 }, { "name": "POST /api/scripts/ (create)", "status": "pass", "feature_id": "scripts", "layer": "api", "message": "", "duration_ms": 0 }, { "name": "GET /api/scripts/ (list)", "status": "pass", "feature_id": "scripts", "layer": "api", "message": "", "duration_ms": 0 }, { "name": "DELETE /api/scripts/34", "status": "pass", "feature_id": "scripts", "layer": "api", "message": "", "duration_ms": 0 }, { "name": "POST /api/schedules/ (create)", "status": "pass", "feature_id": "schedules", "layer": "api", "message": "", "duration_ms": 0 }, { "name": "GET /api/schedules/ (list)", "status": "pass", "feature_id": "schedules", "layer": "api", "message": "", "duration_ms": 0 }, { "name": "PUT /api/schedules/28 (disable)", "status": "pass", "feature_id": "schedules", "layer": "api", "message": "", "duration_ms": 0 }, { "name": "DELETE /api/schedules/28", "status": "pass", "feature_id": "schedules", "layer": "api", "message": "", "duration_ms": 0 }, { "name": "POST /api/presets/ (create)", "status": "pass", "feature_id": "credentials", "layer": "api", "message": "", "duration_ms": 0 }, { "name": "GET /api/presets/ (list)", "status": "pass", "feature_id": "credentials", "layer": "api", "message": "", "duration_ms": 0 }, { "name": "DELETE /api/presets/38", "status": "pass", "feature_id": "credentials", "layer": "api", "message": "", "duration_ms": 0 }, { "name": "GET /api/settings/ (list)", "status": "pass", "feature_id": "settings", "layer": "api", "message": "", "duration_ms": 0 }, { "name": "PUT /api/settings/system_name", "status": "pass", "feature_id": "settings", "layer": "api", "message": "", "duration_ms": 0 }, { "name": "GET /api/audit/ (list)", "status": "pass", "feature_id": "audit", "layer": "api", "message": "", "duration_ms": 0 }, { "name": "GET /api/retries/ (list)", "status": "pass", "feature_id": "retries", "layer": "api", "message": "", "duration_ms": 0 }, { "name": "POST /api/sync/browse (no server)", "status": "pass", "feature_id": "servers", "layer": "api", "message": "", "duration_ms": 0 }, { "name": "GET /health", "status": "pass", "feature_id": "infra_health", "layer": "api", "message": "", "duration_ms": 0 }, { "name": "POST /api/auth/login", "status": "pass", "feature_id": "auth", "layer": "api", "message": "", "duration_ms": 0 }, { "name": "GET /api/search/", "status": "pass", "feature_id": "search", "layer": "api", "message": "", "duration_ms": 0 }, { "name": "GET /api/alert-history/", "status": "pass", "feature_id": "alerts", "layer": "api", "message": "", "duration_ms": 0 }, { "name": "GET /api/alert-history/stats", "status": "pass", "feature_id": "dashboard", "layer": "api", "message": "", "duration_ms": 0 }, { "name": "GET /api/assets/platforms", "status": "pass", "feature_id": "assets", "layer": "api", "message": "", "duration_ms": 0 }, { "name": "GET /api/assets/nodes", "status": "pass", "feature_id": "assets", "layer": "api", "message": "", "duration_ms": 0 }, { "name": "GET /api/assets/nodes/tree", "status": "pass", "feature_id": "assets", "layer": "api", "message": "", "duration_ms": 0 }, { "name": "GET /api/assets/ssh-sessions", "status": "pass", "feature_id": "assets", "layer": "api", "message": "", "duration_ms": 0 }, { "name": "GET /api/assets/command-logs", "status": "pass", "feature_id": "assets", "layer": "api", "message": "", "duration_ms": 0 }, { "name": "POST /api/assets/platforms (e2e)", "status": "pass", "feature_id": "assets", "layer": "api", "message": "", "duration_ms": 0 }, { "name": "PUT /api/assets/platforms/7", "status": "pass", "feature_id": "assets", "layer": "api", "message": "", "duration_ms": 0 }, { "name": "DELETE /api/assets/platforms/7", "status": "pass", "feature_id": "assets", "layer": "api", "message": "", "duration_ms": 0 }, { "name": "GET /api/servers/categories", "status": "pass", "feature_id": "servers", "layer": "api", "message": "", "duration_ms": 0 }, { "name": "GET /api/servers/logs", "status": "pass", "feature_id": "servers", "layer": "api", "message": "", "duration_ms": 0 }, { "name": "GET /api/servers/meta/api_base_url", "status": "pass", "feature_id": "servers", "layer": "api", "message": "", "duration_ms": 0 }, { "name": "GET /api/servers/", "status": "pass", "feature_id": "servers", "layer": "api", "message": "", "duration_ms": 0 }, { "name": "GET /api/servers/8/logs", "status": "pass", "feature_id": "servers", "layer": "api", "message": "", "duration_ms": 0 }, { "name": "GET /api/scripts/exec-config", "status": "pass", "feature_id": "scripts", "layer": "api", "message": "", "duration_ms": 0 }, { "name": "GET /api/scripts/executions", "status": "pass", "feature_id": "scripts", "layer": "api", "message": "", "duration_ms": 0 }, { "name": "GET /api/scripts/credentials", "status": "pass", "feature_id": "scripts", "layer": "api", "message": "", "duration_ms": 0 }, { "name": "GET /api/ssh-key-presets/", "status": "pass", "feature_id": "credentials", "layer": "api", "message": "", "duration_ms": 0 }, { "name": "POST /api/sync/validate-source-path", "status": "pass", "feature_id": "files", "layer": "api", "message": "", "duration_ms": 0 }, { "name": "POST /api/sync/browse (real server)", "status": "pass", "feature_id": "servers", "layer": "api", "message": "", "duration_ms": 0 }, { "name": "POST /api/auth/webssh-token", "status": "pass", "feature_id": "auth", "layer": "api", "message": "", "duration_ms": 0 }, { "name": "GET /api/settings/", "status": "pass", "feature_id": "settings", "layer": "api", "message": "", "duration_ms": 0 }, { "name": "GET /api/settings/ip-allowlist", "status": "pass", "feature_id": "settings", "layer": "api", "message": "", "duration_ms": 0 }, { "name": "GET /api/settings/bing-wallpapers", "status": "pass", "feature_id": "settings", "layer": "api", "message": "", "duration_ms": 0 }, { "name": "GET /health/detail", "status": "pass", "feature_id": "infra_health", "layer": "api", "message": "", "duration_ms": 0 }, { "name": "GET /api/terminal/quick-commands", "status": "pass", "feature_id": "terminal", "layer": "api", "message": "", "duration_ms": 0 }, { "name": "GET /app/ (SPA 入口)", "status": "pass", "feature_id": "infra_app", "layer": "infra", "message": "", "duration_ms": 1020.7767999963835 }, { "name": "GET /api/servers/8/files-capability", "status": "pass", "feature_id": "files", "layer": "api", "message": "", "duration_ms": 936.1161999986507 }, { "name": "POST /api/sync/browse /tmp", "status": "pass", "feature_id": "files", "layer": "api", "message": "", "duration_ms": 1107.4050999886822 } ] }