Files
pikasTech-HWLAB/reports/dev-gate/dev-edge-health.json
T
2026-05-22 11:39:20 +08:00

659 lines
22 KiB
JSON

{
"$schema": "https://hwlab.pikastech.local/schemas/dev-gate-report.schema.json",
"$id": "https://hwlab.pikastech.local/reports/dev-gate/dev-edge-health.json",
"reportVersion": "v1",
"issue": "pikasTech/HWLAB#36",
"taskId": "dev-edge-health",
"commitId": "73b379f4441d",
"acceptanceLevel": "dev_edge_health",
"devOnly": true,
"prodDisabled": true,
"status": "pass",
"generatedAt": "2026-05-22T03:38:24.622Z",
"namespace": "hwlab-dev",
"endpoint": "http://74.48.78.17:16667",
"sourceContract": {
"status": "pass",
"documents": [
"docs/dev-acceptance-matrix.md",
"docs/m0-contract-audit.md",
"docs/dev-edge-health.md",
"deploy/frp/README.md",
"deploy/master-edge/README.md"
],
"summary": "DEV edge health is pinned to the frozen HWLAB endpoint, frp reverse link, master edge proxy, and hwlab-dev services."
},
"validationCommands": [
"node --check scripts/validate-dev-gate-report.mjs",
"node scripts/validate-dev-gate-report.mjs",
"node --check scripts/dev-edge-health-smoke.mjs",
"node --check scripts/src/dev-edge-health-smoke-lib.mjs",
"node scripts/dev-edge-health-smoke.mjs --live --write-report"
],
"localSmoke": {
"status": "pass",
"commands": [
"node scripts/m1-contract-smoke.mjs"
],
"evidence": [
"npm run check includes internal/cloud/server.test.mjs and validates /health plus /health/live."
],
"summary": "Local cloud-api health checks pass and include service, commit, and image evidence fields."
},
"dryRun": {
"status": "not_run",
"commands": [
"node tools/hwlab-cli/bin/hwlab-cli.mjs test e2e --env dev --mvp --dry-run"
],
"evidence": [
"This edge-health task used the dedicated read-only smoke instead of the MVP e2e dry-run."
],
"summary": "MVP dry-run remains the generic gate command; edge health uses a narrower route smoke."
},
"devPreconditions": {
"status": "pass",
"requirements": [
"http://74.48.78.17:16667/health returns HWLAB DEV JSON with service, commit, and image evidence",
"frps control on 74.48.78.17:7000 accepts the D601 frp client",
"hwlab-dev hwlab-edge-proxy, hwlab-tunnel-client, hwlab-router, and hwlab-cloud-api are observable",
"No PROD endpoint, secret read, restart, or UniDesk runtime substitute is used"
],
"summary": "DEV edge health preconditions are satisfied."
},
"blockers": [],
"edgeHealth": {
"generatedAt": "2026-05-22T03:38:24.622Z",
"mode": "live-read-only",
"endpoint": "http://74.48.78.17:16667",
"safety": {
"environment": "dev",
"prodTouched": false,
"secretsRead": false,
"restarts": false,
"unideskRuntimeSubstitute": false
},
"contracts": {
"devEndpoint": "http://74.48.78.17:16667",
"frp": {
"frpcTargetsEdgeProxy": true,
"frpcTargetsCloudWeb": true,
"frpsTcpRemotePort16667": true,
"frpsTcpRemotePort16666": true,
"frpsUsesVhostEdgePort": false,
"configRisk": "none"
},
"masterEdge": {
"endpoint": "http://74.48.78.17:16667",
"reverseLinkMode": "frp",
"reverseLinkClient": "hwlab-tunnel-client",
"publicPort": 16667
},
"deploy": {
"environment": "dev",
"namespace": "hwlab-dev",
"serviceCount": 13,
"edgeProxy": {
"serviceId": "hwlab-edge-proxy",
"image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:73b379f",
"namespace": "hwlab-dev",
"healthPath": "/health/live",
"profile": "dev",
"replicas": 1,
"env": {
"HWLAB_EDGE_LISTEN": "0.0.0.0:6667",
"HWLAB_EDGE_UPSTREAM": "http://hwlab-cloud-api.hwlab-dev.svc.cluster.local:6667"
}
},
"tunnelClient": {
"serviceId": "hwlab-tunnel-client",
"image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:73b379f",
"namespace": "hwlab-dev",
"healthPath": "/health/live",
"profile": "dev",
"replicas": 1,
"env": {
"HWLAB_TUNNEL_MODE": "frp-client",
"HWLAB_FRP_SERVER_ADDR": "74.48.78.17",
"HWLAB_FRP_PUBLIC_PORT": "16667",
"HWLAB_FRP_WEB_PUBLIC_PORT": "16666"
}
},
"cloudApiDb": {
"status": "degraded",
"ready": false,
"configReady": true,
"connected": false,
"connectionChecked": false,
"requiredEnv": [
{
"name": "HWLAB_CLOUD_DB_URL",
"present": true,
"redacted": true
},
{
"name": "HWLAB_CLOUD_DB_SSL_MODE",
"present": true,
"redacted": false
}
],
"missingEnv": [],
"secretRefs": [
{
"env": "HWLAB_CLOUD_DB_URL",
"secretName": "hwlab-cloud-api-dev-db",
"secretKey": "database-url",
"present": true,
"redacted": true
}
],
"liveDbEvidence": false,
"fixtureEvidence": false,
"secretMaterialRead": false,
"valuesRedacted": true,
"note": "Manifest-only DB env placeholder; this is not live DB evidence."
}
}
},
"publicTcp": [
{
"host": "74.48.78.17",
"port": 16667,
"status": "connected",
"durationMs": 205
},
{
"host": "74.48.78.17",
"port": 7000,
"status": "connected",
"durationMs": 1231
},
{
"host": "74.48.78.17",
"port": 7402,
"status": "connected",
"durationMs": 199
}
],
"publicHttp": [
{
"url": "http://74.48.78.17:16667/health",
"ok": true,
"status": 200,
"statusText": "OK",
"headers": {
"connection": "keep-alive",
"content-length": "661",
"content-type": "application/json; charset=utf-8",
"date": "Fri, 22 May 2026 03:38:23 GMT",
"keep-alive": "timeout=5"
},
"json": {
"serviceId": "hwlab-edge-proxy",
"environment": "dev",
"status": "ok",
"service": {
"id": "hwlab-edge-proxy",
"role": "public-dev-ingress",
"healthPath": "/health",
"livePath": "/health/live"
},
"commit": {
"id": "73b379f4441d47a99dfd978a80fd43727410af51",
"source": "runtime-env"
},
"image": {
"reference": "ghcr.io/pikastech/hwlab-edge-proxy:73b379f",
"tag": "73b379f",
"digest": "unknown"
},
"endpoint": "http://74.48.78.17:16667",
"observedAt": "2026-05-22T03:38:23.861Z",
"details": {
"upstream": "http://hwlab-cloud-api.hwlab-dev.svc.cluster.local:6667",
"mode": "dev-edge-proxy"
}
},
"bodyPreview": "{\n \"serviceId\": \"hwlab-edge-proxy\",\n \"environment\": \"dev\",\n \"status\": \"ok\",\n \"service\": {\n \"id\": \"hwlab-edge-proxy\",\n \"role\": \"public-dev-ingress\",\n \"healthPath\": \"/health\",\n \"livePath\": \"/health/live\"\n },\n \"commit\": {\n \"id\": \"73b379f4441d47a99dfd978a80fd43727410af51\",\n \"source\": \"runtime-env\"\n },\n \"image\": {\n \"reference\": \"ghcr.io/pikastech/hwlab-edge-proxy:73b379f\",\n \"tag\": \"73b379f\",\n \"digest\": \"unknown\"\n },\n \"endpoint\": \"http://74.48.78.17:16667\",\n \"obse",
"durationMs": 656
},
{
"url": "http://74.48.78.17:16667/health/live",
"ok": true,
"status": 200,
"statusText": "OK",
"headers": {
"cache-control": "no-store",
"connection": "keep-alive",
"content-type": "application/json; charset=utf-8",
"date": "Fri, 22 May 2026 03:38:23 GMT",
"keep-alive": "timeout=5",
"transfer-encoding": "chunked"
},
"json": {
"serviceId": "hwlab-cloud-api",
"environment": "dev",
"status": "degraded",
"service": {
"id": "hwlab-cloud-api",
"role": "cloud-api",
"healthPath": "/health",
"livePath": "/health/live"
},
"commit": {
"id": "73b379f",
"source": "runtime-env"
},
"image": {
"reference": "127.0.0.1:5000/hwlab/hwlab-cloud-api:73b379f",
"tag": "73b379f",
"digest": "unknown"
},
"endpoint": "http://74.48.78.17:16667",
"observedAt": "2026-05-22T03:38:23.864Z",
"db": {
"contractVersion": "v1",
"environment": "dev",
"connected": false,
"connectionChecked": false,
"configReady": true,
"ready": false,
"status": "degraded",
"mode": "configured_without_live_connection",
"fields": [
{
"name": "HWLAB_CLOUD_DB_URL",
"present": true,
"redacted": true,
"source": "k8s-secret-ref",
"required": true
},
{
"name": "HWLAB_CLOUD_DB_SSL_MODE",
"present": true,
"redacted": false,
"source": "runtime-env",
"required": true
}
],
"missingEnv": [],
"secretRefs": [
{
"env": "HWLAB_CLOUD_DB_URL",
"secretName": "hwlab-cloud-api-dev-db",
"secretKey": "database-url",
"present": true,
"redacted": true
}
],
"safety": {
"devOnly": true,
"prodAllowed": false,
"secretsRead": false,
"valuesRedacted": true,
"liveDbEvidence": false
},
"evidence": "env_presence_only_no_live_db"
},
"runtime": {
"adapter": "memory",
"durable": false,
"status": "degraded",
"reason": "live DB persistence is not connected; L1 runtime writes are process-local only",
"counts": {
"gatewaySessions": 0,
"boxResources": 0,
"boxCapabilities": 0,
"hardwareOperations": 0,
"auditEvents": 0,
"evidenceRecords": 0
}
}
},
"bodyPreview": "{\"serviceId\":\"hwlab-cloud-api\",\"environment\":\"dev\",\"status\":\"degraded\",\"service\":{\"id\":\"hwlab-cloud-api\",\"role\":\"cloud-api\",\"healthPath\":\"/health\",\"livePath\":\"/health/live\"},\"commit\":{\"id\":\"73b379f\",\"source\":\"runtime-env\"},\"image\":{\"reference\":\"127.0.0.1:5000/hwlab/hwlab-cloud-api:73b379f\",\"tag\":\"73b379f\",\"digest\":\"unknown\"},\"endpoint\":\"http://74.48.78.17:16667\",\"observedAt\":\"2026-05-22T03:38:23.864Z\",\"db\":{\"contractVersion\":\"v1\",\"environment\":\"dev\",\"connected\":false,\"connectionChecked\":false,\"c",
"durationMs": 651
}
],
"kubernetes": {
"observable": true,
"namespace": "hwlab-dev",
"context": {
"exitCode": 0,
"value": "default",
"stderr": ""
},
"services": [
{
"name": "hwlab-cloud-api",
"type": "ClusterIP",
"clusterIP": "10.43.88.144",
"ports": [
{
"name": "http",
"port": 6667,
"targetPort": "http"
}
],
"selector": {
"app.kubernetes.io/name": "hwlab-cloud-api",
"app.kubernetes.io/part-of": "hwlab",
"hwlab.pikastech.local/environment": "dev",
"hwlab.pikastech.local/profile": "dev"
}
},
{
"name": "hwlab-edge-proxy",
"type": "ClusterIP",
"clusterIP": "10.43.104.107",
"ports": [
{
"name": "http",
"port": 6667,
"targetPort": "http"
}
],
"selector": {
"app.kubernetes.io/name": "hwlab-edge-proxy",
"app.kubernetes.io/part-of": "hwlab",
"hwlab.pikastech.local/environment": "dev",
"hwlab.pikastech.local/profile": "dev"
}
},
{
"name": "hwlab-tunnel-client",
"type": "ClusterIP",
"clusterIP": "10.43.129.225",
"ports": [
{
"name": "http",
"port": 7402,
"targetPort": "http"
}
],
"selector": {
"app.kubernetes.io/name": "hwlab-tunnel-client",
"app.kubernetes.io/part-of": "hwlab",
"hwlab.pikastech.local/environment": "dev",
"hwlab.pikastech.local/profile": "dev"
}
},
{
"name": "hwlab-router",
"type": "ClusterIP",
"clusterIP": "10.43.6.240",
"ports": [
{
"name": "http",
"port": 7401,
"targetPort": "http"
}
],
"selector": {
"app.kubernetes.io/name": "hwlab-router",
"app.kubernetes.io/part-of": "hwlab",
"hwlab.pikastech.local/environment": "dev",
"hwlab.pikastech.local/profile": "dev"
}
}
],
"endpoints": [
{
"name": "hwlab-cloud-api",
"readyAddresses": [
"10.42.0.188"
],
"notReadyAddresses": [],
"ports": [
{
"name": "http",
"port": 6667
}
]
},
{
"name": "hwlab-edge-proxy",
"readyAddresses": [
"10.42.0.191"
],
"notReadyAddresses": [],
"ports": [
{
"name": "http",
"port": 6667
}
]
},
{
"name": "hwlab-tunnel-client",
"readyAddresses": [
"10.42.0.194"
],
"notReadyAddresses": [],
"ports": [
{
"name": "http",
"port": 7402
}
]
},
{
"name": "hwlab-router",
"readyAddresses": [
"10.42.0.193"
],
"notReadyAddresses": [],
"ports": [
{
"name": "http",
"port": 7401
}
]
}
],
"pods": [
{
"name": "hwlab-agent-mgr-6b4976cb77-rjc2f",
"phase": "Running",
"serviceId": "hwlab-agent-mgr",
"containers": [
{
"name": "hwlab-agent-mgr",
"ready": true,
"restartCount": 0,
"image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:73b379f",
"imageID": "127.0.0.1:5000/hwlab/hwlab-agent-mgr@sha256:ae6ca76cd09a7d21e46e0076e12dea1843417a0d59d57b3115915c831e88ebef"
}
]
},
{
"name": "hwlab-agent-skills-76b5d4f4bb-8x55z",
"phase": "Running",
"serviceId": "hwlab-agent-skills",
"containers": [
{
"name": "hwlab-agent-skills",
"ready": true,
"restartCount": 0,
"image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:73b379f",
"imageID": "127.0.0.1:5000/hwlab/hwlab-agent-skills@sha256:5bdf9a4d17f8f4c7f3ecead99dcbd4de0ac346a2c28fef020b8853cf494df573"
}
]
},
{
"name": "hwlab-box-simu-5d574d4675-jb6vb",
"phase": "Running",
"serviceId": "hwlab-box-simu",
"containers": [
{
"name": "hwlab-box-simu",
"ready": true,
"restartCount": 0,
"image": "127.0.0.1:5000/hwlab/hwlab-box-simu:73b379f",
"imageID": "127.0.0.1:5000/hwlab/hwlab-box-simu@sha256:2a12c1c462b2c01a9fa15efa75a6e1f17ecc8432dfa88bca53f0d8d4b6355daf"
}
]
},
{
"name": "hwlab-box-simu-5d574d4675-qwp84",
"phase": "Running",
"serviceId": "hwlab-box-simu",
"containers": [
{
"name": "hwlab-box-simu",
"ready": true,
"restartCount": 0,
"image": "127.0.0.1:5000/hwlab/hwlab-box-simu:73b379f",
"imageID": "127.0.0.1:5000/hwlab/hwlab-box-simu@sha256:2a12c1c462b2c01a9fa15efa75a6e1f17ecc8432dfa88bca53f0d8d4b6355daf"
}
]
},
{
"name": "hwlab-cloud-api-769848bfd8-k2hdb",
"phase": "Running",
"serviceId": "hwlab-cloud-api",
"containers": [
{
"name": "hwlab-cloud-api",
"ready": true,
"restartCount": 0,
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:73b379f",
"imageID": "127.0.0.1:5000/hwlab/hwlab-cloud-api@sha256:561e50494bf13bf61f83d28b371bc39b860b21333ef9991711853a095bd535bf"
}
]
},
{
"name": "hwlab-cloud-web-bc56bc464-l7mdl",
"phase": "Running",
"serviceId": "hwlab-cloud-web",
"containers": [
{
"name": "hwlab-cloud-web",
"ready": true,
"restartCount": 0,
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:73b379f",
"imageID": "127.0.0.1:5000/hwlab/hwlab-cloud-web@sha256:c7939658af9f1109e5384619163dd0d11e1a1de14e7d15d4cbde7c4400b495c2"
}
]
},
{
"name": "hwlab-edge-proxy-544886546-656nq",
"phase": "Running",
"serviceId": "hwlab-edge-proxy",
"containers": [
{
"name": "hwlab-edge-proxy",
"ready": true,
"restartCount": 0,
"image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:73b379f",
"imageID": "127.0.0.1:5000/hwlab/hwlab-edge-proxy@sha256:480dea831051d45b6d63a489db9c0fa314f88bae35dbf72be4186bf1de356f38"
}
]
},
{
"name": "hwlab-gateway-simu-744ffffbbd-66q2c",
"phase": "Running",
"serviceId": "hwlab-gateway-simu",
"containers": [
{
"name": "hwlab-gateway-simu",
"ready": true,
"restartCount": 0,
"image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:73b379f",
"imageID": "127.0.0.1:5000/hwlab/hwlab-gateway-simu@sha256:f5ccff29da331e424a482f92394d071e1be90c0244e7137e07ac33d9a7cc4082"
}
]
},
{
"name": "hwlab-gateway-simu-744ffffbbd-rmlzq",
"phase": "Running",
"serviceId": "hwlab-gateway-simu",
"containers": [
{
"name": "hwlab-gateway-simu",
"ready": true,
"restartCount": 0,
"image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:73b379f",
"imageID": "127.0.0.1:5000/hwlab/hwlab-gateway-simu@sha256:f5ccff29da331e424a482f92394d071e1be90c0244e7137e07ac33d9a7cc4082"
}
]
},
{
"name": "hwlab-patch-panel-7d9487bb6c-82qqk",
"phase": "Running",
"serviceId": "hwlab-patch-panel",
"containers": [
{
"name": "hwlab-patch-panel",
"ready": true,
"restartCount": 0,
"image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:73b379f",
"imageID": "127.0.0.1:5000/hwlab/hwlab-patch-panel@sha256:5bc9a1c7ce65026cd7bf6d20a311226b35c796a4d52a914266244bf3c1a17286"
}
]
},
{
"name": "hwlab-router-77465567b6-9qs6t",
"phase": "Running",
"serviceId": "hwlab-router",
"containers": [
{
"name": "hwlab-router",
"ready": true,
"restartCount": 0,
"image": "127.0.0.1:5000/hwlab/hwlab-router:73b379f",
"imageID": "127.0.0.1:5000/hwlab/hwlab-router@sha256:356f37a7d78cc2f86230c2037f43215ad66979fbe4a949cb9241b5957692d9d8"
}
]
},
{
"name": "hwlab-tunnel-client-6449fcb5fb-27sk2",
"phase": "Running",
"serviceId": "hwlab-tunnel-client",
"containers": [
{
"name": "hwlab-tunnel-client",
"ready": true,
"restartCount": 0,
"image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:73b379f",
"imageID": "127.0.0.1:5000/hwlab/hwlab-tunnel-client@sha256:8ca553408a633d7f287ca9440f822fb1458dd9a028eb4db178b466b0b5505c49"
}
]
}
],
"notes": []
},
"clusterDns": [
{
"serviceId": "hwlab-cloud-api",
"host": "hwlab-cloud-api.hwlab-dev.svc.cluster.local",
"port": 6667,
"resolved": false,
"output": ""
},
{
"serviceId": "hwlab-router",
"host": "hwlab-router.hwlab-dev.svc.cluster.local",
"port": 7401,
"resolved": false,
"output": ""
},
{
"serviceId": "hwlab-tunnel-client",
"host": "hwlab-tunnel-client.hwlab-dev.svc.cluster.local",
"port": 7402,
"resolved": false,
"output": ""
},
{
"serviceId": "hwlab-edge-proxy",
"host": "hwlab-edge-proxy.hwlab-dev.svc.cluster.local",
"port": 6667,
"resolved": false,
"output": ""
}
],
"status": "pass",
"classification": "none",
"blocker": null
}
}