diff --git a/deploy/gitops/node/jd01/runtime-v03/deepseek-proxy.yaml b/deploy/gitops/node/jd01/runtime-v03/deepseek-proxy.yaml index 413915c8..0429e1a1 100644 --- a/deploy/gitops/node/jd01/runtime-v03/deepseek-proxy.yaml +++ b/deploy/gitops/node/jd01/runtime-v03/deepseek-proxy.yaml @@ -1,414 +1,327 @@ -{ - "apiVersion": "v1", - "kind": "List", - "items": [ - { - "apiVersion": "v1", - "kind": "ConfigMap", - "metadata": { - "name": "hwlab-deepseek-proxy-config", - "namespace": "hwlab-v03", - "labels": { - "app.kubernetes.io/name": "hwlab-deepseek-proxy", - "app.kubernetes.io/part-of": "hwlab", - "hwlab.pikastech.local/environment": "v03", - "hwlab.pikastech.local/gitops-target": "v03", - "hwlab.pikastech.local/service-id": "hwlab-deepseek-proxy", - "hwlab.pikastech.local/source-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f", - "hwlab.pikastech.local/monitoring": "enabled" - } - }, - "data": { - "render-config.sh": "#!/bin/sh\nif [ -z \"${DEEPSEEK_API_KEY:-}\" ] && [ -z \"${OPENCODE_API_KEY:-}\" ]; then\n echo \"at least one of DEEPSEEK_API_KEY or OPENCODE_API_KEY is required\" >&2\n exit 1\nfi\ncat > /config/config.yml < + #!/bin/sh + + if [ -z "${DEEPSEEK_API_KEY:-}" ] && [ -z "${OPENCODE_API_KEY:-}" ]; + then + echo "at least one of DEEPSEEK_API_KEY or OPENCODE_API_KEY is required" >&2 + exit 1 + fi + + cat > /config/config.yml < 0;\n if (!configured) return Promise.resolve({ configured: false, success: false, statusCode: 0, durationSeconds: 0 });\n\n let url;\n try {\n url = new URL(targetUrl);\n } catch {\n return Promise.resolve({ configured: true, success: false, statusCode: 0, durationSeconds: 0 });\n }\n\n const requestImpl = url.protocol === \"https:\" ? httpsRequest : url.protocol === \"http:\" ? httpRequest : null;\n if (!requestImpl) return Promise.resolve({ configured: true, success: false, statusCode: 0, durationSeconds: 0 });\n\n const started = Date.now();\n return new Promise((resolve) => {\n const finish = (result) => resolve({\n configured: true,\n success: false,\n statusCode: 0,\n durationSeconds: (Date.now() - started) / 1000,\n ...result\n });\n const request = requestImpl(url, { method: \"GET\", timeout: timeoutMs }, (response) => {\n const chunks = [];\n let bytes = 0;\n if (collectBody) {\n response.on(\"data\", (chunk) => {\n const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);\n bytes += buffer.length;\n if (bytes <= maxBodyBytes) chunks.push(buffer);\n });\n } else {\n response.resume();\n }\n response.on(\"end\", () => finish({\n success: Boolean(response.statusCode && response.statusCode >= 200 && response.statusCode < 300),\n statusCode: response.statusCode || 0,\n body: collectBody ? Buffer.concat(chunks).toString(\"utf8\") : undefined,\n bodyBytes: collectBody ? Math.min(bytes, maxBodyBytes) : 0,\n truncated: collectBody ? bytes > maxBodyBytes : false\n }));\n });\n request.on(\"timeout\", () => request.destroy());\n request.on(\"error\", () => finish({}));\n request.end();\n });\n}\n\nexport async function probeExtraMetrics({ targetUrl, timeoutMs = DEFAULT_TARGET_TIMEOUT_MS, maxBodyBytes = DEFAULT_EXTRA_METRICS_MAX_BYTES, probeImpl = requestTarget } = {}) {\n const configured = typeof targetUrl === \"string\" && targetUrl.trim().length > 0;\n if (!configured || typeof probeImpl !== \"function\") {\n return { configured: false, success: false, statusCode: 0, durationSeconds: 0, text: \"\" };\n }\n try {\n const result = await probeImpl({ targetUrl, timeoutMs, collectBody: true, maxBodyBytes });\n return {\n configured: true,\n success: Boolean(result.success),\n statusCode: result.statusCode || 0,\n durationSeconds: result.durationSeconds || 0,\n text: result.success ? sanitizeExtraMetricsText(result.body || \"\") : \"\"\n };\n } catch {\n return { configured: true, success: false, statusCode: 0, durationSeconds: 0, text: \"\" };\n }\n}\n\nexport function sanitizeExtraMetricsText(text) {\n const lines = String(text ?? \"\").split(/\\r?\\n/gu);\n return lines.filter((line) => {\n if (!line) return true;\n if (/^#\\s+(?:HELP|TYPE)\\s+hwlab_[A-Za-z_:][A-Za-z0-9_:]*\\b/u.test(line)) return true;\n return /^hwlab_[A-Za-z_:][A-Za-z0-9_:]*(?:\\{[^\\n{}]*\\})?\\s+[-+0-9.eE]+$/u.test(line);\n }).join(\"\\n\");\n}\n\nexport async function probeTarget({ targetUrl, timeoutMs = DEFAULT_TARGET_TIMEOUT_MS, probeImpl = requestTarget } = {}) {\n const configured = typeof targetUrl === \"string\" && targetUrl.trim().length > 0;\n if (!configured || typeof probeImpl !== \"function\") {\n return { configured: false, success: false, statusCode: 0, durationSeconds: 0 };\n }\n try {\n return await probeImpl({ targetUrl, timeoutMs });\n } catch {\n const started = Date.now();\n return { configured: true, success: false, statusCode: 0, durationSeconds: (Date.now() - started) / 1000 };\n }\n}\n\nexport function buildMetricsText({ env = process.env, probe = null, extraMetrics = null, now = Date.now() } = {}) {\n const labels = metricLabels(env);\n const uptimeSeconds = Math.max(0, (now - startedAtMs) / 1000);\n const healthProbe = probe ?? { configured: false, success: false, statusCode: 0, durationSeconds: 0 };\n const extraProbe = extraMetrics ?? { configured: false, success: false, statusCode: 0, durationSeconds: 0, text: \"\" };\n const lines = [\n \"# HELP hwlab_service_up HWLAB metrics sidecar availability.\",\n \"# TYPE hwlab_service_up gauge\",\n `hwlab_service_up{${labels}} 1`,\n \"# HELP hwlab_service_info Static HWLAB service metrics identity without high-cardinality request identifiers.\",\n \"# TYPE hwlab_service_info gauge\",\n `hwlab_service_info{${labels}} 1`,\n \"# HELP hwlab_service_process_uptime_seconds Metrics sidecar process uptime in seconds.\",\n \"# TYPE hwlab_service_process_uptime_seconds gauge\",\n `hwlab_service_process_uptime_seconds{${labels}} ${uptimeSeconds.toFixed(3)}`,\n \"# HELP hwlab_service_health_probe_configured Whether the sidecar has a cluster-local health probe target.\",\n \"# TYPE hwlab_service_health_probe_configured gauge\",\n `hwlab_service_health_probe_configured{${labels}} ${healthProbe.configured ? 1 : 0}`,\n \"# HELP hwlab_service_health_probe_success Whether the most recent cluster-local health probe succeeded.\",\n \"# TYPE hwlab_service_health_probe_success gauge\",\n `hwlab_service_health_probe_success{${labels}} ${healthProbe.success ? 1 : 0}`,\n \"# HELP hwlab_service_health_probe_status_code Most recent cluster-local health probe HTTP status code, or 0 when unavailable.\",\n \"# TYPE hwlab_service_health_probe_status_code gauge\",\n `hwlab_service_health_probe_status_code{${labels}} ${Number.isInteger(healthProbe.statusCode) ? healthProbe.statusCode : 0}`,\n \"# HELP hwlab_service_health_probe_duration_seconds Most recent cluster-local health probe duration in seconds.\",\n \"# TYPE hwlab_service_health_probe_duration_seconds gauge\",\n `hwlab_service_health_probe_duration_seconds{${labels}} ${Number(healthProbe.durationSeconds || 0).toFixed(3)}`,\n \"# HELP hwlab_service_extra_metrics_configured Whether the sidecar has an additional cluster-local metrics target.\",\n \"# TYPE hwlab_service_extra_metrics_configured gauge\",\n `hwlab_service_extra_metrics_configured{${labels}} ${extraProbe.configured ? 1 : 0}`,\n \"# HELP hwlab_service_extra_metrics_success Whether the most recent additional metrics fetch succeeded.\",\n \"# TYPE hwlab_service_extra_metrics_success gauge\",\n `hwlab_service_extra_metrics_success{${labels}} ${extraProbe.success ? 1 : 0}`,\n \"# HELP hwlab_service_extra_metrics_status_code Most recent additional metrics HTTP status code, or 0 when unavailable.\",\n \"# TYPE hwlab_service_extra_metrics_status_code gauge\",\n `hwlab_service_extra_metrics_status_code{${labels}} ${Number.isInteger(extraProbe.statusCode) ? extraProbe.statusCode : 0}`,\n \"# HELP hwlab_service_extra_metrics_duration_seconds Most recent additional metrics fetch duration in seconds.\",\n \"# TYPE hwlab_service_extra_metrics_duration_seconds gauge\",\n `hwlab_service_extra_metrics_duration_seconds{${labels}} ${Number(extraProbe.durationSeconds || 0).toFixed(3)}`,\n \"\"\n ];\n if (extraProbe.text) {\n lines.push(extraProbe.text.trimEnd(), \"\");\n }\n return lines.join(\"\\n\");\n}\n\nfunction sendJson(response, statusCode, body) {\n const payload = JSON.stringify(body) + \"\\n\";\n response.writeHead(statusCode, {\n \"content-type\": \"application/json; charset=utf-8\",\n \"content-length\": Buffer.byteLength(payload)\n });\n response.end(payload);\n}\n\nexport function createMetricsSidecarServer({ env = process.env, probeImpl = requestTarget } = {}) {\n return createServer(async (request, response) => {\n const url = new URL(request.url || \"/\", \"http://hwlab-metrics.local\");\n if (request.method === \"GET\" && (url.pathname === \"/health\" || url.pathname === \"/health/live\")) {\n sendJson(response, 200, {\n serviceId: sanitizeLabelValue(env.HWLAB_METRICS_SERVICE_ID || env.HWLAB_SERVICE_ID),\n status: \"ok\",\n metricsPath: \"/metrics\"\n });\n return;\n }\n if (request.method === \"GET\" && url.pathname === \"/metrics\") {\n const timeoutMs = Number.parseInt(env.HWLAB_METRICS_TARGET_TIMEOUT_MS || \"\", 10) || DEFAULT_TARGET_TIMEOUT_MS;\n const probe = await probeTarget({ targetUrl: env.HWLAB_METRICS_TARGET_URL, timeoutMs, probeImpl });\n const extraTimeoutMs = Number.parseInt(env.HWLAB_METRICS_EXTRA_TIMEOUT_MS || \"\", 10) || DEFAULT_TARGET_TIMEOUT_MS;\n const extraMetrics = await probeExtraMetrics({ targetUrl: env.HWLAB_METRICS_EXTRA_URL, timeoutMs: extraTimeoutMs, probeImpl });\n const payload = buildMetricsText({ env, probe, extraMetrics });\n response.writeHead(200, {\n \"content-type\": \"text/plain; version=0.0.4; charset=utf-8\",\n \"content-length\": Buffer.byteLength(payload)\n });\n response.end(payload);\n return;\n }\n sendJson(response, 404, { error: \"not_found\", path: url.pathname });\n });\n}\n\nexport function startMetricsSidecar({ env = process.env } = {}) {\n const port = Number.parseInt(env.HWLAB_METRICS_PORT || env.PORT || \"\", 10) || DEFAULT_PORT;\n const server = createMetricsSidecarServer({ env });\n server.listen(port, \"0.0.0.0\", () => {\n process.stdout.write(JSON.stringify({ serviceId: env.HWLAB_METRICS_SERVICE_ID || \"hwlab-unknown\", status: \"metrics-listening\", port }) + \"\\n\");\n });\n return server;\n}\n\nexport function isMainModule({ moduleUrl = import.meta.url, argvPath = process.argv[1], realpath = realpathSync } = {}) {\n if (!argvPath) return false;\n if (moduleUrl === pathToFileURL(argvPath).href) return true;\n try {\n return moduleUrl === pathToFileURL(realpath(argvPath)).href;\n } catch {\n return false;\n }\n}\n\nif (isMainModule()) {\n startMetricsSidecar();\n}\n" - } - } - ] -} diff --git a/deploy/gitops/node/jd01/runtime-v03/opencode.yaml b/deploy/gitops/node/jd01/runtime-v03/opencode.yaml index 4933c840..43e6b0e8 100644 --- a/deploy/gitops/node/jd01/runtime-v03/opencode.yaml +++ b/deploy/gitops/node/jd01/runtime-v03/opencode.yaml @@ -1,537 +1,386 @@ -{ - "apiVersion": "v1", - "kind": "List", - "items": [ - { - "apiVersion": "v1", - "kind": "ServiceAccount", - "metadata": { - "name": "opencode-server", - "namespace": "hwlab-v03", - "labels": { - "app.kubernetes.io/name": "opencode-server", - "app.kubernetes.io/part-of": "hwlab", - "hwlab.pikastech.local/environment": "v03", - "hwlab.pikastech.local/profile": "v03", - "hwlab.pikastech.local/component": "opencode", - "hwlab.pikastech.local/gitops-target": "v03", - "hwlab.pikastech.local/service-id": "opencode-server", - "hwlab.pikastech.local/source-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f" - }, - "annotations": { - "hwlab.pikastech.local/rendered-by": "scripts/gitops-render.mjs", - "hwlab.pikastech.local/opencode-provider-profile": "dsflash-go", - "hwlab.pikastech.local/opencode-provider-id": "dsflash-go", - "hwlab.pikastech.local/opencode-model": "deepseek-v4-flash", - "hwlab.pikastech.local/opencode-provider-base-url": "http://127.0.0.1:4097/v1", - "hwlab.pikastech.local/opencode-provider-upstream-base-url": "https://opencode.ai/zen/go/v1", - "hwlab.pikastech.local/opencode-image": "127.0.0.1:5000/hwlab/opencode:1.17.7-git", - "hwlab.pikastech.local/opencode-config-sha256": "40a92e2d93f344d7c9dbcb98bd67760078f90a0af085f83b4b5385513bb26234", - "hwlab.pikastech.local/opencode-api-key-secret-ref": "hwlab-v03-code-agent-provider/opencode-api-key", - "hwlab.pikastech.local/agentrun-provider-secret-ref": "agentrun-v02/agentrun-v01-provider-dsflash-go", - "hwlab.pikastech.local/agentrun-provider-secret-keys": "auth.json,config.toml,model-catalog.json", - "hwlab.pikastech.local/values-printed": "false", - "hwlab.pikastech.local/opencode-provider-proxy-runtime-mode": "env-reuse-git-mirror-checkout", - "hwlab.pikastech.local/opencode-provider-proxy-boot-repo": "git@github.com:pikasTech/HWLAB.git", - "hwlab.pikastech.local/opencode-provider-proxy-boot-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f", - "hwlab.pikastech.local/opencode-provider-proxy-boot-sh": "deploy/runtime/boot/opencode-provider-proxy.sh", - "hwlab.pikastech.local/opencode-provider-proxy-environment-digest": "sha256:35be9f812c9aef6d989caf83def79bdfe5dca42f461d9f99fb34622b38ff9b2f" - } - } - }, - { - "apiVersion": "v1", - "kind": "PersistentVolumeClaim", - "metadata": { - "name": "opencode-server-data", - "namespace": "hwlab-v03", - "labels": { - "app.kubernetes.io/name": "opencode-server", - "app.kubernetes.io/part-of": "hwlab", - "hwlab.pikastech.local/environment": "v03", - "hwlab.pikastech.local/profile": "v03", - "hwlab.pikastech.local/component": "opencode", - "hwlab.pikastech.local/gitops-target": "v03", - "hwlab.pikastech.local/service-id": "opencode-server", - "hwlab.pikastech.local/source-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f" - }, - "annotations": { - "hwlab.pikastech.local/rendered-by": "scripts/gitops-render.mjs", - "hwlab.pikastech.local/opencode-provider-profile": "dsflash-go", - "hwlab.pikastech.local/opencode-provider-id": "dsflash-go", - "hwlab.pikastech.local/opencode-model": "deepseek-v4-flash", - "hwlab.pikastech.local/opencode-provider-base-url": "http://127.0.0.1:4097/v1", - "hwlab.pikastech.local/opencode-provider-upstream-base-url": "https://opencode.ai/zen/go/v1", - "hwlab.pikastech.local/opencode-image": "127.0.0.1:5000/hwlab/opencode:1.17.7-git", - "hwlab.pikastech.local/opencode-config-sha256": "40a92e2d93f344d7c9dbcb98bd67760078f90a0af085f83b4b5385513bb26234", - "hwlab.pikastech.local/opencode-api-key-secret-ref": "hwlab-v03-code-agent-provider/opencode-api-key", - "hwlab.pikastech.local/agentrun-provider-secret-ref": "agentrun-v02/agentrun-v01-provider-dsflash-go", - "hwlab.pikastech.local/agentrun-provider-secret-keys": "auth.json,config.toml,model-catalog.json", - "hwlab.pikastech.local/values-printed": "false", - "hwlab.pikastech.local/opencode-provider-proxy-runtime-mode": "env-reuse-git-mirror-checkout", - "hwlab.pikastech.local/opencode-provider-proxy-boot-repo": "git@github.com:pikasTech/HWLAB.git", - "hwlab.pikastech.local/opencode-provider-proxy-boot-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f", - "hwlab.pikastech.local/opencode-provider-proxy-boot-sh": "deploy/runtime/boot/opencode-provider-proxy.sh", - "hwlab.pikastech.local/opencode-provider-proxy-environment-digest": "sha256:35be9f812c9aef6d989caf83def79bdfe5dca42f461d9f99fb34622b38ff9b2f" - } - }, - "spec": { - "accessModes": [ - "ReadWriteOnce" - ], - "resources": { - "requests": { - "storage": "8Gi" - } - } - } - }, - { - "apiVersion": "v1", - "kind": "Service", - "metadata": { - "name": "opencode-server", - "namespace": "hwlab-v03", - "labels": { - "app.kubernetes.io/name": "opencode-server", - "app.kubernetes.io/part-of": "hwlab", - "hwlab.pikastech.local/environment": "v03", - "hwlab.pikastech.local/profile": "v03", - "hwlab.pikastech.local/component": "opencode", - "hwlab.pikastech.local/gitops-target": "v03", - "hwlab.pikastech.local/service-id": "opencode-server", - "hwlab.pikastech.local/source-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f" - }, - "annotations": { - "hwlab.pikastech.local/rendered-by": "scripts/gitops-render.mjs", - "hwlab.pikastech.local/opencode-provider-profile": "dsflash-go", - "hwlab.pikastech.local/opencode-provider-id": "dsflash-go", - "hwlab.pikastech.local/opencode-model": "deepseek-v4-flash", - "hwlab.pikastech.local/opencode-provider-base-url": "http://127.0.0.1:4097/v1", - "hwlab.pikastech.local/opencode-provider-upstream-base-url": "https://opencode.ai/zen/go/v1", - "hwlab.pikastech.local/opencode-image": "127.0.0.1:5000/hwlab/opencode:1.17.7-git", - "hwlab.pikastech.local/opencode-config-sha256": "40a92e2d93f344d7c9dbcb98bd67760078f90a0af085f83b4b5385513bb26234", - "hwlab.pikastech.local/opencode-api-key-secret-ref": "hwlab-v03-code-agent-provider/opencode-api-key", - "hwlab.pikastech.local/agentrun-provider-secret-ref": "agentrun-v02/agentrun-v01-provider-dsflash-go", - "hwlab.pikastech.local/agentrun-provider-secret-keys": "auth.json,config.toml,model-catalog.json", - "hwlab.pikastech.local/values-printed": "false", - "hwlab.pikastech.local/opencode-provider-proxy-runtime-mode": "env-reuse-git-mirror-checkout", - "hwlab.pikastech.local/opencode-provider-proxy-boot-repo": "git@github.com:pikasTech/HWLAB.git", - "hwlab.pikastech.local/opencode-provider-proxy-boot-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f", - "hwlab.pikastech.local/opencode-provider-proxy-boot-sh": "deploy/runtime/boot/opencode-provider-proxy.sh", - "hwlab.pikastech.local/opencode-provider-proxy-environment-digest": "sha256:35be9f812c9aef6d989caf83def79bdfe5dca42f461d9f99fb34622b38ff9b2f" - } - }, - "spec": { - "type": "ClusterIP", - "selector": { - "app.kubernetes.io/name": "opencode-server", - "app.kubernetes.io/part-of": "hwlab", - "hwlab.pikastech.local/environment": "v03", - "hwlab.pikastech.local/profile": "v03" - }, - "ports": [ - { - "name": "http", - "port": 4096, - "targetPort": "http" - } - ] - } - }, - { - "apiVersion": "apps/v1", - "kind": "Deployment", - "metadata": { - "name": "opencode-server", - "namespace": "hwlab-v03", - "labels": { - "app.kubernetes.io/name": "opencode-server", - "app.kubernetes.io/part-of": "hwlab", - "hwlab.pikastech.local/environment": "v03", - "hwlab.pikastech.local/profile": "v03", - "hwlab.pikastech.local/component": "opencode", - "hwlab.pikastech.local/gitops-target": "v03", - "hwlab.pikastech.local/service-id": "opencode-server", - "hwlab.pikastech.local/source-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f" - }, - "annotations": { - "hwlab.pikastech.local/rendered-by": "scripts/gitops-render.mjs", - "hwlab.pikastech.local/opencode-provider-profile": "dsflash-go", - "hwlab.pikastech.local/opencode-provider-id": "dsflash-go", - "hwlab.pikastech.local/opencode-model": "deepseek-v4-flash", - "hwlab.pikastech.local/opencode-provider-base-url": "http://127.0.0.1:4097/v1", - "hwlab.pikastech.local/opencode-provider-upstream-base-url": "https://opencode.ai/zen/go/v1", - "hwlab.pikastech.local/opencode-image": "127.0.0.1:5000/hwlab/opencode:1.17.7-git", - "hwlab.pikastech.local/opencode-config-sha256": "40a92e2d93f344d7c9dbcb98bd67760078f90a0af085f83b4b5385513bb26234", - "hwlab.pikastech.local/opencode-api-key-secret-ref": "hwlab-v03-code-agent-provider/opencode-api-key", - "hwlab.pikastech.local/agentrun-provider-secret-ref": "agentrun-v02/agentrun-v01-provider-dsflash-go", - "hwlab.pikastech.local/agentrun-provider-secret-keys": "auth.json,config.toml,model-catalog.json", - "hwlab.pikastech.local/values-printed": "false", - "hwlab.pikastech.local/opencode-provider-proxy-runtime-mode": "env-reuse-git-mirror-checkout", - "hwlab.pikastech.local/opencode-provider-proxy-boot-repo": "git@github.com:pikasTech/HWLAB.git", - "hwlab.pikastech.local/opencode-provider-proxy-boot-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f", - "hwlab.pikastech.local/opencode-provider-proxy-boot-sh": "deploy/runtime/boot/opencode-provider-proxy.sh", - "hwlab.pikastech.local/opencode-provider-proxy-environment-digest": "sha256:35be9f812c9aef6d989caf83def79bdfe5dca42f461d9f99fb34622b38ff9b2f" - } - }, - "spec": { - "replicas": 1, - "strategy": { - "type": "Recreate" - }, - "selector": { - "matchLabels": { - "app.kubernetes.io/name": "opencode-server", - "app.kubernetes.io/part-of": "hwlab", - "hwlab.pikastech.local/environment": "v03", - "hwlab.pikastech.local/profile": "v03" - } - }, - "template": { - "metadata": { - "labels": { - "app.kubernetes.io/name": "opencode-server", - "app.kubernetes.io/part-of": "hwlab", - "hwlab.pikastech.local/environment": "v03", - "hwlab.pikastech.local/profile": "v03", - "hwlab.pikastech.local/component": "opencode", - "hwlab.pikastech.local/gitops-target": "v03", - "hwlab.pikastech.local/service-id": "opencode-server", - "hwlab.pikastech.local/source-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f" - }, - "annotations": { - "hwlab.pikastech.local/rendered-by": "scripts/gitops-render.mjs", - "hwlab.pikastech.local/opencode-provider-profile": "dsflash-go", - "hwlab.pikastech.local/opencode-provider-id": "dsflash-go", - "hwlab.pikastech.local/opencode-model": "deepseek-v4-flash", - "hwlab.pikastech.local/opencode-provider-base-url": "http://127.0.0.1:4097/v1", - "hwlab.pikastech.local/opencode-provider-upstream-base-url": "https://opencode.ai/zen/go/v1", - "hwlab.pikastech.local/opencode-image": "127.0.0.1:5000/hwlab/opencode:1.17.7-git", - "hwlab.pikastech.local/opencode-config-sha256": "40a92e2d93f344d7c9dbcb98bd67760078f90a0af085f83b4b5385513bb26234", - "hwlab.pikastech.local/opencode-api-key-secret-ref": "hwlab-v03-code-agent-provider/opencode-api-key", - "hwlab.pikastech.local/agentrun-provider-secret-ref": "agentrun-v02/agentrun-v01-provider-dsflash-go", - "hwlab.pikastech.local/agentrun-provider-secret-keys": "auth.json,config.toml,model-catalog.json", - "hwlab.pikastech.local/values-printed": "false", - "hwlab.pikastech.local/opencode-provider-proxy-runtime-mode": "env-reuse-git-mirror-checkout", - "hwlab.pikastech.local/opencode-provider-proxy-boot-repo": "git@github.com:pikasTech/HWLAB.git", - "hwlab.pikastech.local/opencode-provider-proxy-boot-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f", - "hwlab.pikastech.local/opencode-provider-proxy-boot-sh": "deploy/runtime/boot/opencode-provider-proxy.sh", - "hwlab.pikastech.local/opencode-provider-proxy-environment-digest": "sha256:35be9f812c9aef6d989caf83def79bdfe5dca42f461d9f99fb34622b38ff9b2f" - } - }, - "spec": { - "serviceAccountName": "opencode-server", - "securityContext": { - "fsGroup": 1000, - "fsGroupChangePolicy": "OnRootMismatch" - }, - "initContainers": [ - { - "name": "opencode-workspace-git-init", - "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web-env@sha256:35be9f812c9aef6d989caf83def79bdfe5dca42f461d9f99fb34622b38ff9b2f", - "imagePullPolicy": "IfNotPresent", - "command": [ - "/bin/sh", - "-ec" - ], - "args": [ - "set -eu\nmkdir -p /workspace\nif [ ! -d /workspace/.git ]; then\n git -C /workspace init\nfi\ngit -C /workspace config user.name 'HWLAB OpenCode' || true\ngit -C /workspace config user.email 'opencode@hwlab.local' || true\nchgrp -R 1000 /workspace/.git 2>/dev/null || true\nchmod -R g+rwX /workspace/.git 2>/dev/null || true" - ], - "resources": { - "requests": { - "cpu": "25m", - "memory": "64Mi" - }, - "limits": { - "cpu": "250m", - "memory": "256Mi" - } - }, - "volumeMounts": [ - { - "name": "workspace", - "mountPath": "/workspace" - } - ] - } - ], - "containers": [ - { - "name": "opencode-server", - "image": "127.0.0.1:5000/hwlab/opencode:1.17.7-git", - "imagePullPolicy": "IfNotPresent", - "command": [ - "/bin/sh", - "-ec" - ], - "args": [ - "exec opencode serve --hostname 0.0.0.0 --port 4096" - ], - "workingDir": "/workspace", - "env": [ - { - "name": "HOME", - "value": "/workspace" - }, - { - "name": "XDG_CONFIG_HOME", - "value": "/workspace/.config" - }, - { - "name": "XDG_DATA_HOME", - "value": "/workspace/.local/share" - }, - { - "name": "HTTP_PROXY", - "value": "http://sub2api-egress-proxy.platform-infra.svc.cluster.local:10808" - }, - { - "name": "HTTPS_PROXY", - "value": "http://sub2api-egress-proxy.platform-infra.svc.cluster.local:10808" - }, - { - "name": "http_proxy", - "value": "http://sub2api-egress-proxy.platform-infra.svc.cluster.local:10808" - }, - { - "name": "https_proxy", - "value": "http://sub2api-egress-proxy.platform-infra.svc.cluster.local:10808" - }, - { - "name": "NO_PROXY", - "value": "localhost,127.0.0.1,::1,127.0.0.1:5000,localhost:5000,.svc,.svc.cluster.local,.cluster.local,kubernetes,kubernetes.default,kubernetes.default.svc,10.0.0.0/8,10.42.0.0/16,10.43.0.0/16,172.16.0.0/12,192.168.0.0/16,82.156.23.220,74.48.78.17,hyueapi.com,.hyueapi.com" - }, - { - "name": "no_proxy", - "value": "localhost,127.0.0.1,::1,127.0.0.1:5000,localhost:5000,.svc,.svc.cluster.local,.cluster.local,kubernetes,kubernetes.default,kubernetes.default.svc,10.0.0.0/8,10.42.0.0/16,10.43.0.0/16,172.16.0.0/12,192.168.0.0/16,82.156.23.220,74.48.78.17,hyueapi.com,.hyueapi.com" - }, - { - "name": "OPENCODE_CONFIG_CONTENT", - "value": "{\"$schema\":\"https://opencode.ai/config.json\",\"autoupdate\":false,\"share\":\"disabled\",\"model\":\"dsflash-go/deepseek-v4-flash\",\"small_model\":\"dsflash-go/deepseek-v4-flash\",\"provider\":{\"dsflash-go\":{\"npm\":\"@ai-sdk/openai-compatible\",\"name\":\"AgentRun dsflash-go\",\"options\":{\"baseURL\":\"http://127.0.0.1:4097/v1\",\"apiKey\":\"{env:OPENCODE_DSFLASH_GO_API_KEY}\",\"timeout\":600000,\"headerTimeout\":600000,\"chunkTimeout\":300000},\"models\":{\"deepseek-v4-flash\":{\"name\":\"deepseek-v4-flash\",\"reasoning\":false,\"tool_call\":true,\"limit\":{\"context\":1000000,\"output\":384000}}}}}}" - }, - { - "name": "OPENCODE_DSFLASH_GO_API_KEY", - "valueFrom": { - "secretKeyRef": { - "name": "hwlab-v03-code-agent-provider", - "key": "opencode-api-key", - "optional": true - } - } - }, - { - "name": "OPENCODE_SERVER_USERNAME", - "valueFrom": { - "secretKeyRef": { - "name": "hwlab-v03-opencode-server-auth", - "key": "username" - } - } - }, - { - "name": "OPENCODE_SERVER_PASSWORD", - "valueFrom": { - "secretKeyRef": { - "name": "hwlab-v03-opencode-server-auth", - "key": "password" - } - } - } - ], - "ports": [ - { - "name": "http", - "containerPort": 4096 - } - ], - "startupProbe": { - "tcpSocket": { - "port": "http" - }, - "periodSeconds": 5, - "failureThreshold": 60 - }, - "readinessProbe": { - "tcpSocket": { - "port": "http" - }, - "periodSeconds": 10, - "failureThreshold": 3 - }, - "livenessProbe": { - "tcpSocket": { - "port": "http" - }, - "periodSeconds": 20, - "failureThreshold": 3 - }, - "resources": { - "requests": { - "cpu": "100m", - "memory": "256Mi" - }, - "limits": { - "cpu": "1", - "memory": "1Gi" - } - }, - "volumeMounts": [ - { - "name": "workspace", - "mountPath": "/workspace" - } - ] - }, - { - "name": "opencode-provider-proxy", - "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web-env@sha256:35be9f812c9aef6d989caf83def79bdfe5dca42f461d9f99fb34622b38ff9b2f", - "imagePullPolicy": "IfNotPresent", - "env": [ - { - "name": "HWLAB_SERVICE_ID", - "value": "opencode-provider-proxy" - }, - { - "name": "HWLAB_ENVIRONMENT", - "value": "v03" - }, - { - "name": "HWLAB_COMMIT_ID", - "value": "effbb79199d1117de0634904cdb019c5c0b0ee9f" - }, - { - "name": "HWLAB_IMAGE", - "value": "127.0.0.1:5000/hwlab/hwlab-cloud-web-env@sha256:35be9f812c9aef6d989caf83def79bdfe5dca42f461d9f99fb34622b38ff9b2f" - }, - { - "name": "HWLAB_IMAGE_TAG", - "value": "env-f5109d26020b" - }, - { - "name": "PORT", - "value": "4097" - }, - { - "name": "HWLAB_OPENCODE_PROVIDER_PROXY_UPSTREAM_BASE_URL", - "value": "https://opencode.ai/zen/go/v1" - }, - { - "name": "HWLAB_OPENCODE_PROVIDER_PROXY_PUBLIC_BASE_PATH", - "value": "/v1" - }, - { - "name": "HWLAB_OPENCODE_PROVIDER_PROXY_TIMEOUT_MS", - "value": "600000" - }, - { - "name": "OTEL_EXPORTER_OTLP_TRACES_ENDPOINT", - "value": "http://otel-collector.platform-infra.svc.cluster.local:4318/v1/traces" - }, - { - "name": "OTEL_SERVICE_NAME", - "value": "opencode-provider-proxy" - }, - { - "name": "HWLAB_RUNTIME_MODE", - "value": "env-reuse-git-mirror-checkout" - }, - { - "name": "HWLAB_BOOT_REPO", - "value": "git@github.com:pikasTech/HWLAB.git" - }, - { - "name": "HWLAB_BOOT_COMMIT", - "value": "effbb79199d1117de0634904cdb019c5c0b0ee9f" - }, - { - "name": "HWLAB_BOOT_REF", - "value": "v0.3" - }, - { - "name": "HWLAB_BOOT_SH", - "value": "deploy/runtime/boot/opencode-provider-proxy.sh" - }, - { - "name": "HWLAB_BOOT_READ_URL", - "value": "http://git-mirror-http.devops-infra.svc.cluster.local/pikasTech/HWLAB.git" - }, - { - "name": "HWLAB_ENVIRONMENT_IMAGE", - "value": "127.0.0.1:5000/hwlab/hwlab-cloud-web-env:env-f5109d26020b" - }, - { - "name": "HWLAB_ENVIRONMENT_DIGEST", - "value": "sha256:35be9f812c9aef6d989caf83def79bdfe5dca42f461d9f99fb34622b38ff9b2f" - }, - { - "name": "HWLAB_ENVIRONMENT_INPUT_HASH", - "value": "f5109d26020b05d9023ab1a6dd4e34ed07c9bbca03fc8d0a4697cc208c85a175" - }, - { - "name": "HWLAB_CODE_INPUT_HASH", - "value": "a30d3b6d134dd5e18879523ba0022838e879eb06f3bfb0753eca9d236d7d7780" - }, - { - "name": "HWLAB_IMAGE_DIGEST", - "value": "sha256:35be9f812c9aef6d989caf83def79bdfe5dca42f461d9f99fb34622b38ff9b2f" - } - ], - "ports": [ - { - "name": "provider", - "containerPort": 4097 - } - ], - "readinessProbe": { - "httpGet": { - "path": "/health/readiness", - "port": "provider" - }, - "periodSeconds": 10, - "failureThreshold": 3 - }, - "livenessProbe": { - "httpGet": { - "path": "/health/live", - "port": "provider" - }, - "periodSeconds": 20, - "failureThreshold": 3 - }, - "resources": { - "requests": { - "cpu": "25m", - "memory": "64Mi" - }, - "limits": { - "cpu": "250m", - "memory": "256Mi" - } - }, - "startupProbe": { - "httpGet": { - "path": "/health/readiness", - "port": "provider" - }, - "periodSeconds": 10, - "failureThreshold": 30, - "timeoutSeconds": 2, - "successThreshold": 1 - } - } - ], - "volumes": [ - { - "name": "workspace", - "persistentVolumeClaim": { - "claimName": "opencode-server-data" - } - } - ] - } - } - } - } - ] -} +apiVersion: v1 +kind: List +items: + - apiVersion: v1 + kind: ServiceAccount + metadata: + name: opencode-server + namespace: hwlab-v03 + labels: + app.kubernetes.io/name: opencode-server + app.kubernetes.io/part-of: hwlab + hwlab.pikastech.local/environment: v03 + hwlab.pikastech.local/profile: v03 + hwlab.pikastech.local/component: opencode + hwlab.pikastech.local/gitops-target: v03 + hwlab.pikastech.local/service-id: opencode-server + hwlab.pikastech.local/source-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + annotations: + hwlab.pikastech.local/rendered-by: scripts/gitops-render.mjs + hwlab.pikastech.local/opencode-provider-profile: dsflash-go + hwlab.pikastech.local/opencode-provider-id: dsflash-go + hwlab.pikastech.local/opencode-model: deepseek-v4-flash + hwlab.pikastech.local/opencode-provider-base-url: http://127.0.0.1:4097/v1 + hwlab.pikastech.local/opencode-provider-upstream-base-url: https://opencode.ai/zen/go/v1 + hwlab.pikastech.local/opencode-image: 127.0.0.1:5000/hwlab/opencode:1.17.7-git + hwlab.pikastech.local/opencode-config-sha256: 40a92e2d93f344d7c9dbcb98bd67760078f90a0af085f83b4b5385513bb26234 + hwlab.pikastech.local/opencode-api-key-secret-ref: hwlab-v03-code-agent-provider/opencode-api-key + hwlab.pikastech.local/agentrun-provider-secret-ref: agentrun-v02/agentrun-v01-provider-dsflash-go + hwlab.pikastech.local/agentrun-provider-secret-keys: auth.json,config.toml,model-catalog.json + hwlab.pikastech.local/values-printed: "false" + hwlab.pikastech.local/opencode-provider-proxy-runtime-mode: env-reuse-git-mirror-checkout + hwlab.pikastech.local/opencode-provider-proxy-boot-repo: git@github.com:pikasTech/HWLAB.git + hwlab.pikastech.local/opencode-provider-proxy-boot-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + hwlab.pikastech.local/opencode-provider-proxy-boot-sh: deploy/runtime/boot/opencode-provider-proxy.sh + hwlab.pikastech.local/opencode-provider-proxy-environment-digest: sha256:35be9f812c9aef6d989caf83def79bdfe5dca42f461d9f99fb34622b38ff9b2f + - apiVersion: v1 + kind: PersistentVolumeClaim + metadata: + name: opencode-server-data + namespace: hwlab-v03 + labels: + app.kubernetes.io/name: opencode-server + app.kubernetes.io/part-of: hwlab + hwlab.pikastech.local/environment: v03 + hwlab.pikastech.local/profile: v03 + hwlab.pikastech.local/component: opencode + hwlab.pikastech.local/gitops-target: v03 + hwlab.pikastech.local/service-id: opencode-server + hwlab.pikastech.local/source-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + annotations: + hwlab.pikastech.local/rendered-by: scripts/gitops-render.mjs + hwlab.pikastech.local/opencode-provider-profile: dsflash-go + hwlab.pikastech.local/opencode-provider-id: dsflash-go + hwlab.pikastech.local/opencode-model: deepseek-v4-flash + hwlab.pikastech.local/opencode-provider-base-url: http://127.0.0.1:4097/v1 + hwlab.pikastech.local/opencode-provider-upstream-base-url: https://opencode.ai/zen/go/v1 + hwlab.pikastech.local/opencode-image: 127.0.0.1:5000/hwlab/opencode:1.17.7-git + hwlab.pikastech.local/opencode-config-sha256: 40a92e2d93f344d7c9dbcb98bd67760078f90a0af085f83b4b5385513bb26234 + hwlab.pikastech.local/opencode-api-key-secret-ref: hwlab-v03-code-agent-provider/opencode-api-key + hwlab.pikastech.local/agentrun-provider-secret-ref: agentrun-v02/agentrun-v01-provider-dsflash-go + hwlab.pikastech.local/agentrun-provider-secret-keys: auth.json,config.toml,model-catalog.json + hwlab.pikastech.local/values-printed: "false" + hwlab.pikastech.local/opencode-provider-proxy-runtime-mode: env-reuse-git-mirror-checkout + hwlab.pikastech.local/opencode-provider-proxy-boot-repo: git@github.com:pikasTech/HWLAB.git + hwlab.pikastech.local/opencode-provider-proxy-boot-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + hwlab.pikastech.local/opencode-provider-proxy-boot-sh: deploy/runtime/boot/opencode-provider-proxy.sh + hwlab.pikastech.local/opencode-provider-proxy-environment-digest: sha256:35be9f812c9aef6d989caf83def79bdfe5dca42f461d9f99fb34622b38ff9b2f + spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 8Gi + - apiVersion: v1 + kind: Service + metadata: + name: opencode-server + namespace: hwlab-v03 + labels: + app.kubernetes.io/name: opencode-server + app.kubernetes.io/part-of: hwlab + hwlab.pikastech.local/environment: v03 + hwlab.pikastech.local/profile: v03 + hwlab.pikastech.local/component: opencode + hwlab.pikastech.local/gitops-target: v03 + hwlab.pikastech.local/service-id: opencode-server + hwlab.pikastech.local/source-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + annotations: + hwlab.pikastech.local/rendered-by: scripts/gitops-render.mjs + hwlab.pikastech.local/opencode-provider-profile: dsflash-go + hwlab.pikastech.local/opencode-provider-id: dsflash-go + hwlab.pikastech.local/opencode-model: deepseek-v4-flash + hwlab.pikastech.local/opencode-provider-base-url: http://127.0.0.1:4097/v1 + hwlab.pikastech.local/opencode-provider-upstream-base-url: https://opencode.ai/zen/go/v1 + hwlab.pikastech.local/opencode-image: 127.0.0.1:5000/hwlab/opencode:1.17.7-git + hwlab.pikastech.local/opencode-config-sha256: 40a92e2d93f344d7c9dbcb98bd67760078f90a0af085f83b4b5385513bb26234 + hwlab.pikastech.local/opencode-api-key-secret-ref: hwlab-v03-code-agent-provider/opencode-api-key + hwlab.pikastech.local/agentrun-provider-secret-ref: agentrun-v02/agentrun-v01-provider-dsflash-go + hwlab.pikastech.local/agentrun-provider-secret-keys: auth.json,config.toml,model-catalog.json + hwlab.pikastech.local/values-printed: "false" + hwlab.pikastech.local/opencode-provider-proxy-runtime-mode: env-reuse-git-mirror-checkout + hwlab.pikastech.local/opencode-provider-proxy-boot-repo: git@github.com:pikasTech/HWLAB.git + hwlab.pikastech.local/opencode-provider-proxy-boot-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + hwlab.pikastech.local/opencode-provider-proxy-boot-sh: deploy/runtime/boot/opencode-provider-proxy.sh + hwlab.pikastech.local/opencode-provider-proxy-environment-digest: sha256:35be9f812c9aef6d989caf83def79bdfe5dca42f461d9f99fb34622b38ff9b2f + spec: + type: ClusterIP + selector: + app.kubernetes.io/name: opencode-server + app.kubernetes.io/part-of: hwlab + hwlab.pikastech.local/environment: v03 + hwlab.pikastech.local/profile: v03 + ports: + - name: http + port: 4096 + targetPort: http + - apiVersion: apps/v1 + kind: Deployment + metadata: + name: opencode-server + namespace: hwlab-v03 + labels: + app.kubernetes.io/name: opencode-server + app.kubernetes.io/part-of: hwlab + hwlab.pikastech.local/environment: v03 + hwlab.pikastech.local/profile: v03 + hwlab.pikastech.local/component: opencode + hwlab.pikastech.local/gitops-target: v03 + hwlab.pikastech.local/service-id: opencode-server + hwlab.pikastech.local/source-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + annotations: + hwlab.pikastech.local/rendered-by: scripts/gitops-render.mjs + hwlab.pikastech.local/opencode-provider-profile: dsflash-go + hwlab.pikastech.local/opencode-provider-id: dsflash-go + hwlab.pikastech.local/opencode-model: deepseek-v4-flash + hwlab.pikastech.local/opencode-provider-base-url: http://127.0.0.1:4097/v1 + hwlab.pikastech.local/opencode-provider-upstream-base-url: https://opencode.ai/zen/go/v1 + hwlab.pikastech.local/opencode-image: 127.0.0.1:5000/hwlab/opencode:1.17.7-git + hwlab.pikastech.local/opencode-config-sha256: 40a92e2d93f344d7c9dbcb98bd67760078f90a0af085f83b4b5385513bb26234 + hwlab.pikastech.local/opencode-api-key-secret-ref: hwlab-v03-code-agent-provider/opencode-api-key + hwlab.pikastech.local/agentrun-provider-secret-ref: agentrun-v02/agentrun-v01-provider-dsflash-go + hwlab.pikastech.local/agentrun-provider-secret-keys: auth.json,config.toml,model-catalog.json + hwlab.pikastech.local/values-printed: "false" + hwlab.pikastech.local/opencode-provider-proxy-runtime-mode: env-reuse-git-mirror-checkout + hwlab.pikastech.local/opencode-provider-proxy-boot-repo: git@github.com:pikasTech/HWLAB.git + hwlab.pikastech.local/opencode-provider-proxy-boot-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + hwlab.pikastech.local/opencode-provider-proxy-boot-sh: deploy/runtime/boot/opencode-provider-proxy.sh + hwlab.pikastech.local/opencode-provider-proxy-environment-digest: sha256:35be9f812c9aef6d989caf83def79bdfe5dca42f461d9f99fb34622b38ff9b2f + spec: + replicas: 1 + strategy: + type: Recreate + selector: + matchLabels: + app.kubernetes.io/name: opencode-server + app.kubernetes.io/part-of: hwlab + hwlab.pikastech.local/environment: v03 + hwlab.pikastech.local/profile: v03 + template: + metadata: + labels: + app.kubernetes.io/name: opencode-server + app.kubernetes.io/part-of: hwlab + hwlab.pikastech.local/environment: v03 + hwlab.pikastech.local/profile: v03 + hwlab.pikastech.local/component: opencode + hwlab.pikastech.local/gitops-target: v03 + hwlab.pikastech.local/service-id: opencode-server + hwlab.pikastech.local/source-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + annotations: + hwlab.pikastech.local/rendered-by: scripts/gitops-render.mjs + hwlab.pikastech.local/opencode-provider-profile: dsflash-go + hwlab.pikastech.local/opencode-provider-id: dsflash-go + hwlab.pikastech.local/opencode-model: deepseek-v4-flash + hwlab.pikastech.local/opencode-provider-base-url: http://127.0.0.1:4097/v1 + hwlab.pikastech.local/opencode-provider-upstream-base-url: https://opencode.ai/zen/go/v1 + hwlab.pikastech.local/opencode-image: 127.0.0.1:5000/hwlab/opencode:1.17.7-git + hwlab.pikastech.local/opencode-config-sha256: 40a92e2d93f344d7c9dbcb98bd67760078f90a0af085f83b4b5385513bb26234 + hwlab.pikastech.local/opencode-api-key-secret-ref: hwlab-v03-code-agent-provider/opencode-api-key + hwlab.pikastech.local/agentrun-provider-secret-ref: agentrun-v02/agentrun-v01-provider-dsflash-go + hwlab.pikastech.local/agentrun-provider-secret-keys: auth.json,config.toml,model-catalog.json + hwlab.pikastech.local/values-printed: "false" + hwlab.pikastech.local/opencode-provider-proxy-runtime-mode: env-reuse-git-mirror-checkout + hwlab.pikastech.local/opencode-provider-proxy-boot-repo: git@github.com:pikasTech/HWLAB.git + hwlab.pikastech.local/opencode-provider-proxy-boot-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + hwlab.pikastech.local/opencode-provider-proxy-boot-sh: deploy/runtime/boot/opencode-provider-proxy.sh + hwlab.pikastech.local/opencode-provider-proxy-environment-digest: + sha256:35be9f812c9aef6d989caf83def79bdfe5dca42f461d9f99fb34622b38ff9b2f + spec: + serviceAccountName: opencode-server + securityContext: + fsGroup: 1000 + fsGroupChangePolicy: OnRootMismatch + initContainers: + - name: opencode-workspace-git-init + image: 127.0.0.1:5000/hwlab/hwlab-cloud-web-env@sha256:35be9f812c9aef6d989caf83def79bdfe5dca42f461d9f99fb34622b38ff9b2f + imagePullPolicy: IfNotPresent + command: + - /bin/sh + - -ec + args: + - >- + set -eu + + mkdir -p /workspace + + if [ ! -d /workspace/.git ]; then + git -C /workspace init + fi + + git -C /workspace config user.name 'HWLAB OpenCode' || true + + git -C /workspace config user.email 'opencode@hwlab.local' || + true + + chgrp -R 1000 /workspace/.git 2>/dev/null || true + + chmod -R g+rwX /workspace/.git 2>/dev/null || true + resources: + requests: + cpu: 25m + memory: 64Mi + limits: + cpu: 250m + memory: 256Mi + volumeMounts: + - name: workspace + mountPath: /workspace + containers: + - name: opencode-server + image: 127.0.0.1:5000/hwlab/opencode:1.17.7-git + imagePullPolicy: IfNotPresent + command: + - /bin/sh + - -ec + args: + - exec opencode serve --hostname 0.0.0.0 --port 4096 + workingDir: /workspace + env: + - name: HOME + value: /workspace + - name: XDG_CONFIG_HOME + value: /workspace/.config + - name: XDG_DATA_HOME + value: /workspace/.local/share + - name: HTTP_PROXY + value: http://10.42.0.1:10808 + - name: HTTPS_PROXY + value: http://10.42.0.1:10808 + - name: http_proxy + value: http://10.42.0.1:10808 + - name: https_proxy + value: http://10.42.0.1:10808 + - name: NO_PROXY + value: localhost,127.0.0.1,::1,127.0.0.1:5000,localhost:5000,.svc,.svc.cluster.local,.cluster.local,kubernetes,kubernetes.default,kubernetes.default.svc,argocd-repo-server,argocd-repo-server.argocd,argocd-redis,argocd-redis.argocd,git-mirror-http,git-mirror-http.devops-infra,git-mirror-write,git-mirror-write.devops-infra,10.0.0.0/8,10.42.0.0/16,10.43.0.0/16,172.16.0.0/12,192.168.0.0/16,82.156.23.220,74.48.78.17,hyueapi.com,.hyueapi.com + - name: no_proxy + value: localhost,127.0.0.1,::1,127.0.0.1:5000,localhost:5000,.svc,.svc.cluster.local,.cluster.local,kubernetes,kubernetes.default,kubernetes.default.svc,argocd-repo-server,argocd-repo-server.argocd,argocd-redis,argocd-redis.argocd,git-mirror-http,git-mirror-http.devops-infra,git-mirror-write,git-mirror-write.devops-infra,10.0.0.0/8,10.42.0.0/16,10.43.0.0/16,172.16.0.0/12,192.168.0.0/16,82.156.23.220,74.48.78.17,hyueapi.com,.hyueapi.com + - name: OPENCODE_CONFIG_CONTENT + value: '{"$schema":"https://opencode.ai/config.json","autoupdate":false,"share":"disabled","model":"dsflash-go/deepseek-v4-flash","small_model":"dsflash-go/deepseek-v4-flash","provider":{"dsflash-go":{"npm":"@ai-sdk/openai-compatible","name":"AgentRun + dsflash-go","options":{"baseURL":"http://127.0.0.1:4097/v1","apiKey":"{env:OPENCODE_DSFLASH_GO_API_KEY}","timeout":600000,"headerTimeout":600000,"chunkTimeout":300000},"models":{"deepseek-v4-flash":{"name":"deepseek-v4-flash","reasoning":false,"tool_call":true,"limit":{"context":1000000,"output":384000}}}}}}' + - name: OPENCODE_DSFLASH_GO_API_KEY + valueFrom: + secretKeyRef: + name: hwlab-v03-code-agent-provider + key: opencode-api-key + optional: true + - name: OPENCODE_SERVER_USERNAME + valueFrom: + secretKeyRef: + name: hwlab-v03-opencode-server-auth + key: username + - name: OPENCODE_SERVER_PASSWORD + valueFrom: + secretKeyRef: + name: hwlab-v03-opencode-server-auth + key: password + ports: + - name: http + containerPort: 4096 + startupProbe: + tcpSocket: + port: http + periodSeconds: 5 + failureThreshold: 60 + readinessProbe: + tcpSocket: + port: http + periodSeconds: 10 + failureThreshold: 3 + livenessProbe: + tcpSocket: + port: http + periodSeconds: 20 + failureThreshold: 3 + resources: + requests: + cpu: 100m + memory: 256Mi + limits: + cpu: "1" + memory: 1Gi + volumeMounts: + - name: workspace + mountPath: /workspace + - name: opencode-provider-proxy + image: 127.0.0.1:5000/hwlab/hwlab-cloud-web-env@sha256:35be9f812c9aef6d989caf83def79bdfe5dca42f461d9f99fb34622b38ff9b2f + imagePullPolicy: IfNotPresent + env: + - name: HWLAB_SERVICE_ID + value: opencode-provider-proxy + - name: HWLAB_ENVIRONMENT + value: v03 + - name: HWLAB_COMMIT_ID + value: effbb79199d1117de0634904cdb019c5c0b0ee9f + - name: HWLAB_IMAGE + value: 127.0.0.1:5000/hwlab/hwlab-cloud-web-env@sha256:35be9f812c9aef6d989caf83def79bdfe5dca42f461d9f99fb34622b38ff9b2f + - name: HWLAB_IMAGE_TAG + value: env-f5109d26020b + - name: PORT + value: "4097" + - name: HWLAB_OPENCODE_PROVIDER_PROXY_UPSTREAM_BASE_URL + value: https://opencode.ai/zen/go/v1 + - name: HWLAB_OPENCODE_PROVIDER_PROXY_PUBLIC_BASE_PATH + value: /v1 + - name: HWLAB_OPENCODE_PROVIDER_PROXY_TIMEOUT_MS + value: "600000" + - name: OTEL_EXPORTER_OTLP_TRACES_ENDPOINT + value: http://otel-collector.platform-infra.svc.cluster.local:4318/v1/traces + - name: OTEL_SERVICE_NAME + value: opencode-provider-proxy + - name: HWLAB_RUNTIME_MODE + value: env-reuse-git-mirror-checkout + - name: HWLAB_BOOT_REPO + value: git@github.com:pikasTech/HWLAB.git + - name: HWLAB_BOOT_COMMIT + value: effbb79199d1117de0634904cdb019c5c0b0ee9f + - name: HWLAB_BOOT_REF + value: v0.3 + - name: HWLAB_BOOT_SH + value: deploy/runtime/boot/opencode-provider-proxy.sh + - name: HWLAB_BOOT_READ_URL + value: http://git-mirror-http.devops-infra.svc.cluster.local:8080/pikasTech/HWLAB.git + - name: HWLAB_ENVIRONMENT_IMAGE + value: 127.0.0.1:5000/hwlab/hwlab-cloud-web-env:env-f5109d26020b + - name: HWLAB_ENVIRONMENT_DIGEST + value: sha256:35be9f812c9aef6d989caf83def79bdfe5dca42f461d9f99fb34622b38ff9b2f + - name: HWLAB_ENVIRONMENT_INPUT_HASH + value: f5109d26020b05d9023ab1a6dd4e34ed07c9bbca03fc8d0a4697cc208c85a175 + - name: HWLAB_CODE_INPUT_HASH + value: a30d3b6d134dd5e18879523ba0022838e879eb06f3bfb0753eca9d236d7d7780 + - name: HWLAB_IMAGE_DIGEST + value: sha256:35be9f812c9aef6d989caf83def79bdfe5dca42f461d9f99fb34622b38ff9b2f + ports: + - name: provider + containerPort: 4097 + readinessProbe: + httpGet: + path: /health/readiness + port: provider + periodSeconds: 10 + failureThreshold: 3 + livenessProbe: + httpGet: + path: /health/live + port: provider + periodSeconds: 20 + failureThreshold: 3 + resources: + requests: + cpu: 25m + memory: 64Mi + limits: + cpu: 250m + memory: 256Mi + startupProbe: + httpGet: + path: /health/readiness + port: provider + periodSeconds: 10 + failureThreshold: 30 + timeoutSeconds: 2 + successThreshold: 1 + volumes: + - name: workspace + persistentVolumeClaim: + claimName: opencode-server-data diff --git a/deploy/gitops/node/jd01/runtime-v03/postgres.yaml b/deploy/gitops/node/jd01/runtime-v03/postgres.yaml new file mode 100644 index 00000000..f6534d2c --- /dev/null +++ b/deploy/gitops/node/jd01/runtime-v03/postgres.yaml @@ -0,0 +1,942 @@ +apiVersion: v1 +kind: List +items: + - apiVersion: v1 + kind: ConfigMap + metadata: + name: hwlab-v03-postgres-init + namespace: hwlab-v03 + labels: + app.kubernetes.io/name: hwlab-v03-postgres + app.kubernetes.io/part-of: hwlab + hwlab.pikastech.local/environment: v03 + hwlab.pikastech.local/gitops-target: v03 + hwlab.pikastech.local/profile: v03 + hwlab.pikastech.local/source-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + data: + 0001_cloud_core_skeleton.sql: > + -- SPEC: PJ2026-0104010803 Workbench唯一投影 + draft-2026-06-24-p0-aggregate-event-stream. + + -- HWLAB L1 Cloud Core schema skeleton. + + -- This file is source schema only; applying it to DEV/PROD is a + separate + + -- operator action and is not performed by source tests or smokes. + + + CREATE TABLE IF NOT EXISTS projects ( + id TEXT PRIMARY KEY, + name TEXT NOT NULL DEFAULT '', + status TEXT NOT NULL DEFAULT 'pending', + created_at TEXT NOT NULL, + updated_at TEXT NOT NULL + ); + + + CREATE TABLE IF NOT EXISTS users ( + id TEXT PRIMARY KEY, + username TEXT NOT NULL UNIQUE, + display_name TEXT NOT NULL DEFAULT '', + role TEXT NOT NULL CHECK (role IN ('admin', 'user')), + status TEXT NOT NULL DEFAULT 'active' CHECK (status IN ('active', 'disabled')), + password_hash TEXT, + created_at TEXT NOT NULL, + updated_at TEXT NOT NULL + ); + + + CREATE TABLE IF NOT EXISTS user_sessions ( + id TEXT PRIMARY KEY, + user_id TEXT NOT NULL REFERENCES users(id), + session_token_hash TEXT NOT NULL UNIQUE, + created_at TEXT NOT NULL, + last_seen_at TEXT NOT NULL, + expires_at TEXT NOT NULL, + revoked_at TEXT + ); + + + CREATE TABLE IF NOT EXISTS gateway_sessions ( + id TEXT PRIMARY KEY, + project_id TEXT, + gateway_service_id TEXT NOT NULL, + status TEXT NOT NULL DEFAULT 'pending', + started_at TEXT, + ended_at TEXT, + gateway_session_json TEXT NOT NULL DEFAULT '{}' + ); + + + CREATE TABLE IF NOT EXISTS box_resources ( + id TEXT PRIMARY KEY, + project_id TEXT, + gateway_session_id TEXT, + resource_state TEXT NOT NULL DEFAULT 'available', + labels_json TEXT NOT NULL DEFAULT '{}', + resource_json TEXT NOT NULL DEFAULT '{}', + updated_at TEXT NOT NULL + ); + + + CREATE TABLE IF NOT EXISTS box_capabilities ( + id TEXT PRIMARY KEY, + box_resource_id TEXT NOT NULL, + capability_type TEXT NOT NULL, + capability_json TEXT NOT NULL DEFAULT '{}', + updated_at TEXT NOT NULL + ); + + + CREATE TABLE IF NOT EXISTS wiring_configs ( + id TEXT PRIMARY KEY, + project_id TEXT, + wiring_json TEXT NOT NULL DEFAULT '{}', + status TEXT NOT NULL DEFAULT 'pending', + updated_at TEXT NOT NULL + ); + + + CREATE TABLE IF NOT EXISTS patch_panel_status ( + id TEXT PRIMARY KEY, + gateway_session_id TEXT, + wiring_config_id TEXT, + status_json TEXT NOT NULL DEFAULT '{}', + updated_at TEXT NOT NULL + ); + + + CREATE TABLE IF NOT EXISTS hardware_operations ( + id TEXT PRIMARY KEY, + project_id TEXT, + requested_by TEXT, + operation_type TEXT NOT NULL, + operation_json TEXT NOT NULL DEFAULT '{}', + status TEXT NOT NULL DEFAULT 'requested', + requested_at TEXT NOT NULL, + updated_at TEXT NOT NULL + ); + + + CREATE TABLE IF NOT EXISTS audit_events ( + id TEXT PRIMARY KEY, + request_id TEXT NOT NULL, + actor TEXT NOT NULL, + source TEXT NOT NULL, + operation TEXT NOT NULL, + target TEXT NOT NULL, + result TEXT NOT NULL, + timestamp TEXT NOT NULL, + event_json TEXT NOT NULL DEFAULT '{}' + ); + + + CREATE TABLE IF NOT EXISTS agent_sessions ( + id TEXT PRIMARY KEY, + project_id TEXT, + agent_id TEXT NOT NULL, + status TEXT NOT NULL DEFAULT 'pending', + started_at TEXT, + ended_at TEXT, + owner_user_id TEXT REFERENCES users(id), + conversation_id TEXT, + thread_id TEXT, + last_trace_id TEXT, + session_json TEXT NOT NULL DEFAULT '{}', + updated_at TEXT + ); + + + ALTER TABLE agent_sessions ADD COLUMN IF NOT EXISTS owner_user_id TEXT + REFERENCES users(id); + + ALTER TABLE agent_sessions ADD COLUMN IF NOT EXISTS conversation_id + TEXT; + + ALTER TABLE agent_sessions ADD COLUMN IF NOT EXISTS thread_id TEXT; + + ALTER TABLE agent_sessions ADD COLUMN IF NOT EXISTS last_trace_id TEXT; + + ALTER TABLE agent_sessions ADD COLUMN IF NOT EXISTS session_json TEXT + NOT NULL DEFAULT '{}'; + + ALTER TABLE agent_sessions ADD COLUMN IF NOT EXISTS updated_at TEXT; + + CREATE INDEX IF NOT EXISTS idx_agent_sessions_owner ON + agent_sessions(owner_user_id); + + CREATE INDEX IF NOT EXISTS idx_agent_sessions_conversation ON + agent_sessions(conversation_id); + + CREATE INDEX IF NOT EXISTS idx_agent_sessions_active_updated ON + agent_sessions(updated_at DESC, id DESC) WHERE status <> 'archived'; + + CREATE INDEX IF NOT EXISTS idx_agent_sessions_owner_active_updated ON + agent_sessions(owner_user_id, updated_at DESC, id DESC) WHERE status <> + 'archived'; + + + CREATE TABLE IF NOT EXISTS account_workspaces ( + id TEXT PRIMARY KEY, + owner_user_id TEXT NOT NULL REFERENCES users(id), + project_id TEXT NOT NULL, + name TEXT NOT NULL DEFAULT 'Default Workbench', + status TEXT NOT NULL DEFAULT 'active' CHECK (status IN ('active', 'archived')), + is_default BOOLEAN NOT NULL DEFAULT true, + selected_conversation_id TEXT, + selected_agent_session_id TEXT, + active_trace_id TEXT, + provider_profile TEXT, + workspace_json TEXT NOT NULL DEFAULT '{}', + revision INTEGER NOT NULL DEFAULT 1, + updated_by_session_id TEXT, + updated_by_client TEXT, + created_at TEXT NOT NULL, + updated_at TEXT NOT NULL + ); + + CREATE UNIQUE INDEX IF NOT EXISTS idx_account_workspaces_default ON + account_workspaces(owner_user_id, project_id) WHERE is_default = TRUE + AND status = 'active'; + + CREATE INDEX IF NOT EXISTS idx_account_workspaces_owner ON + account_workspaces(owner_user_id, project_id, updated_at DESC); + + + CREATE TABLE IF NOT EXISTS worker_sessions ( + id TEXT PRIMARY KEY, + agent_session_id TEXT, + worker_id TEXT NOT NULL, + status TEXT NOT NULL DEFAULT 'pending', + started_at TEXT, + ended_at TEXT + ); + + + CREATE TABLE IF NOT EXISTS agent_trace_events ( + id TEXT PRIMARY KEY, + trace_id TEXT NOT NULL, + agent_session_id TEXT, + worker_session_id TEXT, + level TEXT NOT NULL DEFAULT 'info', + message TEXT NOT NULL DEFAULT '', + event_json TEXT NOT NULL DEFAULT '{}', + occurred_at TEXT NOT NULL + ); + + CREATE INDEX IF NOT EXISTS idx_agent_trace_events_trace_order ON + agent_trace_events(trace_id, occurred_at, id); + + CREATE INDEX IF NOT EXISTS idx_agent_trace_events_session_order ON + agent_trace_events(agent_session_id, occurred_at, id); + + CREATE INDEX IF NOT EXISTS idx_agent_trace_events_worker_order ON + agent_trace_events(worker_session_id, occurred_at, id); + + + CREATE TABLE IF NOT EXISTS workbench_projection_state ( + trace_id TEXT PRIMARY KEY, + session_id TEXT, + conversation_id TEXT, + thread_id TEXT, + run_id TEXT NOT NULL, + command_id TEXT NOT NULL, + last_agentrun_seq INTEGER NOT NULL DEFAULT 0, + last_projected_seq INTEGER NOT NULL DEFAULT 0, + upstream_latest_seq INTEGER, + projection_status TEXT NOT NULL DEFAULT 'projecting', + projection_health TEXT NOT NULL DEFAULT 'healthy', + result_sync_state TEXT NOT NULL DEFAULT 'not_started', + last_projected_at TEXT, + last_result_sync_at TEXT, + last_error_code TEXT, + last_error_message TEXT, + failure_count INTEGER NOT NULL DEFAULT 0, + next_retry_at TEXT, + projection_json TEXT NOT NULL DEFAULT '{}', + created_at TEXT NOT NULL, + updated_at TEXT NOT NULL + ); + + CREATE INDEX IF NOT EXISTS + idx_workbench_projection_state_status_retry_updated ON + workbench_projection_state(projection_status, next_retry_at, + updated_at); + + CREATE INDEX IF NOT EXISTS idx_workbench_projection_state_run_command ON + workbench_projection_state(run_id, command_id); + + CREATE INDEX IF NOT EXISTS + idx_workbench_projection_state_session_updated ON + workbench_projection_state(session_id, updated_at DESC); + + + CREATE TABLE IF NOT EXISTS workbench_sessions ( + session_id TEXT PRIMARY KEY, + owner_user_id TEXT REFERENCES users(id), + project_id TEXT, + conversation_id TEXT, + thread_id TEXT, + status TEXT NOT NULL DEFAULT 'unknown', + last_trace_id TEXT, + projected_seq INTEGER NOT NULL DEFAULT 0, + source_seq INTEGER NOT NULL DEFAULT 0, + source_event_id TEXT, + terminal BOOLEAN NOT NULL DEFAULT false, + sealed BOOLEAN NOT NULL DEFAULT false, + session_json TEXT NOT NULL DEFAULT '{}', + created_at TEXT NOT NULL, + updated_at TEXT NOT NULL + ); + + CREATE INDEX IF NOT EXISTS idx_workbench_sessions_owner_updated ON + workbench_sessions(owner_user_id, updated_at DESC, session_id); + + CREATE INDEX IF NOT EXISTS idx_workbench_sessions_status_updated ON + workbench_sessions(status, updated_at DESC, session_id); + + + CREATE TABLE IF NOT EXISTS workbench_messages ( + message_id TEXT PRIMARY KEY, + session_id TEXT NOT NULL, + turn_id TEXT, + trace_id TEXT, + role TEXT NOT NULL, + status TEXT NOT NULL DEFAULT 'unknown', + projected_seq INTEGER NOT NULL DEFAULT 0, + source_seq INTEGER NOT NULL DEFAULT 0, + source_event_id TEXT, + terminal BOOLEAN NOT NULL DEFAULT false, + sealed BOOLEAN NOT NULL DEFAULT false, + message_json TEXT NOT NULL DEFAULT '{}', + created_at TEXT NOT NULL, + updated_at TEXT NOT NULL + ); + + CREATE INDEX IF NOT EXISTS idx_workbench_messages_session_updated ON + workbench_messages(session_id, updated_at ASC, message_id); + + CREATE INDEX IF NOT EXISTS idx_workbench_messages_trace ON + workbench_messages(trace_id, message_id); + + CREATE INDEX IF NOT EXISTS idx_workbench_messages_turn ON + workbench_messages(turn_id, message_id); + + + CREATE TABLE IF NOT EXISTS workbench_parts ( + part_id TEXT PRIMARY KEY, + message_id TEXT NOT NULL, + session_id TEXT NOT NULL, + turn_id TEXT, + trace_id TEXT, + part_index INTEGER NOT NULL DEFAULT 0, + part_type TEXT NOT NULL DEFAULT 'text', + status TEXT NOT NULL DEFAULT 'unknown', + projected_seq INTEGER NOT NULL DEFAULT 0, + source_seq INTEGER NOT NULL DEFAULT 0, + source_event_id TEXT, + terminal BOOLEAN NOT NULL DEFAULT false, + sealed BOOLEAN NOT NULL DEFAULT false, + part_json TEXT NOT NULL DEFAULT '{}', + created_at TEXT NOT NULL, + updated_at TEXT NOT NULL + ); + + CREATE INDEX IF NOT EXISTS idx_workbench_parts_message_index ON + workbench_parts(message_id, part_index, part_id); + + CREATE INDEX IF NOT EXISTS idx_workbench_parts_session_trace ON + workbench_parts(session_id, trace_id, part_index); + + + CREATE TABLE IF NOT EXISTS workbench_turns ( + turn_id TEXT PRIMARY KEY, + session_id TEXT NOT NULL, + trace_id TEXT, + message_id TEXT, + status TEXT NOT NULL DEFAULT 'unknown', + projected_seq INTEGER NOT NULL DEFAULT 0, + source_seq INTEGER NOT NULL DEFAULT 0, + source_event_id TEXT, + terminal BOOLEAN NOT NULL DEFAULT false, + sealed BOOLEAN NOT NULL DEFAULT false, + final_response_json TEXT NOT NULL DEFAULT 'null', + diagnostic_json TEXT NOT NULL DEFAULT '{}', + turn_json TEXT NOT NULL DEFAULT '{}', + created_at TEXT NOT NULL, + updated_at TEXT NOT NULL + ); + + CREATE INDEX IF NOT EXISTS idx_workbench_turns_session_updated ON + workbench_turns(session_id, updated_at DESC, turn_id); + + CREATE INDEX IF NOT EXISTS idx_workbench_turns_trace ON + workbench_turns(trace_id, turn_id); + + + CREATE TABLE IF NOT EXISTS workbench_trace_events ( + id TEXT PRIMARY KEY, + trace_id TEXT NOT NULL, + session_id TEXT, + turn_id TEXT, + message_id TEXT, + source_seq INTEGER NOT NULL DEFAULT 0, + source_event_id TEXT, + projected_seq INTEGER NOT NULL DEFAULT 0, + event_type TEXT NOT NULL DEFAULT 'event', + terminal BOOLEAN NOT NULL DEFAULT false, + sealed BOOLEAN NOT NULL DEFAULT false, + event_json TEXT NOT NULL DEFAULT '{}', + occurred_at TEXT NOT NULL, + updated_at TEXT NOT NULL + ); + + CREATE INDEX IF NOT EXISTS idx_workbench_trace_events_trace_seq ON + workbench_trace_events(trace_id, source_seq, projected_seq, id); + + CREATE INDEX IF NOT EXISTS idx_workbench_trace_events_session_seq ON + workbench_trace_events(session_id, source_seq, projected_seq, id); + + + WITH duplicate_trace_source_events AS ( + SELECT + id, + ROW_NUMBER() OVER ( + PARTITION BY trace_id, source_event_id + ORDER BY occurred_at, id + ) AS duplicate_rank + FROM workbench_trace_events + WHERE trace_id IS NOT NULL AND source_event_id IS NOT NULL + ), trace_source_event_rewrites AS ( + SELECT + id, + 'workbench_trace_events:' || id AS stable_source_event_id + FROM duplicate_trace_source_events + WHERE duplicate_rank > 1 + ) + + UPDATE workbench_trace_events AS target + + SET + source_event_id = trace_source_event_rewrites.stable_source_event_id, + updated_at = COALESCE(NULLIF(target.updated_at, ''), target.occurred_at, CURRENT_TIMESTAMP::text) + FROM trace_source_event_rewrites + + WHERE target.id = trace_source_event_rewrites.id + AND target.source_event_id IS DISTINCT FROM trace_source_event_rewrites.stable_source_event_id; + + WITH trace_event_projected_seq_conflicts AS ( + SELECT trace_id + FROM workbench_trace_events + WHERE trace_id IS NOT NULL + GROUP BY trace_id + HAVING COUNT(*) <> COUNT(DISTINCT projected_seq) + ), trace_event_resequence AS ( + SELECT + workbench_trace_events.id, + (ROW_NUMBER() OVER ( + PARTITION BY workbench_trace_events.trace_id + ORDER BY + CASE WHEN workbench_trace_events.projected_seq > 0 THEN 0 ELSE 1 END, + workbench_trace_events.projected_seq, + workbench_trace_events.occurred_at, + workbench_trace_events.id + ))::integer AS durable_projected_seq + FROM workbench_trace_events + INNER JOIN trace_event_projected_seq_conflicts + ON trace_event_projected_seq_conflicts.trace_id = workbench_trace_events.trace_id + ) + + UPDATE workbench_trace_events AS target + + SET + projected_seq = trace_event_resequence.durable_projected_seq, + source_seq = CASE + WHEN target.source_seq > 0 THEN target.source_seq + ELSE trace_event_resequence.durable_projected_seq + END, + updated_at = COALESCE(NULLIF(target.updated_at, ''), target.occurred_at, CURRENT_TIMESTAMP::text) + FROM trace_event_resequence + + WHERE target.id = trace_event_resequence.id + AND ( + target.projected_seq IS DISTINCT FROM trace_event_resequence.durable_projected_seq + OR target.source_seq <= 0 + ); + + DROP INDEX IF EXISTS idx_workbench_trace_events_trace_source_event; + + CREATE UNIQUE INDEX idx_workbench_trace_events_trace_source_event ON + workbench_trace_events(trace_id, source_event_id) WHERE source_event_id + IS NOT NULL; + + DROP INDEX IF EXISTS idx_workbench_trace_events_trace_projected_seq; + + CREATE UNIQUE INDEX idx_workbench_trace_events_trace_projected_seq ON + workbench_trace_events(trace_id, projected_seq); + + + CREATE TABLE IF NOT EXISTS workbench_event_sequences ( + aggregate_id TEXT PRIMARY KEY, + aggregate_type TEXT NOT NULL DEFAULT 'trace', + session_id TEXT, + turn_id TEXT, + trace_id TEXT, + last_seq INTEGER NOT NULL DEFAULT 0, + created_at TEXT NOT NULL, + updated_at TEXT NOT NULL + ); + + CREATE INDEX IF NOT EXISTS idx_workbench_event_sequences_session ON + workbench_event_sequences(session_id, updated_at DESC, aggregate_id); + + CREATE INDEX IF NOT EXISTS idx_workbench_event_sequences_trace ON + workbench_event_sequences(trace_id, updated_at DESC, aggregate_id); + + + CREATE TABLE IF NOT EXISTS workbench_events ( + event_seq BIGSERIAL PRIMARY KEY, + event_id TEXT NOT NULL UNIQUE, + aggregate_id TEXT NOT NULL, + aggregate_type TEXT NOT NULL DEFAULT 'trace', + aggregate_seq INTEGER NOT NULL, + session_id TEXT, + turn_id TEXT, + trace_id TEXT, + message_id TEXT, + source_run_id TEXT, + source_command_id TEXT, + source_seq INTEGER NOT NULL DEFAULT 0, + source_event_id TEXT, + event_type TEXT NOT NULL DEFAULT 'event', + projection_revision INTEGER NOT NULL DEFAULT 0, + terminal BOOLEAN NOT NULL DEFAULT false, + sealed BOOLEAN NOT NULL DEFAULT false, + payload_json TEXT NOT NULL DEFAULT '{}', + occurred_at TEXT NOT NULL, + committed_at TEXT NOT NULL + ); + + CREATE UNIQUE INDEX IF NOT EXISTS idx_workbench_events_aggregate_seq ON + workbench_events(aggregate_id, aggregate_seq); + + CREATE UNIQUE INDEX IF NOT EXISTS + idx_workbench_events_aggregate_source_event ON + workbench_events(aggregate_id, source_event_id) WHERE source_event_id IS + NOT NULL; + + CREATE INDEX IF NOT EXISTS idx_workbench_events_trace_seq ON + workbench_events(trace_id, event_seq); + + CREATE INDEX IF NOT EXISTS idx_workbench_events_session_seq ON + workbench_events(session_id, event_seq); + + CREATE INDEX IF NOT EXISTS idx_workbench_events_type_seq ON + workbench_events(event_type, event_seq); + + + CREATE TABLE IF NOT EXISTS workbench_session_inputs ( + input_id TEXT PRIMARY KEY, + session_id TEXT NOT NULL, + turn_id TEXT, + trace_id TEXT, + message_id TEXT, + command_id TEXT, + delivery TEXT NOT NULL DEFAULT 'queue', + admitted_seq INTEGER NOT NULL DEFAULT 0, + promoted_seq INTEGER, + status TEXT NOT NULL DEFAULT 'admitted', + error_code TEXT, + source_event_id TEXT, + input_json TEXT NOT NULL DEFAULT '{}', + created_at TEXT NOT NULL, + updated_at TEXT NOT NULL + ); + + CREATE INDEX IF NOT EXISTS idx_workbench_session_inputs_session_seq ON + workbench_session_inputs(session_id, admitted_seq, input_id); + + CREATE INDEX IF NOT EXISTS idx_workbench_session_inputs_trace ON + workbench_session_inputs(trace_id, input_id); + + CREATE INDEX IF NOT EXISTS idx_workbench_session_inputs_command ON + workbench_session_inputs(command_id, input_id) WHERE command_id IS NOT + NULL; + + CREATE UNIQUE INDEX IF NOT EXISTS + idx_workbench_session_inputs_source_event ON + workbench_session_inputs(session_id, source_event_id) WHERE + source_event_id IS NOT NULL; + + + CREATE TABLE IF NOT EXISTS workbench_projection_checkpoints ( + trace_id TEXT PRIMARY KEY, + session_id TEXT, + turn_id TEXT, + run_id TEXT, + command_id TEXT, + projected_seq INTEGER NOT NULL DEFAULT 0, + source_seq INTEGER NOT NULL DEFAULT 0, + source_event_id TEXT, + projection_status TEXT NOT NULL DEFAULT 'projecting', + projection_health TEXT NOT NULL DEFAULT 'healthy', + terminal BOOLEAN NOT NULL DEFAULT false, + sealed BOOLEAN NOT NULL DEFAULT false, + diagnostic_json TEXT NOT NULL DEFAULT '{}', + checkpoint_json TEXT NOT NULL DEFAULT '{}', + created_at TEXT NOT NULL, + updated_at TEXT NOT NULL + ); + + CREATE INDEX IF NOT EXISTS + idx_workbench_projection_checkpoints_status_updated ON + workbench_projection_checkpoints(projection_status, updated_at DESC, + trace_id); + + CREATE INDEX IF NOT EXISTS + idx_workbench_projection_checkpoints_session_updated ON + workbench_projection_checkpoints(session_id, updated_at DESC, trace_id); + + + CREATE TABLE IF NOT EXISTS workbench_projection_outbox ( + outbox_seq BIGSERIAL PRIMARY KEY, + event_seq BIGINT, + aggregate_id TEXT, + aggregate_seq INTEGER NOT NULL DEFAULT 0, + projection_revision INTEGER NOT NULL DEFAULT 0, + trace_id TEXT NOT NULL, + session_id TEXT, + turn_id TEXT, + message_id TEXT, + projected_seq INTEGER NOT NULL DEFAULT 0, + source_seq INTEGER NOT NULL DEFAULT 0, + source_event_id TEXT, + commit_type TEXT NOT NULL DEFAULT 'event', + terminal BOOLEAN NOT NULL DEFAULT false, + sealed BOOLEAN NOT NULL DEFAULT false, + payload_json TEXT NOT NULL DEFAULT '{}', + created_at TEXT NOT NULL + ); + + ALTER TABLE workbench_projection_outbox ADD COLUMN IF NOT EXISTS + event_seq BIGINT; + + ALTER TABLE workbench_projection_outbox ADD COLUMN IF NOT EXISTS + aggregate_id TEXT; + + ALTER TABLE workbench_projection_outbox ADD COLUMN IF NOT EXISTS + aggregate_seq INTEGER NOT NULL DEFAULT 0; + + ALTER TABLE workbench_projection_outbox ADD COLUMN IF NOT EXISTS + projection_revision INTEGER NOT NULL DEFAULT 0; + + CREATE INDEX IF NOT EXISTS idx_workbench_projection_outbox_trace_seq ON + workbench_projection_outbox(trace_id, outbox_seq); + + CREATE INDEX IF NOT EXISTS idx_workbench_projection_outbox_session_seq + ON workbench_projection_outbox(session_id, outbox_seq); + + CREATE INDEX IF NOT EXISTS idx_workbench_projection_outbox_after_seq ON + workbench_projection_outbox(outbox_seq); + + CREATE INDEX IF NOT EXISTS idx_workbench_projection_outbox_event_seq ON + workbench_projection_outbox(event_seq) WHERE event_seq IS NOT NULL; + + + INSERT INTO workbench_sessions ( + session_id, + owner_user_id, + project_id, + conversation_id, + thread_id, + status, + last_trace_id, + projected_seq, + source_seq, + source_event_id, + terminal, + sealed, + session_json, + created_at, + updated_at + ) + + SELECT + id, + owner_user_id, + project_id, + conversation_id, + thread_id, + status, + last_trace_id, + 0, + 0, + id, + status IN ('completed', 'failed', 'canceled', 'cancelled', 'archived'), + status IN ('completed', 'failed', 'canceled', 'cancelled', 'archived') AND ended_at IS NOT NULL, + COALESCE(NULLIF(session_json, ''), '{}'), + COALESCE(started_at, updated_at, CURRENT_TIMESTAMP::text), + COALESCE(updated_at, ended_at, started_at, CURRENT_TIMESTAMP::text) + FROM agent_sessions + + WHERE id IS NOT NULL + + ON CONFLICT (session_id) DO NOTHING; + + + INSERT INTO workbench_trace_events ( + id, + trace_id, + session_id, + turn_id, + message_id, + source_seq, + source_event_id, + projected_seq, + event_type, + terminal, + sealed, + event_json, + occurred_at, + updated_at + ) + + SELECT + source_trace_events.id, + source_trace_events.trace_id, + source_trace_events.agent_session_id, + source_trace_events.trace_id, + NULL, + source_trace_events.durable_projection_seq, + source_trace_events.id, + source_trace_events.durable_projection_seq, + 'agent_trace_event', + false, + false, + COALESCE(NULLIF(source_trace_events.event_json, ''), '{}'), + source_trace_events.occurred_at, + source_trace_events.occurred_at + FROM ( + SELECT + agent_trace_events.*, + (ROW_NUMBER() OVER (PARTITION BY trace_id ORDER BY occurred_at, id))::integer AS durable_projection_seq + FROM agent_trace_events + WHERE id IS NOT NULL AND trace_id IS NOT NULL + ) AS source_trace_events + + ON CONFLICT DO NOTHING; + + + INSERT INTO workbench_turns ( + turn_id, + session_id, + trace_id, + message_id, + status, + projected_seq, + source_seq, + source_event_id, + terminal, + sealed, + final_response_json, + diagnostic_json, + turn_json, + created_at, + updated_at + ) + + SELECT + trace_id, + COALESCE(session_id, trace_id), + trace_id, + NULL, + projection_status, + last_projected_seq, + last_agentrun_seq, + trace_id || ':' || last_agentrun_seq::text, + projection_status IN ('caught_up', 'terminal'), + projection_status = 'terminal', + 'null', + COALESCE(NULLIF(projection_json, ''), '{}'), + COALESCE(NULLIF(projection_json, ''), '{}'), + COALESCE(created_at, updated_at, CURRENT_TIMESTAMP::text), + COALESCE(updated_at, created_at, CURRENT_TIMESTAMP::text) + FROM workbench_projection_state + + WHERE trace_id IS NOT NULL + + ON CONFLICT (turn_id) DO NOTHING; + + + INSERT INTO workbench_projection_checkpoints ( + trace_id, + session_id, + turn_id, + run_id, + command_id, + projected_seq, + source_seq, + source_event_id, + projection_status, + projection_health, + terminal, + sealed, + diagnostic_json, + checkpoint_json, + created_at, + updated_at + ) + + SELECT + trace_id, + session_id, + trace_id, + run_id, + command_id, + last_projected_seq, + last_agentrun_seq, + trace_id || ':' || last_agentrun_seq::text, + projection_status, + projection_health, + projection_status IN ('caught_up', 'terminal'), + projection_status = 'terminal', + COALESCE(NULLIF(projection_json, ''), '{}'), + COALESCE(NULLIF(projection_json, ''), '{}'), + COALESCE(created_at, updated_at, CURRENT_TIMESTAMP::text), + COALESCE(updated_at, created_at, CURRENT_TIMESTAMP::text) + FROM workbench_projection_state + + WHERE trace_id IS NOT NULL + + ON CONFLICT (trace_id) DO NOTHING; + + + CREATE TABLE IF NOT EXISTS evidence_records ( + id TEXT PRIMARY KEY, + project_id TEXT, + operation_id TEXT, + evidence_type TEXT NOT NULL, + uri TEXT NOT NULL DEFAULT '', + metadata_json TEXT NOT NULL DEFAULT '{}', + created_at TEXT NOT NULL + ); + + + CREATE TABLE IF NOT EXISTS hwlab_schema_migrations ( + id TEXT PRIMARY KEY, + schema_version TEXT NOT NULL, + applied_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP, + migration_json TEXT NOT NULL DEFAULT '{}' + ); + + + INSERT INTO hwlab_schema_migrations (id, schema_version, applied_at, + migration_json) + + VALUES ( + '0001_cloud_core_skeleton', + 'runtime-durable-postgres-v7', + CURRENT_TIMESTAMP, + '{"path":"internal/db/migrations/0001_cloud_core_skeleton.sql","runtime":"cloud-api"}' + ) + + ON CONFLICT (id) DO UPDATE SET + schema_version = EXCLUDED.schema_version, + migration_json = EXCLUDED.migration_json; + - apiVersion: v1 + kind: Service + metadata: + name: hwlab-v03-postgres + namespace: hwlab-v03 + labels: + app.kubernetes.io/name: hwlab-v03-postgres + app.kubernetes.io/part-of: hwlab + hwlab.pikastech.local/environment: v03 + hwlab.pikastech.local/gitops-target: v03 + hwlab.pikastech.local/profile: v03 + hwlab.pikastech.local/source-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + spec: + type: ClusterIP + selector: + app.kubernetes.io/name: hwlab-v03-postgres + ports: + - name: postgres + port: 5432 + targetPort: postgres + - apiVersion: apps/v1 + kind: StatefulSet + metadata: + name: hwlab-v03-postgres + namespace: hwlab-v03 + labels: + app.kubernetes.io/name: hwlab-v03-postgres + app.kubernetes.io/part-of: hwlab + hwlab.pikastech.local/environment: v03 + hwlab.pikastech.local/gitops-target: v03 + hwlab.pikastech.local/profile: v03 + hwlab.pikastech.local/source-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + spec: + serviceName: hwlab-v03-postgres + replicas: 1 + selector: + matchLabels: + app.kubernetes.io/name: hwlab-v03-postgres + template: + metadata: + labels: + app.kubernetes.io/name: hwlab-v03-postgres + app.kubernetes.io/part-of: hwlab + hwlab.pikastech.local/environment: v03 + hwlab.pikastech.local/gitops-target: v03 + hwlab.pikastech.local/profile: v03 + hwlab.pikastech.local/migration-sha256: 880f77326c6dd41a + annotations: + hwlab.pikastech.local/migration-sha256: 880f77326c6dd41a994931567da1d0372af0b3c3f8aef1e2f69e3d5ed4343274 + spec: + containers: + - name: postgres + image: 127.0.0.1:5000/hwlab/postgres:16-alpine + imagePullPolicy: IfNotPresent + env: + - name: POSTGRES_DB + value: hwlab_v03 + - name: POSTGRES_USER + value: hwlab_v03 + - name: POSTGRES_PASSWORD + valueFrom: + secretKeyRef: + name: hwlab-v03-postgres + key: POSTGRES_PASSWORD + ports: + - name: postgres + containerPort: 5432 + readinessProbe: + tcpSocket: + port: postgres + initialDelaySeconds: 5 + periodSeconds: 10 + livenessProbe: + tcpSocket: + port: postgres + initialDelaySeconds: 30 + periodSeconds: 20 + volumeMounts: + - name: data + mountPath: /var/lib/postgresql/data + - name: init + mountPath: /docker-entrypoint-initdb.d + readOnly: true + volumes: + - name: init + configMap: + name: hwlab-v03-postgres-init + volumeClaimTemplates: + - metadata: + name: data + spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 8Gi diff --git a/deploy/gitops/node/jd01/runtime-v03/services.yaml b/deploy/gitops/node/jd01/runtime-v03/services.yaml index b48c00d3..14c144c5 100644 --- a/deploy/gitops/node/jd01/runtime-v03/services.yaml +++ b/deploy/gitops/node/jd01/runtime-v03/services.yaml @@ -1,305 +1,208 @@ -{ - "apiVersion": "v1", - "kind": "List", - "items": [ - { - "apiVersion": "v1", - "kind": "Service", - "metadata": { - "name": "hwlab-cloud-api", - "namespace": "hwlab-v03", - "labels": { - "app.kubernetes.io/name": "hwlab-cloud-api", - "hwlab.pikastech.local/service-id": "hwlab-cloud-api", - "hwlab.pikastech.local/gitops-target": "v03", - "hwlab.pikastech.local/source-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f", - "hwlab.pikastech.local/environment": "v03", - "hwlab.pikastech.local/profile": "v03", - "hwlab.pikastech.local/monitoring": "enabled" - }, - "annotations": { - "hwlab.pikastech.local/rendered-by": "scripts/gitops-render.mjs" - } - }, - "spec": { - "type": "ClusterIP", - "selector": { - "app.kubernetes.io/name": "hwlab-cloud-api" - }, - "ports": [ - { - "name": "http", - "port": 6667, - "targetPort": "http" - }, - { - "name": "metrics", - "port": 9100, - "targetPort": "metrics" - } - ] - } - }, - { - "apiVersion": "v1", - "kind": "Service", - "metadata": { - "name": "hwlab-project-management", - "namespace": "hwlab-v03", - "labels": { - "app.kubernetes.io/name": "hwlab-project-management", - "hwlab.pikastech.local/service-id": "hwlab-project-management", - "hwlab.pikastech.local/gitops-target": "v03", - "hwlab.pikastech.local/source-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f", - "hwlab.pikastech.local/environment": "v03", - "hwlab.pikastech.local/profile": "v03", - "hwlab.pikastech.local/monitoring": "enabled" - }, - "annotations": { - "hwlab.pikastech.local/rendered-by": "scripts/gitops-render.mjs" - } - }, - "spec": { - "type": "ClusterIP", - "selector": { - "app.kubernetes.io/name": "hwlab-project-management" - }, - "ports": [ - { - "name": "http", - "port": 6672, - "targetPort": "http" - }, - { - "name": "metrics", - "port": 9100, - "targetPort": "metrics" - } - ] - } - }, - { - "apiVersion": "v1", - "kind": "Service", - "metadata": { - "name": "hwlab-workbench-runtime", - "namespace": "hwlab-v03", - "labels": { - "app.kubernetes.io/name": "hwlab-workbench-runtime", - "hwlab.pikastech.local/service-id": "hwlab-workbench-runtime", - "hwlab.pikastech.local/gitops-target": "v03", - "hwlab.pikastech.local/source-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f", - "hwlab.pikastech.local/environment": "v03", - "hwlab.pikastech.local/profile": "v03", - "hwlab.pikastech.local/monitoring": "enabled" - }, - "annotations": { - "hwlab.pikastech.local/rendered-by": "scripts/gitops-render.mjs" - } - }, - "spec": { - "type": "ClusterIP", - "selector": { - "app.kubernetes.io/name": "hwlab-workbench-runtime" - }, - "ports": [ - { - "name": "http", - "port": 6671, - "targetPort": "http" - }, - { - "name": "metrics", - "port": 9100, - "targetPort": "metrics" - } - ] - } - }, - { - "apiVersion": "v1", - "kind": "Service", - "metadata": { - "name": "hwlab-user-billing", - "namespace": "hwlab-v03", - "labels": { - "app.kubernetes.io/name": "hwlab-user-billing", - "hwlab.pikastech.local/service-id": "hwlab-user-billing", - "hwlab.pikastech.local/gitops-target": "v03", - "hwlab.pikastech.local/source-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f", - "hwlab.pikastech.local/environment": "v03", - "hwlab.pikastech.local/profile": "v03", - "hwlab.pikastech.local/monitoring": "enabled" - }, - "annotations": { - "hwlab.pikastech.local/rendered-by": "scripts/gitops-render.mjs" - } - }, - "spec": { - "type": "ClusterIP", - "selector": { - "app.kubernetes.io/name": "hwlab-user-billing" - }, - "ports": [ - { - "name": "http", - "port": 6670, - "targetPort": "http" - }, - { - "name": "metrics", - "port": 9100, - "targetPort": "metrics" - } - ] - } - }, - { - "apiVersion": "v1", - "kind": "Service", - "metadata": { - "name": "hwlab-cloud-web", - "namespace": "hwlab-v03", - "labels": { - "app.kubernetes.io/name": "hwlab-cloud-web", - "hwlab.pikastech.local/service-id": "hwlab-cloud-web", - "hwlab.pikastech.local/gitops-target": "v03", - "hwlab.pikastech.local/source-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f", - "hwlab.pikastech.local/environment": "v03", - "hwlab.pikastech.local/profile": "v03", - "hwlab.pikastech.local/monitoring": "enabled" - }, - "annotations": { - "hwlab.pikastech.local/rendered-by": "scripts/gitops-render.mjs" - } - }, - "spec": { - "type": "ClusterIP", - "selector": { - "app.kubernetes.io/name": "hwlab-cloud-web" - }, - "ports": [ - { - "name": "http", - "port": 8080, - "targetPort": "http" - }, - { - "name": "metrics", - "port": 9100, - "targetPort": "metrics" - } - ] - } - }, - { - "apiVersion": "v1", - "kind": "Service", - "metadata": { - "name": "hwlab-gateway", - "namespace": "hwlab-v03", - "labels": { - "app.kubernetes.io/name": "hwlab-gateway", - "hwlab.pikastech.local/service-id": "hwlab-gateway", - "hwlab.pikastech.local/activation": "manual", - "hwlab.pikastech.local/gitops-target": "v03", - "hwlab.pikastech.local/source-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f", - "hwlab.pikastech.local/environment": "v03", - "hwlab.pikastech.local/profile": "v03" - }, - "annotations": { - "hwlab.pikastech.local/rendered-by": "scripts/gitops-render.mjs" - } - }, - "spec": { - "type": "ClusterIP", - "selector": { - "app.kubernetes.io/name": "hwlab-gateway" - }, - "ports": [ - { - "name": "http", - "port": 7001, - "targetPort": "http" - } - ] - } - }, - { - "apiVersion": "v1", - "kind": "Service", - "metadata": { - "name": "hwlab-agent-skills", - "namespace": "hwlab-v03", - "labels": { - "app.kubernetes.io/name": "hwlab-agent-skills", - "hwlab.pikastech.local/service-id": "hwlab-agent-skills", - "hwlab.pikastech.local/gitops-target": "v03", - "hwlab.pikastech.local/source-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f", - "hwlab.pikastech.local/environment": "v03", - "hwlab.pikastech.local/profile": "v03", - "hwlab.pikastech.local/monitoring": "enabled" - }, - "annotations": { - "hwlab.pikastech.local/rendered-by": "scripts/gitops-render.mjs" - } - }, - "spec": { - "type": "ClusterIP", - "selector": { - "app.kubernetes.io/name": "hwlab-agent-skills" - }, - "ports": [ - { - "name": "http", - "port": 7430, - "targetPort": "http" - }, - { - "name": "metrics", - "port": 9100, - "targetPort": "metrics" - } - ] - } - }, - { - "apiVersion": "v1", - "kind": "Service", - "metadata": { - "name": "hwlab-edge-proxy", - "namespace": "hwlab-v03", - "labels": { - "app.kubernetes.io/name": "hwlab-edge-proxy", - "hwlab.pikastech.local/service-id": "hwlab-edge-proxy", - "hwlab.pikastech.local/gitops-target": "v03", - "hwlab.pikastech.local/source-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f", - "hwlab.pikastech.local/environment": "v03", - "hwlab.pikastech.local/profile": "v03", - "hwlab.pikastech.local/monitoring": "enabled" - }, - "annotations": { - "hwlab.pikastech.local/rendered-by": "scripts/gitops-render.mjs" - } - }, - "spec": { - "type": "ClusterIP", - "selector": { - "app.kubernetes.io/name": "hwlab-edge-proxy" - }, - "ports": [ - { - "name": "http", - "port": 6667, - "targetPort": "http" - }, - { - "name": "metrics", - "port": 9100, - "targetPort": "metrics" - } - ] - } - } - ] -} +apiVersion: v1 +kind: List +items: + - apiVersion: v1 + kind: Service + metadata: + name: hwlab-cloud-api + namespace: hwlab-v03 + labels: + app.kubernetes.io/name: hwlab-cloud-api + hwlab.pikastech.local/service-id: hwlab-cloud-api + hwlab.pikastech.local/gitops-target: v03 + hwlab.pikastech.local/source-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + hwlab.pikastech.local/environment: v03 + hwlab.pikastech.local/profile: v03 + hwlab.pikastech.local/monitoring: disabled + annotations: + hwlab.pikastech.local/rendered-by: scripts/gitops-render.mjs + spec: + type: ClusterIP + selector: + app.kubernetes.io/name: hwlab-cloud-api + ports: + - name: http + port: 6667 + targetPort: http + - name: metrics + port: 9100 + targetPort: metrics + - apiVersion: v1 + kind: Service + metadata: + name: hwlab-project-management + namespace: hwlab-v03 + labels: + app.kubernetes.io/name: hwlab-project-management + hwlab.pikastech.local/service-id: hwlab-project-management + hwlab.pikastech.local/gitops-target: v03 + hwlab.pikastech.local/source-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + hwlab.pikastech.local/environment: v03 + hwlab.pikastech.local/profile: v03 + hwlab.pikastech.local/monitoring: disabled + annotations: + hwlab.pikastech.local/rendered-by: scripts/gitops-render.mjs + spec: + type: ClusterIP + selector: + app.kubernetes.io/name: hwlab-project-management + ports: + - name: http + port: 6672 + targetPort: http + - name: metrics + port: 9100 + targetPort: metrics + - apiVersion: v1 + kind: Service + metadata: + name: hwlab-workbench-runtime + namespace: hwlab-v03 + labels: + app.kubernetes.io/name: hwlab-workbench-runtime + hwlab.pikastech.local/service-id: hwlab-workbench-runtime + hwlab.pikastech.local/gitops-target: v03 + hwlab.pikastech.local/source-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + hwlab.pikastech.local/environment: v03 + hwlab.pikastech.local/profile: v03 + hwlab.pikastech.local/monitoring: disabled + annotations: + hwlab.pikastech.local/rendered-by: scripts/gitops-render.mjs + spec: + type: ClusterIP + selector: + app.kubernetes.io/name: hwlab-workbench-runtime + ports: + - name: http + port: 6671 + targetPort: http + - name: metrics + port: 9100 + targetPort: metrics + - apiVersion: v1 + kind: Service + metadata: + name: hwlab-user-billing + namespace: hwlab-v03 + labels: + app.kubernetes.io/name: hwlab-user-billing + hwlab.pikastech.local/service-id: hwlab-user-billing + hwlab.pikastech.local/gitops-target: v03 + hwlab.pikastech.local/source-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + hwlab.pikastech.local/environment: v03 + hwlab.pikastech.local/profile: v03 + hwlab.pikastech.local/monitoring: disabled + annotations: + hwlab.pikastech.local/rendered-by: scripts/gitops-render.mjs + spec: + type: ClusterIP + selector: + app.kubernetes.io/name: hwlab-user-billing + ports: + - name: http + port: 6670 + targetPort: http + - name: metrics + port: 9100 + targetPort: metrics + - apiVersion: v1 + kind: Service + metadata: + name: hwlab-cloud-web + namespace: hwlab-v03 + labels: + app.kubernetes.io/name: hwlab-cloud-web + hwlab.pikastech.local/service-id: hwlab-cloud-web + hwlab.pikastech.local/gitops-target: v03 + hwlab.pikastech.local/source-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + hwlab.pikastech.local/environment: v03 + hwlab.pikastech.local/profile: v03 + hwlab.pikastech.local/monitoring: disabled + annotations: + hwlab.pikastech.local/rendered-by: scripts/gitops-render.mjs + spec: + type: ClusterIP + selector: + app.kubernetes.io/name: hwlab-cloud-web + ports: + - name: http + port: 8080 + targetPort: http + - name: metrics + port: 9100 + targetPort: metrics + - apiVersion: v1 + kind: Service + metadata: + name: hwlab-gateway + namespace: hwlab-v03 + labels: + app.kubernetes.io/name: hwlab-gateway + hwlab.pikastech.local/service-id: hwlab-gateway + hwlab.pikastech.local/activation: manual + hwlab.pikastech.local/gitops-target: v03 + hwlab.pikastech.local/source-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + hwlab.pikastech.local/environment: v03 + hwlab.pikastech.local/profile: v03 + annotations: + hwlab.pikastech.local/rendered-by: scripts/gitops-render.mjs + spec: + type: ClusterIP + selector: + app.kubernetes.io/name: hwlab-gateway + ports: + - name: http + port: 7001 + targetPort: http + - apiVersion: v1 + kind: Service + metadata: + name: hwlab-agent-skills + namespace: hwlab-v03 + labels: + app.kubernetes.io/name: hwlab-agent-skills + hwlab.pikastech.local/service-id: hwlab-agent-skills + hwlab.pikastech.local/gitops-target: v03 + hwlab.pikastech.local/source-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + hwlab.pikastech.local/environment: v03 + hwlab.pikastech.local/profile: v03 + hwlab.pikastech.local/monitoring: disabled + annotations: + hwlab.pikastech.local/rendered-by: scripts/gitops-render.mjs + spec: + type: ClusterIP + selector: + app.kubernetes.io/name: hwlab-agent-skills + ports: + - name: http + port: 7430 + targetPort: http + - name: metrics + port: 9100 + targetPort: metrics + - apiVersion: v1 + kind: Service + metadata: + name: hwlab-edge-proxy + namespace: hwlab-v03 + labels: + app.kubernetes.io/name: hwlab-edge-proxy + hwlab.pikastech.local/service-id: hwlab-edge-proxy + hwlab.pikastech.local/gitops-target: v03 + hwlab.pikastech.local/source-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + hwlab.pikastech.local/environment: v03 + hwlab.pikastech.local/profile: v03 + hwlab.pikastech.local/monitoring: disabled + annotations: + hwlab.pikastech.local/rendered-by: scripts/gitops-render.mjs + spec: + type: ClusterIP + selector: + app.kubernetes.io/name: hwlab-edge-proxy + ports: + - name: http + port: 6667 + targetPort: http + - name: metrics + port: 9100 + targetPort: metrics diff --git a/deploy/gitops/node/jd01/runtime-v03/workloads.yaml b/deploy/gitops/node/jd01/runtime-v03/workloads.yaml index 69ceeb06..1fbc4d80 100644 --- a/deploy/gitops/node/jd01/runtime-v03/workloads.yaml +++ b/deploy/gitops/node/jd01/runtime-v03/workloads.yaml @@ -1,3450 +1,1768 @@ -{ - "apiVersion": "v1", - "kind": "List", - "items": [ - { - "apiVersion": "v1", - "kind": "PersistentVolumeClaim", - "metadata": { - "labels": { - "app.kubernetes.io/name": "hwlab-user-skills", - "hwlab.pikastech.local/service-id": "hwlab-user-skills", - "app.kubernetes.io/part-of": "hwlab", - "hwlab.pikastech.local/environment": "v03", - "hwlab.pikastech.local/profile": "v03", - "hwlab.pikastech.local/gitops-target": "v03", - "hwlab.pikastech.local/gitops-render-source-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f", - "hwlab.pikastech.local/source-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f", - "unidesk.ai/node-staging": "false" - }, - "name": "hwlab-user-skills", - "namespace": "hwlab-v03", - "annotations": { - "hwlab.pikastech.local/gitops-note": "node DEV GitOps target.", - "hwlab.pikastech.local/gitops-render-source-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f", - "hwlab.pikastech.local/source-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f" - } - }, - "spec": { - "accessModes": [ - "ReadWriteOnce" - ], - "resources": { - "requests": { - "storage": "2Gi" - } - } - } - }, - { - "apiVersion": "apps/v1", - "kind": "Deployment", - "metadata": { - "name": "hwlab-project-management", - "namespace": "hwlab-v03", - "labels": { - "app.kubernetes.io/name": "hwlab-project-management", - "hwlab.pikastech.local/service-id": "hwlab-project-management", - "app.kubernetes.io/part-of": "hwlab", - "hwlab.pikastech.local/environment": "v03", - "hwlab.pikastech.local/profile": "v03", - "hwlab.pikastech.local/gitops-target": "v03", - "hwlab.pikastech.local/gitops-render-source-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f", - "hwlab.pikastech.local/source-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f", - "unidesk.ai/node-staging": "false", - "hwlab.pikastech.local/monitoring": "enabled" - }, - "annotations": { - "hwlab.pikastech.local/gitops-note": "node DEV GitOps target.", - "hwlab.pikastech.local/gitops-render-source-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f", - "hwlab.pikastech.local/source-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f" - } - }, - "spec": { - "replicas": 1, - "selector": { - "matchLabels": { - "app.kubernetes.io/name": "hwlab-project-management", - "app.kubernetes.io/part-of": "hwlab", - "hwlab.pikastech.local/environment": "v03", - "hwlab.pikastech.local/profile": "v03" - } - }, - "template": { - "metadata": { - "labels": { - "app.kubernetes.io/name": "hwlab-project-management", - "hwlab.pikastech.local/service-id": "hwlab-project-management", - "app.kubernetes.io/part-of": "hwlab", - "hwlab.pikastech.local/environment": "v03", - "hwlab.pikastech.local/profile": "v03", - "hwlab.pikastech.local/gitops-target": "v03", - "hwlab.pikastech.local/gitops-render-source-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f", - "hwlab.pikastech.local/source-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f", - "hwlab.pikastech.local/artifact-source-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f", - "hwlab.pikastech.local/monitoring": "enabled", - "hwlab.pikastech.local/runtime-mode": "env-reuse-git-mirror-checkout", - "hwlab.pikastech.local/boot-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f" - }, - "annotations": { - "hwlab.pikastech.local/metrics-sidecar-sha256": "782e26256b5a5cddff52a165a0eb5f852973eee1aac1b19acac4a313db7968f4", - "hwlab.pikastech.local/gitops-render-source-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f", - "hwlab.pikastech.local/source-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f", - "hwlab.pikastech.local/artifact-source-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f", - "hwlab.pikastech.local/rendered-by": "scripts/gitops-render.mjs", - "hwlab.pikastech.local/runtime-mode": "env-reuse-git-mirror-checkout", - "hwlab.pikastech.local/boot-repo": "git@github.com:pikasTech/HWLAB.git", - "hwlab.pikastech.local/boot-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f", - "hwlab.pikastech.local/boot-sh": "deploy/runtime/boot/hwlab-project-management.sh", - "hwlab.pikastech.local/environment-digest": "sha256:c638efb6f3559e015da9fea0870a0c5cd8603622820045742e710d33e10e9fdf", - "hwlab.pikastech.local/environment-input-hash": "f5109d26020b05d9023ab1a6dd4e34ed07c9bbca03fc8d0a4697cc208c85a175", - "hwlab.pikastech.local/code-input-hash": "4cbd4e24c3020037d215271ed248ac38d5a1c385855443ffe5c112b1a04118f6" - } - }, - "spec": { - "containers": [ - { - "name": "hwlab-project-management", - "image": "127.0.0.1:5000/hwlab/hwlab-project-management-env@sha256:c638efb6f3559e015da9fea0870a0c5cd8603622820045742e710d33e10e9fdf", - "ports": [ - { - "name": "http", - "containerPort": 6672 - } - ], - "env": [ - { - "name": "HWLAB_PROJECT_MANAGEMENT_PORT", - "value": "6672" - }, - { - "name": "TZ", - "value": "Asia/Shanghai" - }, - { - "name": "HWLAB_PROJECT_MANAGEMENT_DB_URL", - "valueFrom": { - "secretKeyRef": { - "name": "hwlab-cloud-api-v03-db", - "key": "database-url", - "optional": true - } - } - }, - { - "name": "HWLAB_PROJECT_MANAGEMENT_DB_CONNECT_TIMEOUT_MS", - "value": "5000" - }, - { - "name": "HWLAB_PROJECT_MANAGEMENT_SOURCE_ROOT", - "value": "/workspace/hwlab-boot/repo" - }, - { - "name": "HWLAB_PROJECT_MANAGEMENT_SOURCE_ID", - "value": "hwlab-v03-mdtodo" - }, - { - "name": "HWLAB_PROJECT_MANAGEMENT_SOURCE_NAME", - "value": "HWLAB v0.3 MDTODO" - }, - { - "name": "HWLAB_PROJECT_MANAGEMENT_PROJECT_ID", - "value": "project_hwlab_v03" - }, - { - "name": "HWLAB_PROJECT_MANAGEMENT_MDTODO_TASK_DEFAULT_LIMIT", - "value": "200" - }, - { - "name": "HWLAB_PROJECT_MANAGEMENT_MDTODO_TASK_MAX_LIMIT", - "value": "500" - }, - { - "name": "HWLAB_PROJECT_MANAGEMENT_HWPOD_NODE_OPS_URL", - "value": "http://hwlab-cloud-api.hwlab-v03.svc.cluster.local:6667/v1/hwpod-node-ops" - }, - { - "name": "HWLAB_PROJECT_MANAGEMENT_HWPOD_NODE_OPS_API_KEY", - "valueFrom": { - "secretKeyRef": { - "name": "hwlab-v03-master-server-admin-api-key", - "key": "api-key", - "optional": true - } - } - }, - { - "name": "HWLAB_PROJECT_MANAGEMENT_BOOTSTRAP_SOURCES_PATH", - "value": "/etc/hwlab/project-management/sources.json" - }, - { - "name": "OTEL_EXPORTER_OTLP_TRACES_ENDPOINT", - "value": "http://otel-collector.platform-infra.svc.cluster.local:4318/v1/traces" - }, - { - "name": "OTEL_SERVICE_NAME", - "value": "hwlab-project-management" - }, - { - "name": "HWLAB_ENVIRONMENT", - "value": "v03" - }, - { - "name": "HWLAB_COMMIT_ID", - "value": "effbb79199d1117de0634904cdb019c5c0b0ee9f" - }, - { - "name": "HWLAB_IMAGE", - "value": "127.0.0.1:5000/hwlab/hwlab-project-management-env@sha256:c638efb6f3559e015da9fea0870a0c5cd8603622820045742e710d33e10e9fdf" - }, - { - "name": "HWLAB_IMAGE_TAG", - "value": "env-f5109d26020b" - }, - { - "name": "HWLAB_GITOPS_TARGET", - "value": "v03" - }, - { - "name": "HWLAB_GITOPS_PROFILE", - "value": "v03" - }, - { - "name": "HWLAB_GITOPS_SOURCE_COMMIT", - "value": "effbb79199d1117de0634904cdb019c5c0b0ee9f" - }, - { - "name": "HWLAB_RUNTIME_MODE", - "value": "env-reuse-git-mirror-checkout" - }, - { - "name": "HWLAB_BOOT_REPO", - "value": "git@github.com:pikasTech/HWLAB.git" - }, - { - "name": "HWLAB_BOOT_COMMIT", - "value": "effbb79199d1117de0634904cdb019c5c0b0ee9f" - }, - { - "name": "HWLAB_BOOT_REF", - "value": "v0.3" - }, - { - "name": "HWLAB_BOOT_SH", - "value": "deploy/runtime/boot/hwlab-project-management.sh" - }, - { - "name": "HWLAB_BOOT_READ_URL", - "value": "http://git-mirror-http.devops-infra.svc.cluster.local/pikasTech/HWLAB.git" - }, - { - "name": "HWLAB_ENVIRONMENT_IMAGE", - "value": "127.0.0.1:5000/hwlab/hwlab-project-management-env:env-f5109d26020b" - }, - { - "name": "HWLAB_ENVIRONMENT_DIGEST", - "value": "sha256:c638efb6f3559e015da9fea0870a0c5cd8603622820045742e710d33e10e9fdf" - }, - { - "name": "HWLAB_ENVIRONMENT_INPUT_HASH", - "value": "f5109d26020b05d9023ab1a6dd4e34ed07c9bbca03fc8d0a4697cc208c85a175" - }, - { - "name": "HWLAB_CODE_INPUT_HASH", - "value": "4cbd4e24c3020037d215271ed248ac38d5a1c385855443ffe5c112b1a04118f6" - }, - { - "name": "HWLAB_IMAGE_DIGEST", - "value": "sha256:c638efb6f3559e015da9fea0870a0c5cd8603622820045742e710d33e10e9fdf" - } - ], - "readinessProbe": { - "httpGet": { - "path": "/health/ready", - "port": "http" - }, - "timeoutSeconds": 10, - "failureThreshold": 5 - }, - "livenessProbe": { - "httpGet": { - "path": "/health/live", - "port": "http" - }, - "timeoutSeconds": 5, - "failureThreshold": 6 - }, - "imagePullPolicy": "IfNotPresent", - "volumeMounts": [ - { - "name": "project-management-bootstrap", - "mountPath": "/etc/hwlab/project-management", - "readOnly": true - } - ], - "startupProbe": { - "httpGet": { - "path": "/health/ready", - "port": "http" - }, - "periodSeconds": 10, - "timeoutSeconds": 10, - "failureThreshold": 30, - "successThreshold": 1 - } - }, - { - "name": "hwlab-metrics", - "image": "127.0.0.1:5000/hwlab/hwlab-ci-node-tools:node22-alpine-bun-v1", - "imagePullPolicy": "IfNotPresent", - "command": [ - "node", - "/metrics/metrics-sidecar.mjs" - ], - "env": [ - { - "name": "HWLAB_METRICS_SERVICE_ID", - "value": "hwlab-project-management" - }, - { - "name": "HWLAB_METRICS_NAMESPACE", - "value": "hwlab-v03" - }, - { - "name": "HWLAB_METRICS_GITOPS_TARGET", - "value": "v03" - }, - { - "name": "HWLAB_METRICS_PORT", - "value": "9100" - }, - { - "name": "HWLAB_METRICS_TARGET_URL", - "value": "http://127.0.0.1:6672/health/ready" - }, - { - "name": "HWLAB_METRICS_TARGET_TIMEOUT_MS", - "value": "2000" - } - ], - "ports": [ - { - "name": "metrics", - "containerPort": 9100 - } - ], - "readinessProbe": { - "httpGet": { - "path": "/health/live", - "port": "metrics" - }, - "initialDelaySeconds": 3, - "periodSeconds": 10 - }, - "livenessProbe": { - "httpGet": { - "path": "/health/live", - "port": "metrics" - }, - "initialDelaySeconds": 10, - "periodSeconds": 20 - }, - "volumeMounts": [ - { - "name": "hwlab-metrics-sidecar", - "mountPath": "/metrics", - "readOnly": true - } - ] - } - ], - "volumes": [ - { - "name": "hwlab-metrics-sidecar", - "configMap": { - "name": "hwlab-v03-metrics-sidecar" - } - }, - { - "name": "project-management-bootstrap", - "configMap": { - "name": "hwlab-v03-project-management-bootstrap" - } - } - ] - } - } - } - }, - { - "apiVersion": "apps/v1", - "kind": "Deployment", - "metadata": { - "name": "hwlab-workbench-runtime", - "namespace": "hwlab-v03", - "labels": { - "app.kubernetes.io/name": "hwlab-workbench-runtime", - "hwlab.pikastech.local/service-id": "hwlab-workbench-runtime", - "app.kubernetes.io/part-of": "hwlab", - "hwlab.pikastech.local/environment": "v03", - "hwlab.pikastech.local/profile": "v03", - "hwlab.pikastech.local/gitops-target": "v03", - "hwlab.pikastech.local/gitops-render-source-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f", - "hwlab.pikastech.local/source-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f", - "unidesk.ai/node-staging": "false", - "hwlab.pikastech.local/monitoring": "enabled" - }, - "annotations": { - "hwlab.pikastech.local/gitops-note": "node DEV GitOps target.", - "hwlab.pikastech.local/gitops-render-source-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f", - "hwlab.pikastech.local/source-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f" - } - }, - "spec": { - "replicas": 1, - "selector": { - "matchLabels": { - "app.kubernetes.io/name": "hwlab-workbench-runtime", - "app.kubernetes.io/part-of": "hwlab", - "hwlab.pikastech.local/environment": "v03", - "hwlab.pikastech.local/profile": "v03" - } - }, - "template": { - "metadata": { - "labels": { - "app.kubernetes.io/name": "hwlab-workbench-runtime", - "hwlab.pikastech.local/service-id": "hwlab-workbench-runtime", - "app.kubernetes.io/part-of": "hwlab", - "hwlab.pikastech.local/environment": "v03", - "hwlab.pikastech.local/profile": "v03", - "hwlab.pikastech.local/gitops-target": "v03", - "hwlab.pikastech.local/gitops-render-source-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f", - "hwlab.pikastech.local/source-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f", - "hwlab.pikastech.local/artifact-source-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f", - "hwlab.pikastech.local/monitoring": "enabled", - "hwlab.pikastech.local/runtime-mode": "env-reuse-git-mirror-checkout", - "hwlab.pikastech.local/boot-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f" - }, - "annotations": { - "hwlab.pikastech.local/metrics-sidecar-sha256": "782e26256b5a5cddff52a165a0eb5f852973eee1aac1b19acac4a313db7968f4", - "hwlab.pikastech.local/gitops-render-source-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f", - "hwlab.pikastech.local/source-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f", - "hwlab.pikastech.local/artifact-source-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f", - "hwlab.pikastech.local/rendered-by": "scripts/gitops-render.mjs", - "hwlab.pikastech.local/runtime-mode": "env-reuse-git-mirror-checkout", - "hwlab.pikastech.local/boot-repo": "git@github.com:pikasTech/HWLAB.git", - "hwlab.pikastech.local/boot-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f", - "hwlab.pikastech.local/boot-sh": "deploy/runtime/boot/hwlab-workbench-runtime.sh", - "hwlab.pikastech.local/environment-digest": "sha256:6627afec4c746d85a6499d594552775936bd09a9a4cef5adf643c187eb03aa10", - "hwlab.pikastech.local/environment-input-hash": "9c9feb03b74fe5946ca36a3c8d264ab6cebc51bf0986c1c4bc0bc2b6d5ecaca7", - "hwlab.pikastech.local/code-input-hash": "2db125ce4bebccf3c3e95b50291559144cf647eb905628d59ebebc17c65e2c8b" - } - }, - "spec": { - "containers": [ - { - "name": "hwlab-workbench-runtime", - "image": "127.0.0.1:5000/hwlab/hwlab-workbench-runtime-env@sha256:6627afec4c746d85a6499d594552775936bd09a9a4cef5adf643c187eb03aa10", - "ports": [ - { - "name": "http", - "containerPort": 6671 - } - ], - "env": [ - { - "name": "HWLAB_WORKBENCH_RUNTIME_PORT", - "value": "6671" - }, - { - "name": "TZ", - "value": "Asia/Shanghai" - }, - { - "name": "HWLAB_WORKBENCH_SESSIONS_SUMMARY_QUERY_MAX_ATTEMPTS", - "value": "1" - }, - { - "name": "HWLAB_WORKBENCH_SESSIONS_SUMMARY_QUERY_ATTEMPT_TIMEOUT_MS", - "value": "10000" - }, - { - "name": "HWLAB_WORKBENCH_SESSIONS_SUMMARY_QUERY_BACKOFF_MS", - "value": "0" - }, - { - "name": "HWLAB_WORKBENCH_RUNTIME_DB_POOL_MAX", - "value": "16" - }, - { - "name": "HWLAB_WORKBENCH_RUNTIME_QUERY_TIMEOUT_MS", - "value": "10000" - }, - { - "name": "HWLAB_WORKBENCH_RUNTIME_READY_TIMEOUT_MS", - "value": "10000" - }, - { - "name": "HWLAB_WORKBENCH_CACHE_REDIS_ENABLED", - "value": "1" - }, - { - "name": "HWLAB_WORKBENCH_CACHE_REDIS_NAMESPACE", - "value": "hwlab-v03" - }, - { - "name": "HWLAB_WORKBENCH_CACHE_REDIS_SERVICE_NAME", - "value": "hwlab-workbench-redis" - }, - { - "name": "HWLAB_WORKBENCH_CACHE_REDIS_PORT", - "value": "6379" - }, - { - "name": "HWLAB_WORKBENCH_CACHE_REDIS_URL", - "value": "redis://hwlab-workbench-redis.hwlab-v03.svc.cluster.local:6379/0" - }, - { - "name": "HWLAB_WORKBENCH_CACHE_REDIS_TTL_SESSIONS_SUMMARY_MS", - "value": "30000" - }, - { - "name": "HWLAB_WORKBENCH_CACHE_REDIS_TTL_TERMINAL_TURN_MS", - "value": "300000" - }, - { - "name": "HWLAB_WORKBENCH_CACHE_REDIS_TTL_TERMINAL_TRACE_PAGE_MS", - "value": "300000" - }, - { - "name": "HWLAB_WORKBENCH_CACHE_REDIS_TTL_RUNNING_PAGE_MS", - "value": "5000" - }, - { - "name": "HWLAB_WORKBENCH_CACHE_REDIS_MAX_KEY_BYTES", - "value": "512" - }, - { - "name": "HWLAB_WORKBENCH_CACHE_REDIS_MAX_PAYLOAD_BYTES", - "value": "262144" - }, - { - "name": "HWLAB_WORKBENCH_CACHE_REDIS_CONNECT_TIMEOUT_MS", - "value": "200" - }, - { - "name": "HWLAB_WORKBENCH_CACHE_REDIS_OPERATION_TIMEOUT_MS", - "value": "100" - }, - { - "name": "HWLAB_WORKBENCH_CACHE_REDIS_METRICS_LABELS", - "value": "{\"lane\":\"v03\",\"service\":\"hwlab-workbench-runtime\",\"cacheKeyClass\":\"workbench-derived-read\"}" - }, - { - "name": "HWLAB_WORKBENCH_CACHE_REDIS_UNAVAILABLE_LIVENESS_FAILURE", - "value": "0" - }, - { - "name": "HWLAB_WORKBENCH_CACHE_REDIS_UNAVAILABLE_READ_MODE", - "value": "db-or-degraded" - }, - { - "name": "HWLAB_WORKBENCH_CACHE_REDIS_UNAVAILABLE_FALLBACK_STATE_SOURCE", - "value": "0" - }, - { - "name": "HWLAB_WORKBENCH_RUNTIME_DB_URL", - "valueFrom": { - "secretKeyRef": { - "name": "hwlab-cloud-api-v03-db", - "key": "database-url", - "optional": true - } - } - }, - { - "name": "OTEL_EXPORTER_OTLP_TRACES_ENDPOINT", - "value": "http://otel-collector.platform-infra.svc.cluster.local:4318/v1/traces" - }, - { - "name": "OTEL_SERVICE_NAME", - "value": "hwlab-workbench-runtime" - }, - { - "name": "HWLAB_ENVIRONMENT", - "value": "v03" - }, - { - "name": "HWLAB_COMMIT_ID", - "value": "effbb79199d1117de0634904cdb019c5c0b0ee9f" - }, - { - "name": "HWLAB_IMAGE", - "value": "127.0.0.1:5000/hwlab/hwlab-workbench-runtime-env@sha256:6627afec4c746d85a6499d594552775936bd09a9a4cef5adf643c187eb03aa10" - }, - { - "name": "HWLAB_IMAGE_TAG", - "value": "env-9c9feb03b74f" - }, - { - "name": "HWLAB_GITOPS_TARGET", - "value": "v03" - }, - { - "name": "HWLAB_GITOPS_PROFILE", - "value": "v03" - }, - { - "name": "HWLAB_GITOPS_SOURCE_COMMIT", - "value": "effbb79199d1117de0634904cdb019c5c0b0ee9f" - }, - { - "name": "HWLAB_RUNTIME_MODE", - "value": "env-reuse-git-mirror-checkout" - }, - { - "name": "HWLAB_BOOT_REPO", - "value": "git@github.com:pikasTech/HWLAB.git" - }, - { - "name": "HWLAB_BOOT_COMMIT", - "value": "effbb79199d1117de0634904cdb019c5c0b0ee9f" - }, - { - "name": "HWLAB_BOOT_REF", - "value": "v0.3" - }, - { - "name": "HWLAB_BOOT_SH", - "value": "deploy/runtime/boot/hwlab-workbench-runtime.sh" - }, - { - "name": "HWLAB_BOOT_READ_URL", - "value": "http://git-mirror-http.devops-infra.svc.cluster.local/pikasTech/HWLAB.git" - }, - { - "name": "HWLAB_ENVIRONMENT_IMAGE", - "value": "127.0.0.1:5000/hwlab/hwlab-workbench-runtime-env:env-9c9feb03b74f" - }, - { - "name": "HWLAB_ENVIRONMENT_DIGEST", - "value": "sha256:6627afec4c746d85a6499d594552775936bd09a9a4cef5adf643c187eb03aa10" - }, - { - "name": "HWLAB_ENVIRONMENT_INPUT_HASH", - "value": "9c9feb03b74fe5946ca36a3c8d264ab6cebc51bf0986c1c4bc0bc2b6d5ecaca7" - }, - { - "name": "HWLAB_CODE_INPUT_HASH", - "value": "2db125ce4bebccf3c3e95b50291559144cf647eb905628d59ebebc17c65e2c8b" - }, - { - "name": "HWLAB_IMAGE_DIGEST", - "value": "sha256:6627afec4c746d85a6499d594552775936bd09a9a4cef5adf643c187eb03aa10" - } - ], - "readinessProbe": { - "httpGet": { - "path": "/health/ready", - "port": "http" - }, - "timeoutSeconds": 10, - "failureThreshold": 5 - }, - "livenessProbe": { - "httpGet": { - "path": "/health/live", - "port": "http" - }, - "timeoutSeconds": 5, - "failureThreshold": 6 - }, - "imagePullPolicy": "IfNotPresent", - "startupProbe": { - "httpGet": { - "path": "/health/ready", - "port": "http" - }, - "periodSeconds": 10, - "timeoutSeconds": 10, - "failureThreshold": 30, - "successThreshold": 1 - } - }, - { - "name": "hwlab-metrics", - "image": "127.0.0.1:5000/hwlab/hwlab-ci-node-tools:node22-alpine-bun-v1", - "imagePullPolicy": "IfNotPresent", - "command": [ - "node", - "/metrics/metrics-sidecar.mjs" - ], - "env": [ - { - "name": "HWLAB_METRICS_SERVICE_ID", - "value": "hwlab-workbench-runtime" - }, - { - "name": "HWLAB_METRICS_NAMESPACE", - "value": "hwlab-v03" - }, - { - "name": "HWLAB_METRICS_GITOPS_TARGET", - "value": "v03" - }, - { - "name": "HWLAB_METRICS_PORT", - "value": "9100" - }, - { - "name": "HWLAB_METRICS_TARGET_URL", - "value": "http://127.0.0.1:6671/health/ready" - }, - { - "name": "HWLAB_METRICS_TARGET_TIMEOUT_MS", - "value": "2000" - } - ], - "ports": [ - { - "name": "metrics", - "containerPort": 9100 - } - ], - "readinessProbe": { - "httpGet": { - "path": "/health/live", - "port": "metrics" - }, - "initialDelaySeconds": 3, - "periodSeconds": 10 - }, - "livenessProbe": { - "httpGet": { - "path": "/health/live", - "port": "metrics" - }, - "initialDelaySeconds": 10, - "periodSeconds": 20 - }, - "volumeMounts": [ - { - "name": "hwlab-metrics-sidecar", - "mountPath": "/metrics", - "readOnly": true - } - ] - } - ], - "volumes": [ - { - "name": "hwlab-metrics-sidecar", - "configMap": { - "name": "hwlab-v03-metrics-sidecar" - } - } - ] - } - } - } - }, - { - "apiVersion": "apps/v1", - "kind": "Deployment", - "metadata": { - "name": "hwlab-cloud-api", - "namespace": "hwlab-v03", - "labels": { - "app.kubernetes.io/name": "hwlab-cloud-api", - "hwlab.pikastech.local/service-id": "hwlab-cloud-api", - "app.kubernetes.io/part-of": "hwlab", - "hwlab.pikastech.local/environment": "v03", - "hwlab.pikastech.local/profile": "v03", - "hwlab.pikastech.local/gitops-target": "v03", - "hwlab.pikastech.local/gitops-render-source-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f", - "hwlab.pikastech.local/source-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f", - "unidesk.ai/node-staging": "false", - "hwlab.pikastech.local/monitoring": "enabled" - }, - "annotations": { - "hwlab.pikastech.local/gitops-note": "node DEV GitOps target.", - "hwlab.pikastech.local/gitops-render-source-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f", - "hwlab.pikastech.local/source-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f" - } - }, - "spec": { - "replicas": 1, - "selector": { - "matchLabels": { - "app.kubernetes.io/name": "hwlab-cloud-api", - "app.kubernetes.io/part-of": "hwlab", - "hwlab.pikastech.local/environment": "v03", - "hwlab.pikastech.local/profile": "v03" - } - }, - "template": { - "metadata": { - "labels": { - "app.kubernetes.io/name": "hwlab-cloud-api", - "hwlab.pikastech.local/service-id": "hwlab-cloud-api", - "app.kubernetes.io/part-of": "hwlab", - "hwlab.pikastech.local/environment": "v03", - "hwlab.pikastech.local/profile": "v03", - "hwlab.pikastech.local/gitops-target": "v03", - "hwlab.pikastech.local/gitops-render-source-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f", - "hwlab.pikastech.local/source-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f", - "hwlab.pikastech.local/artifact-source-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f", - "hwlab.pikastech.local/monitoring": "enabled", - "hwlab.pikastech.local/runtime-mode": "env-reuse-git-mirror-checkout", - "hwlab.pikastech.local/boot-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f" - }, - "annotations": { - "hwlab.pikastech.local/metrics-sidecar-sha256": "782e26256b5a5cddff52a165a0eb5f852973eee1aac1b19acac4a313db7968f4", - "hwlab.pikastech.local/gitops-render-source-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f", - "hwlab.pikastech.local/source-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f", - "hwlab.pikastech.local/artifact-source-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f", - "hwlab.pikastech.local/rendered-by": "scripts/gitops-render.mjs", - "hwlab.pikastech.local/runtime-mode": "env-reuse-git-mirror-checkout", - "hwlab.pikastech.local/boot-repo": "git@github.com:pikasTech/HWLAB.git", - "hwlab.pikastech.local/boot-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f", - "hwlab.pikastech.local/boot-sh": "deploy/runtime/boot/hwlab-cloud-api.sh", - "hwlab.pikastech.local/environment-digest": "sha256:d696dbd9ed99e1bf1152fb88fac47552526816faf141fb84bcfe74e6689bb5e3", - "hwlab.pikastech.local/environment-input-hash": "f5109d26020b05d9023ab1a6dd4e34ed07c9bbca03fc8d0a4697cc208c85a175", - "hwlab.pikastech.local/code-input-hash": "e9ce96840e4a0b5732e5b0f4de06e81947ad0cf3ccaf711d1f1108f592e9bee1" - } - }, - "spec": { - "initContainers": [], - "containers": [ - { - "name": "hwlab-cloud-api", - "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api-env@sha256:d696dbd9ed99e1bf1152fb88fac47552526816faf141fb84bcfe74e6689bb5e3", - "ports": [ - { - "name": "http", - "containerPort": 6667 - } - ], - "env": [ - { - "name": "HWLAB_ENVIRONMENT", - "value": "v03" - }, - { - "name": "HWLAB_PUBLIC_ENDPOINT", - "value": "https://hwlab-v03.74-48-78-17.nip.io" - }, - { - "name": "HWLAB_CLOUD_API_PORT", - "value": "6667" - }, - { - "name": "HWLAB_COMMIT_ID", - "value": "effbb79199d1117de0634904cdb019c5c0b0ee9f" - }, - { - "name": "HWLAB_IMAGE", - "value": "127.0.0.1:5000/hwlab/hwlab-cloud-api-env@sha256:d696dbd9ed99e1bf1152fb88fac47552526816faf141fb84bcfe74e6689bb5e3" - }, - { - "name": "HWLAB_IMAGE_TAG", - "value": "env-f5109d26020b" - }, - { - "name": "HWLAB_RUNTIME_SUBSTITUTE_FORBIDDEN", - "value": "unidesk-backend,provider-gateway,microservice-proxy" - }, - { - "name": "HWLAB_CLOUD_DB_URL", - "valueFrom": { - "secretKeyRef": { - "name": "hwlab-cloud-api-v03-db", - "key": "database-url", - "optional": true - } - } - }, - { - "name": "HWLAB_CLOUD_DB_SSL_MODE", - "value": "disable" - }, - { - "name": "HWLAB_CLOUD_DB_CONTRACT", - "value": "v03-redacted-presence-only" - }, - { - "name": "HWLAB_CLOUD_RUNTIME_ADAPTER", - "value": "postgres" - }, - { - "name": "HWLAB_CLOUD_RUNTIME_DURABLE", - "value": "true" - }, - { - "name": "HWLAB_M3_IO_CONTROL_ENABLED", - "value": "false" - }, - { - "name": "HWLAB_CODE_AGENT_TIMEOUT_MS", - "value": "1200000" - }, - { - "name": "NO_PROXY", - "value": "hwlab-v03.svc.cluster.local,.svc,.cluster.local,hyueapi.com,.hyueapi.com,hyui.com,.hyui.com,127.0.0.1,localhost,::1,10.0.0.0/8,10.42.0.0/16,10.43.0.0/16,api.minimaxi.com,.minimaxi.com" - }, - { - "name": "no_proxy", - "value": "hwlab-v03.svc.cluster.local,.svc,.cluster.local,hyueapi.com,.hyueapi.com,hyui.com,.hyui.com,127.0.0.1,localhost,::1,10.0.0.0/8,10.42.0.0/16,10.43.0.0/16,api.minimaxi.com,.minimaxi.com" - }, - { - "name": "HWLAB_CODE_AGENT_SKILLS_DIRS", - "value": "/app/skills:/data/user-skills" - }, - { - "name": "HWLAB_PREINSTALLED_SKILLS_DIR", - "value": "/app/skills" - }, - { - "name": "HWLAB_USER_SKILLS_DIR", - "value": "/data/user-skills" - }, - { - "name": "HWLAB_CODE_AGENT_DEFAULT_PROVIDER_PROFILE", - "value": "deepseek" - }, - { - "name": "HWLAB_CODE_AGENT_DEEPSEEK_MODEL", - "value": "deepseek-chat" - }, - { - "name": "HWLAB_CODE_AGENT_DEEPSEEK_BASE_URL", - "value": "http://hwlab-deepseek-proxy.hwlab-v03.svc.cluster.local:4000/v1/responses" - }, - { - "name": "HWLAB_CODE_AGENT_CODEX_API_MODEL", - "value": "gpt-5.5" - }, - { - "name": "HWLAB_CODE_AGENT_CODEX_API_BASE_URL", - "value": "http://127.0.0.1:49280/responses" - }, - { - "name": "HWLAB_CODE_AGENT_CODEX_API_UPSTREAM_BASE_URL", - "value": "https://hyueapi.com" - }, - { - "name": "HWLAB_CODE_AGENT_CODEX_API_FORWARDER_PORT", - "value": "49280" - }, - { - "name": "TZ", - "value": "Asia/Shanghai" - }, - { - "name": "HWLAB_METRICS_NAMESPACE", - "value": "hwlab-v03" - }, - { - "name": "HWLAB_OBSERVABILITY_CONFIG_REVISION", - "value": "PJ2026-01060505-20260619-long-trace-timeout-mitigation" - }, - { - "name": "HWLAB_CODE_AGENT_TURN_STATUS_REFRESH_TIMEOUT_MS", - "value": "30000" - }, - { - "name": "HWLAB_CODE_AGENT_AGENTRUN_NO_RESPONSE_TIMEOUT_MS", - "value": "600000" - }, - { - "name": "HWLAB_CODE_AGENT_AGENTRUN_DISPATCH_RETRY_MAX", - "value": "5" - }, - { - "name": "HWLAB_CODE_AGENT_AGENTRUN_DISPATCH_RETRY_BASE_MS", - "value": "1000" - }, - { - "name": "HWLAB_CODE_AGENT_AGENTRUN_DISPATCH_RETRY_MAX_DELAY_MS", - "value": "30000" - }, - { - "name": "HWLAB_CODE_AGENT_AGENTRUN_PROJECTION_SYNC_POLL_INTERVAL_MS", - "value": "1000" - }, - { - "name": "HWLAB_CODE_AGENT_AGENTRUN_PROJECTION_RESUME_ENABLED", - "value": "1" - }, - { - "name": "HWLAB_CODE_AGENT_AGENTRUN_PROJECTION_RESUME_INITIAL_DELAY_MS", - "value": "5000" - }, - { - "name": "HWLAB_CODE_AGENT_AGENTRUN_PROJECTION_RESUME_INTERVAL_MS", - "value": "60000" - }, - { - "name": "HWLAB_CODE_AGENT_AGENTRUN_PROJECTION_RESUME_MIN_AGE_MS", - "value": "30000" - }, - { - "name": "HWLAB_CODE_AGENT_AGENTRUN_PROJECTION_RESUME_BATCH_SIZE", - "value": "100" - }, - { - "name": "HWLAB_CODE_AGENT_AGENTRUN_PROJECTION_RESUME_JITTER_MS", - "value": "15000" - }, - { - "name": "HWLAB_CODE_AGENT_AGENTRUN_PROJECTION_RESUME_FAILURE_BACKOFF_MS", - "value": "120000" - }, - { - "name": "HWLAB_BOOTSTRAP_ADMIN_PASSWORD_HASH", - "valueFrom": { - "secretKeyRef": { - "name": "hwlab-v03-bootstrap-admin", - "key": "password-hash", - "optional": true - } - } - }, - { - "name": "HWLAB_PRESET_USER_HUIGGAO_PASSWORD_HASH", - "valueFrom": { - "secretKeyRef": { - "name": "hwlab-v03-preset-users", - "key": "huiggao-password-hash", - "optional": true - } - } - }, - { - "name": "HWLAB_ACCESS_CONTROL_USERS_JSON", - "value": "[{\"id\":\"usr_v03_admin\",\"username\":\"admin\",\"displayName\":\"HWLAB v0.3 Admin\",\"email\":null,\"role\":\"admin\",\"status\":\"active\",\"navProfile\":\"admin-full\",\"passwordHashEnv\":\"HWLAB_BOOTSTRAP_ADMIN_PASSWORD_HASH\"},{\"id\":\"usr_v03_huiggao\",\"username\":\"huiggao@163.com\",\"displayName\":\"huiggao@163.com\",\"email\":\"huiggao@163.com\",\"role\":\"user\",\"status\":\"active\",\"navProfile\":\"code-mdtodo-only\",\"passwordHashEnv\":\"HWLAB_PRESET_USER_HUIGGAO_PASSWORD_HASH\"}]" - }, - { - "name": "HWLAB_ACCESS_CONTROL_NAV_PROFILES_JSON", - "value": "[{\"id\":\"admin-full\",\"displayName\":\"Admin full access\",\"allowedIds\":[\"*\"]},{\"id\":\"code-mdtodo-only\",\"displayName\":\"Code and MDTODO only\",\"allowedIds\":[\"workbench.code\",\"project.mdtodo\"]}]" - }, - { - "name": "HWLAB_CLOUD_DB_POOL_MAX", - "value": "4" - }, - { - "name": "HWLAB_CLOUD_DB_PROBE_TIMEOUT_MS", - "value": "5000" - }, - { - "name": "HWLAB_CLOUD_DB_QUERY_TIMEOUT_MS", - "value": "3000" - }, - { - "name": "HWLAB_CLOUD_DB_QUERY_RETRY_MAX_ATTEMPTS", - "value": "5" - }, - { - "name": "HWLAB_CLOUD_DB_QUERY_RETRY_INITIAL_DELAY_MS", - "value": "250" - }, - { - "name": "HWLAB_CLOUD_DB_QUERY_RETRY_MAX_DELAY_MS", - "value": "5000" - }, - { - "name": "HWLAB_WORKBENCH_RUNTIME_TIMEOUT_MS", - "value": "3000" - }, - { - "name": "HWLAB_WORKBENCH_FACTS_QUERY_MAX_ATTEMPTS", - "value": "1" - }, - { - "name": "HWLAB_WORKBENCH_FACTS_QUERY_BACKOFF_BASE_MS", - "value": "0" - }, - { - "name": "HWLAB_WORKBENCH_FACTS_QUERY_BACKOFF_MAX_MS", - "value": "1" - }, - { - "name": "HWLAB_ACCESS_CONTROL_REQUIRED", - "value": "1" - }, - { - "name": "HWLAB_SESSION_COOKIE_DOMAIN", - "value": ".pikapython.com" - }, - { - "name": "HWLAB_SESSION_COOKIE_SAMESITE", - "value": "None" - }, - { - "name": "HWLAB_BOOTSTRAP_ADMIN_ID", - "value": "usr_v03_admin" - }, - { - "name": "HWLAB_BOOTSTRAP_ADMIN_USERNAME", - "value": "admin" - }, - { - "name": "HWLAB_BOOTSTRAP_ADMIN_DISPLAY_NAME", - "value": "HWLAB v0.3 Admin" - }, - { - "name": "HWLAB_BOOTSTRAP_ADMIN_API_KEY_ID", - "value": "key_master_server_admin" - }, - { - "name": "HWLAB_BOOTSTRAP_ADMIN_API_KEY", - "valueFrom": { - "secretKeyRef": { - "name": "hwlab-v03-master-server-admin-api-key", - "key": "api-key", - "optional": true - } - } - }, - { - "name": "HWLAB_USER_BILLING_URL", - "value": "http://hwlab-user-billing.hwlab-v03.svc.cluster.local:6670" - }, - { - "name": "HWLAB_WORKBENCH_RUNTIME_URL", - "value": "http://hwlab-workbench-runtime.hwlab-v03.svc.cluster.local:6671" - }, - { - "name": "HWLAB_PROJECT_MANAGEMENT_URL", - "value": "http://hwlab-project-management.hwlab-v03.svc.cluster.local:6672" - }, - { - "name": "HWLAB_HWPOD_SPEC_REGISTRY_DIRS", - "value": "/etc/hwlab/hwpod-specs" - }, - { - "name": "HWLAB_USER_BILLING_LOGIN_RETRY_ATTEMPTS", - "value": "2" - }, - { - "name": "HWLAB_USER_BILLING_LOGIN_RETRY_DELAY_MS", - "value": "250" - }, - { - "name": "HWLAB_USER_BILLING_CODE_AGENT_ENABLED", - "value": "1" - }, - { - "name": "HWLAB_USER_BILLING_CODE_AGENT_ESTIMATED_CREDITS", - "value": "1" - }, - { - "name": "HWLAB_USER_BILLING_CODE_AGENT_USED_CREDITS", - "value": "1" - }, - { - "name": "HWLAB_KEYCLOAK_ISSUER", - "value": "https://auth.74-48-78-17.nip.io/realms/hwlab" - }, - { - "name": "HWLAB_KEYCLOAK_CLIENT_ID", - "value": "hwlab-cloud-web" - }, - { - "name": "HWLAB_KEYCLOAK_CLIENT_SECRET", - "valueFrom": { - "secretKeyRef": { - "name": "hwlab-cloud-web-client", - "key": "client-secret", - "optional": true - } - } - }, - { - "name": "HWLAB_CODE_AGENT_ADAPTER", - "value": "agentrun-v01" - }, - { - "name": "OTEL_EXPORTER_OTLP_TRACES_ENDPOINT", - "value": "http://otel-collector.platform-infra.svc.cluster.local:4318/v1/traces" - }, - { - "name": "OTEL_SERVICE_NAME", - "value": "hwlab-cloud-api" - }, - { - "name": "AGENTRUN_MGR_URL", - "value": "http://agentrun-mgr.agentrun-v02.svc.cluster.local:8080" - }, - { - "name": "AGENTRUN_API_KEY", - "valueFrom": { - "secretKeyRef": { - "name": "hwlab-v03-master-server-admin-api-key", - "key": "api-key", - "optional": true - } - } - }, - { - "name": "HWLAB_CODE_AGENT_AGENTRUN_RUNNER_NAMESPACE", - "value": "agentrun-v02" - }, - { - "name": "HWLAB_CODE_AGENT_AGENTRUN_SECRET_NAMESPACE", - "value": "agentrun-v02" - }, - { - "name": "HWLAB_CODE_AGENT_AGENTRUN_REPO_URL", - "value": "http://git-mirror-http.devops-infra.svc.cluster.local/pikasTech/HWLAB.git" - }, - { - "name": "HWLAB_WORKBENCH_EMPTY_SESSION_GC_ENABLED", - "value": "1" - }, - { - "name": "HWLAB_WORKBENCH_EMPTY_SESSION_TTL_MS", - "value": "600000" - }, - { - "name": "HWLAB_WORKBENCH_EMPTY_SESSION_GC_INTERVAL_MS", - "value": "60000" - }, - { - "name": "HWLAB_WORKBENCH_EMPTY_SESSION_GC_INITIAL_DELAY_MS", - "value": "5000" - }, - { - "name": "HWLAB_WORKBENCH_EMPTY_SESSION_GC_BATCH_SIZE", - "value": "100" - }, - { - "name": "HWLAB_WORKBENCH_EMPTY_SESSION_GC_JITTER_MS", - "value": "15000" - }, - { - "name": "HWLAB_WORKBENCH_EMPTY_SESSION_GC_FAILURE_BACKOFF_MS", - "value": "120000" - }, - { - "name": "HWLAB_SECRET_PLANE_SMOKE", - "valueFrom": { - "secretKeyRef": { - "name": "hwlab-secret-plane-smoke", - "key": "password", - "optional": true - } - } - }, - { - "name": "HWLAB_GITOPS_TARGET", - "value": "v03" - }, - { - "name": "HWLAB_GITOPS_PROFILE", - "value": "v03" - }, - { - "name": "HWLAB_GITOPS_SOURCE_COMMIT", - "value": "effbb79199d1117de0634904cdb019c5c0b0ee9f" - }, - { - "name": "HWLAB_CODE_AGENT_AGENTRUN_SOURCE_COMMIT", - "value": "effbb79199d1117de0634904cdb019c5c0b0ee9f" - }, - { - "name": "HWLAB_RUNTIME_MODE", - "value": "env-reuse-git-mirror-checkout" - }, - { - "name": "HWLAB_BOOT_REPO", - "value": "git@github.com:pikasTech/HWLAB.git" - }, - { - "name": "HWLAB_BOOT_COMMIT", - "value": "effbb79199d1117de0634904cdb019c5c0b0ee9f" - }, - { - "name": "HWLAB_BOOT_REF", - "value": "v0.3" - }, - { - "name": "HWLAB_BOOT_SH", - "value": "deploy/runtime/boot/hwlab-cloud-api.sh" - }, - { - "name": "HWLAB_BOOT_READ_URL", - "value": "http://git-mirror-http.devops-infra.svc.cluster.local/pikasTech/HWLAB.git" - }, - { - "name": "HWLAB_ENVIRONMENT_IMAGE", - "value": "127.0.0.1:5000/hwlab/hwlab-cloud-api-env:env-f5109d26020b" - }, - { - "name": "HWLAB_ENVIRONMENT_DIGEST", - "value": "sha256:d696dbd9ed99e1bf1152fb88fac47552526816faf141fb84bcfe74e6689bb5e3" - }, - { - "name": "HWLAB_ENVIRONMENT_INPUT_HASH", - "value": "f5109d26020b05d9023ab1a6dd4e34ed07c9bbca03fc8d0a4697cc208c85a175" - }, - { - "name": "HWLAB_CODE_INPUT_HASH", - "value": "e9ce96840e4a0b5732e5b0f4de06e81947ad0cf3ccaf711d1f1108f592e9bee1" - }, - { - "name": "HWLAB_IMAGE_DIGEST", - "value": "sha256:d696dbd9ed99e1bf1152fb88fac47552526816faf141fb84bcfe74e6689bb5e3" - }, - { - "name": "HWLAB_WORKBENCH_SSE_DRAIN_TIMEOUT_MS", - "value": "2500" - }, - { - "name": "HWLAB_CODE_AGENT_AGENTRUN_PROVIDER_ID", - "value": "JD01" - }, - { - "name": "HWLAB_OPENFGA_MODE", - "value": "enforce" - }, - { - "name": "HWLAB_OPENFGA_API_URL", - "value": "http://hwlab-openfga.hwlab-v03.svc.cluster.local:8080" - }, - { - "name": "HWLAB_OPENFGA_AUTHN_TOKEN", - "valueFrom": { - "secretKeyRef": { - "name": "hwlab-v03-openfga", - "key": "authn-preshared-key", - "optional": true - } - } - }, - { - "name": "UNIDESK_MAIN_SERVER_IP", - "value": "http://74.48.78.17:18081" - } - ], - "readinessProbe": { - "httpGet": { - "path": "/health/live", - "port": "http" - }, - "timeoutSeconds": 3, - "failureThreshold": 5 - }, - "livenessProbe": { - "httpGet": { - "path": "/health/live", - "port": "http" - }, - "periodSeconds": 20, - "timeoutSeconds": 5, - "failureThreshold": 6 - }, - "volumeMounts": [ - { - "name": "hwlab-user-skills", - "mountPath": "/data/user-skills" - }, - { - "name": "hwpod-preinstalled-specs", - "mountPath": "/etc/hwlab/hwpod-specs", - "readOnly": true - } - ], - "imagePullPolicy": "IfNotPresent", - "startupProbe": { - "httpGet": { - "path": "/health/live", - "port": "http" - }, - "periodSeconds": 10, - "timeoutSeconds": 3, - "failureThreshold": 30, - "successThreshold": 1 - }, - "lifecycle": { - "preStop": { - "exec": { - "command": [ - "sh", - "-c", - "port=\"${PORT:-${HWLAB_PORT:-${HWLAB_CLOUD_API_PORT:-6667}}}\"; url=\"http://127.0.0.1:${port}/v1/internal/workbench/drain\"; /usr/local/bin/bun -e 'const [url, hostname] = process.argv.slice(2); await fetch(url, { method: \"POST\", headers: { \"x-hwlab-drain-hostname\": hostname || \"\" } }).catch(() => {});' \"$url\" \"${HOSTNAME:-}\" >/dev/null 2>&1 || true; sleep 3" - ] - } - } - } - }, - { - "name": "hwlab-codex-api-forwarder", - "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api-env@sha256:d696dbd9ed99e1bf1152fb88fac47552526816faf141fb84bcfe74e6689bb5e3", - "ports": [ - { - "name": "codex-api", - "containerPort": 49280 - } - ], - "env": [ - { - "name": "HWLAB_CODE_AGENT_CODEX_API_FORWARDER_HOST", - "value": "127.0.0.1" - }, - { - "name": "HWLAB_CODE_AGENT_CODEX_API_FORWARDER_PORT", - "value": "49280" - }, - { - "name": "HWLAB_CODE_AGENT_CODEX_API_UPSTREAM_BASE_URL", - "value": "https://hyueapi.com" - }, - { - "name": "NO_PROXY", - "value": "hwlab-v03.svc.cluster.local,.svc,.cluster.local,hyueapi.com,.hyueapi.com,hyui.com,.hyui.com,127.0.0.1,localhost,::1,10.0.0.0/8,10.42.0.0/16,10.43.0.0/16,api.minimaxi.com,.minimaxi.com" - }, - { - "name": "no_proxy", - "value": "hwlab-v03.svc.cluster.local,.svc,.cluster.local,hyueapi.com,.hyueapi.com,hyui.com,.hyui.com,127.0.0.1,localhost,::1,10.0.0.0/8,10.42.0.0/16,10.43.0.0/16,api.minimaxi.com,.minimaxi.com" - }, - { - "name": "HWLAB_M3_IO_CONTROL_ENABLED", - "value": "false" - }, - { - "name": "HWLAB_ENVIRONMENT", - "value": "v03" - }, - { - "name": "HWLAB_PUBLIC_ENDPOINT", - "value": "https://hwlab-v03.74-48-78-17.nip.io" - }, - { - "name": "HWLAB_CLOUD_API_PORT", - "value": "6667" - }, - { - "name": "HWLAB_RUNTIME_SUBSTITUTE_FORBIDDEN", - "value": "unidesk-backend,provider-gateway,microservice-proxy" - }, - { - "name": "HWLAB_CLOUD_DB_URL", - "valueFrom": { - "secretKeyRef": { - "name": "hwlab-cloud-api-v03-db", - "key": "database-url", - "optional": true - } - } - }, - { - "name": "HWLAB_CLOUD_DB_SSL_MODE", - "value": "disable" - }, - { - "name": "HWLAB_CLOUD_DB_CONTRACT", - "value": "v03-redacted-presence-only" - }, - { - "name": "HWLAB_CLOUD_RUNTIME_ADAPTER", - "value": "postgres" - }, - { - "name": "HWLAB_CLOUD_RUNTIME_DURABLE", - "value": "true" - }, - { - "name": "HWLAB_CODE_AGENT_TIMEOUT_MS", - "value": "1200000" - }, - { - "name": "HWLAB_CODE_AGENT_SKILLS_DIRS", - "value": "/app/skills:/data/user-skills" - }, - { - "name": "HWLAB_PREINSTALLED_SKILLS_DIR", - "value": "/app/skills" - }, - { - "name": "HWLAB_USER_SKILLS_DIR", - "value": "/data/user-skills" - }, - { - "name": "HWLAB_CODE_AGENT_DEFAULT_PROVIDER_PROFILE", - "value": "deepseek" - }, - { - "name": "HWLAB_CODE_AGENT_DEEPSEEK_MODEL", - "value": "deepseek-chat" - }, - { - "name": "HWLAB_CODE_AGENT_DEEPSEEK_BASE_URL", - "value": "http://hwlab-deepseek-proxy.hwlab-v03.svc.cluster.local:4000/v1/responses" - }, - { - "name": "HWLAB_CODE_AGENT_CODEX_API_MODEL", - "value": "gpt-5.5" - }, - { - "name": "HWLAB_CODE_AGENT_CODEX_API_BASE_URL", - "value": "http://127.0.0.1:49280/responses" - }, - { - "name": "TZ", - "value": "Asia/Shanghai" - }, - { - "name": "HWLAB_METRICS_NAMESPACE", - "value": "hwlab-v03" - }, - { - "name": "HWLAB_OBSERVABILITY_CONFIG_REVISION", - "value": "PJ2026-01060505-20260619-long-trace-timeout-mitigation" - }, - { - "name": "HWLAB_CODE_AGENT_TURN_STATUS_REFRESH_TIMEOUT_MS", - "value": "30000" - }, - { - "name": "HWLAB_CODE_AGENT_AGENTRUN_NO_RESPONSE_TIMEOUT_MS", - "value": "600000" - }, - { - "name": "HWLAB_CODE_AGENT_AGENTRUN_DISPATCH_RETRY_MAX", - "value": "5" - }, - { - "name": "HWLAB_CODE_AGENT_AGENTRUN_DISPATCH_RETRY_BASE_MS", - "value": "1000" - }, - { - "name": "HWLAB_CODE_AGENT_AGENTRUN_DISPATCH_RETRY_MAX_DELAY_MS", - "value": "30000" - }, - { - "name": "HWLAB_CODE_AGENT_AGENTRUN_PROJECTION_SYNC_POLL_INTERVAL_MS", - "value": "1000" - }, - { - "name": "HWLAB_CODE_AGENT_AGENTRUN_PROJECTION_RESUME_ENABLED", - "value": "1" - }, - { - "name": "HWLAB_CODE_AGENT_AGENTRUN_PROJECTION_RESUME_INITIAL_DELAY_MS", - "value": "5000" - }, - { - "name": "HWLAB_CODE_AGENT_AGENTRUN_PROJECTION_RESUME_INTERVAL_MS", - "value": "60000" - }, - { - "name": "HWLAB_CODE_AGENT_AGENTRUN_PROJECTION_RESUME_MIN_AGE_MS", - "value": "30000" - }, - { - "name": "HWLAB_CODE_AGENT_AGENTRUN_PROJECTION_RESUME_BATCH_SIZE", - "value": "100" - }, - { - "name": "HWLAB_CODE_AGENT_AGENTRUN_PROJECTION_RESUME_JITTER_MS", - "value": "15000" - }, - { - "name": "HWLAB_CODE_AGENT_AGENTRUN_PROJECTION_RESUME_FAILURE_BACKOFF_MS", - "value": "120000" - }, - { - "name": "HWLAB_BOOTSTRAP_ADMIN_PASSWORD_HASH", - "valueFrom": { - "secretKeyRef": { - "name": "hwlab-v03-bootstrap-admin", - "key": "password-hash", - "optional": true - } - } - }, - { - "name": "HWLAB_PRESET_USER_HUIGGAO_PASSWORD_HASH", - "valueFrom": { - "secretKeyRef": { - "name": "hwlab-v03-preset-users", - "key": "huiggao-password-hash", - "optional": true - } - } - }, - { - "name": "HWLAB_ACCESS_CONTROL_USERS_JSON", - "value": "[{\"id\":\"usr_v03_admin\",\"username\":\"admin\",\"displayName\":\"HWLAB v0.3 Admin\",\"email\":null,\"role\":\"admin\",\"status\":\"active\",\"navProfile\":\"admin-full\",\"passwordHashEnv\":\"HWLAB_BOOTSTRAP_ADMIN_PASSWORD_HASH\"},{\"id\":\"usr_v03_huiggao\",\"username\":\"huiggao@163.com\",\"displayName\":\"huiggao@163.com\",\"email\":\"huiggao@163.com\",\"role\":\"user\",\"status\":\"active\",\"navProfile\":\"code-mdtodo-only\",\"passwordHashEnv\":\"HWLAB_PRESET_USER_HUIGGAO_PASSWORD_HASH\"}]" - }, - { - "name": "HWLAB_ACCESS_CONTROL_NAV_PROFILES_JSON", - "value": "[{\"id\":\"admin-full\",\"displayName\":\"Admin full access\",\"allowedIds\":[\"*\"]},{\"id\":\"code-mdtodo-only\",\"displayName\":\"Code and MDTODO only\",\"allowedIds\":[\"workbench.code\",\"project.mdtodo\"]}]" - }, - { - "name": "HWLAB_CLOUD_DB_POOL_MAX", - "value": "4" - }, - { - "name": "HWLAB_CLOUD_DB_PROBE_TIMEOUT_MS", - "value": "5000" - }, - { - "name": "HWLAB_CLOUD_DB_QUERY_TIMEOUT_MS", - "value": "3000" - }, - { - "name": "HWLAB_CLOUD_DB_QUERY_RETRY_MAX_ATTEMPTS", - "value": "5" - }, - { - "name": "HWLAB_CLOUD_DB_QUERY_RETRY_INITIAL_DELAY_MS", - "value": "250" - }, - { - "name": "HWLAB_CLOUD_DB_QUERY_RETRY_MAX_DELAY_MS", - "value": "5000" - }, - { - "name": "HWLAB_WORKBENCH_RUNTIME_TIMEOUT_MS", - "value": "3000" - }, - { - "name": "HWLAB_WORKBENCH_FACTS_QUERY_MAX_ATTEMPTS", - "value": "1" - }, - { - "name": "HWLAB_WORKBENCH_FACTS_QUERY_BACKOFF_BASE_MS", - "value": "0" - }, - { - "name": "HWLAB_WORKBENCH_FACTS_QUERY_BACKOFF_MAX_MS", - "value": "1" - }, - { - "name": "HWLAB_ACCESS_CONTROL_REQUIRED", - "value": "1" - }, - { - "name": "HWLAB_SESSION_COOKIE_DOMAIN", - "value": ".pikapython.com" - }, - { - "name": "HWLAB_SESSION_COOKIE_SAMESITE", - "value": "None" - }, - { - "name": "HWLAB_BOOTSTRAP_ADMIN_ID", - "value": "usr_v03_admin" - }, - { - "name": "HWLAB_BOOTSTRAP_ADMIN_USERNAME", - "value": "admin" - }, - { - "name": "HWLAB_BOOTSTRAP_ADMIN_DISPLAY_NAME", - "value": "HWLAB v0.3 Admin" - }, - { - "name": "HWLAB_BOOTSTRAP_ADMIN_API_KEY_ID", - "value": "key_master_server_admin" - }, - { - "name": "HWLAB_BOOTSTRAP_ADMIN_API_KEY", - "valueFrom": { - "secretKeyRef": { - "name": "hwlab-v03-master-server-admin-api-key", - "key": "api-key", - "optional": true - } - } - }, - { - "name": "HWLAB_USER_BILLING_URL", - "value": "http://hwlab-user-billing.hwlab-v03.svc.cluster.local:6670" - }, - { - "name": "HWLAB_WORKBENCH_RUNTIME_URL", - "value": "http://hwlab-workbench-runtime.hwlab-v03.svc.cluster.local:6671" - }, - { - "name": "HWLAB_PROJECT_MANAGEMENT_URL", - "value": "http://hwlab-project-management.hwlab-v03.svc.cluster.local:6672" - }, - { - "name": "HWLAB_HWPOD_SPEC_REGISTRY_DIRS", - "value": "/etc/hwlab/hwpod-specs" - }, - { - "name": "HWLAB_USER_BILLING_LOGIN_RETRY_ATTEMPTS", - "value": "2" - }, - { - "name": "HWLAB_USER_BILLING_LOGIN_RETRY_DELAY_MS", - "value": "250" - }, - { - "name": "HWLAB_USER_BILLING_CODE_AGENT_ENABLED", - "value": "1" - }, - { - "name": "HWLAB_USER_BILLING_CODE_AGENT_ESTIMATED_CREDITS", - "value": "1" - }, - { - "name": "HWLAB_USER_BILLING_CODE_AGENT_USED_CREDITS", - "value": "1" - }, - { - "name": "HWLAB_KEYCLOAK_ISSUER", - "value": "https://auth.74-48-78-17.nip.io/realms/hwlab" - }, - { - "name": "HWLAB_KEYCLOAK_CLIENT_ID", - "value": "hwlab-cloud-web" - }, - { - "name": "HWLAB_KEYCLOAK_CLIENT_SECRET", - "valueFrom": { - "secretKeyRef": { - "name": "hwlab-cloud-web-client", - "key": "client-secret", - "optional": true - } - } - }, - { - "name": "HWLAB_CODE_AGENT_ADAPTER", - "value": "agentrun-v01" - }, - { - "name": "OTEL_EXPORTER_OTLP_TRACES_ENDPOINT", - "value": "http://otel-collector.platform-infra.svc.cluster.local:4318/v1/traces" - }, - { - "name": "OTEL_SERVICE_NAME", - "value": "hwlab-cloud-api" - }, - { - "name": "AGENTRUN_MGR_URL", - "value": "http://agentrun-mgr.agentrun-v02.svc.cluster.local:8080" - }, - { - "name": "AGENTRUN_API_KEY", - "valueFrom": { - "secretKeyRef": { - "name": "hwlab-v03-master-server-admin-api-key", - "key": "api-key", - "optional": true - } - } - }, - { - "name": "HWLAB_CODE_AGENT_AGENTRUN_RUNNER_NAMESPACE", - "value": "agentrun-v02" - }, - { - "name": "HWLAB_CODE_AGENT_AGENTRUN_SECRET_NAMESPACE", - "value": "agentrun-v02" - }, - { - "name": "HWLAB_CODE_AGENT_AGENTRUN_REPO_URL", - "value": "http://git-mirror-http.devops-infra.svc.cluster.local/pikasTech/HWLAB.git" - }, - { - "name": "HWLAB_WORKBENCH_EMPTY_SESSION_GC_ENABLED", - "value": "1" - }, - { - "name": "HWLAB_WORKBENCH_EMPTY_SESSION_TTL_MS", - "value": "600000" - }, - { - "name": "HWLAB_WORKBENCH_EMPTY_SESSION_GC_INTERVAL_MS", - "value": "60000" - }, - { - "name": "HWLAB_WORKBENCH_EMPTY_SESSION_GC_INITIAL_DELAY_MS", - "value": "5000" - }, - { - "name": "HWLAB_WORKBENCH_EMPTY_SESSION_GC_BATCH_SIZE", - "value": "100" - }, - { - "name": "HWLAB_WORKBENCH_EMPTY_SESSION_GC_JITTER_MS", - "value": "15000" - }, - { - "name": "HWLAB_WORKBENCH_EMPTY_SESSION_GC_FAILURE_BACKOFF_MS", - "value": "120000" - }, - { - "name": "HWLAB_SECRET_PLANE_SMOKE", - "valueFrom": { - "secretKeyRef": { - "name": "hwlab-secret-plane-smoke", - "key": "password", - "optional": true - } - } - }, - { - "name": "HWLAB_COMMIT_ID", - "value": "effbb79199d1117de0634904cdb019c5c0b0ee9f" - }, - { - "name": "HWLAB_IMAGE", - "value": "127.0.0.1:5000/hwlab/hwlab-cloud-api-env@sha256:d696dbd9ed99e1bf1152fb88fac47552526816faf141fb84bcfe74e6689bb5e3" - }, - { - "name": "HWLAB_IMAGE_TAG", - "value": "env-f5109d26020b" - }, - { - "name": "HWLAB_GITOPS_TARGET", - "value": "v03" - }, - { - "name": "HWLAB_GITOPS_PROFILE", - "value": "v03" - }, - { - "name": "HWLAB_GITOPS_SOURCE_COMMIT", - "value": "effbb79199d1117de0634904cdb019c5c0b0ee9f" - }, - { - "name": "HWLAB_CODE_AGENT_AGENTRUN_SOURCE_COMMIT", - "value": "effbb79199d1117de0634904cdb019c5c0b0ee9f" - }, - { - "name": "HWLAB_RUNTIME_MODE", - "value": "env-reuse-git-mirror-checkout" - }, - { - "name": "HWLAB_BOOT_REPO", - "value": "git@github.com:pikasTech/HWLAB.git" - }, - { - "name": "HWLAB_BOOT_COMMIT", - "value": "effbb79199d1117de0634904cdb019c5c0b0ee9f" - }, - { - "name": "HWLAB_BOOT_REF", - "value": "v0.3" - }, - { - "name": "HWLAB_BOOT_SH", - "value": "deploy/runtime/boot/hwlab-codex-api-responses-forwarder.sh" - }, - { - "name": "HWLAB_BOOT_READ_URL", - "value": "http://git-mirror-http.devops-infra.svc.cluster.local/pikasTech/HWLAB.git" - }, - { - "name": "HWLAB_ENVIRONMENT_IMAGE", - "value": "127.0.0.1:5000/hwlab/hwlab-cloud-api-env:env-f5109d26020b" - }, - { - "name": "HWLAB_ENVIRONMENT_DIGEST", - "value": "sha256:d696dbd9ed99e1bf1152fb88fac47552526816faf141fb84bcfe74e6689bb5e3" - }, - { - "name": "HWLAB_ENVIRONMENT_INPUT_HASH", - "value": "f5109d26020b05d9023ab1a6dd4e34ed07c9bbca03fc8d0a4697cc208c85a175" - }, - { - "name": "HWLAB_CODE_INPUT_HASH", - "value": "e9ce96840e4a0b5732e5b0f4de06e81947ad0cf3ccaf711d1f1108f592e9bee1" - }, - { - "name": "HWLAB_IMAGE_DIGEST", - "value": "sha256:d696dbd9ed99e1bf1152fb88fac47552526816faf141fb84bcfe74e6689bb5e3" - }, - { - "name": "HWLAB_WORKBENCH_SSE_DRAIN_TIMEOUT_MS", - "value": "2500" - }, - { - "name": "HWLAB_CODE_AGENT_AGENTRUN_PROVIDER_ID", - "value": "JD01" - }, - { - "name": "HWLAB_OPENFGA_MODE", - "value": "enforce" - }, - { - "name": "HWLAB_OPENFGA_API_URL", - "value": "http://hwlab-openfga.hwlab-v03.svc.cluster.local:8080" - }, - { - "name": "HWLAB_OPENFGA_AUTHN_TOKEN", - "valueFrom": { - "secretKeyRef": { - "name": "hwlab-v03-openfga", - "key": "authn-preshared-key", - "optional": true - } - } - }, - { - "name": "UNIDESK_MAIN_SERVER_IP", - "value": "http://74.48.78.17:18081" - } - ], - "readinessProbe": { - "exec": { - "command": [ - "node", - "-e", - "fetch('http://127.0.0.1:49280/health/readiness').then((response) => process.exit(response.ok ? 0 : 1)).catch(() => process.exit(1))" - ] - }, - "timeoutSeconds": 2 - }, - "livenessProbe": { - "exec": { - "command": [ - "node", - "-e", - "fetch('http://127.0.0.1:49280/health/live').then((response) => process.exit(response.ok ? 0 : 1)).catch(() => process.exit(1))" - ] - }, - "timeoutSeconds": 2 - }, - "volumeMounts": [ - { - "name": "hwpod-preinstalled-specs", - "mountPath": "/etc/hwlab/hwpod-specs", - "readOnly": true - } - ], - "imagePullPolicy": "IfNotPresent", - "startupProbe": { - "exec": { - "command": [ - "node", - "-e", - "fetch('http://127.0.0.1:49280/health/readiness').then((response) => process.exit(response.ok ? 0 : 1)).catch(() => process.exit(1))" - ] - }, - "timeoutSeconds": 2, - "periodSeconds": 10, - "failureThreshold": 30, - "successThreshold": 1 - }, - "lifecycle": { - "preStop": { - "exec": { - "command": [ - "sh", - "-c", - "port=\"${PORT:-${HWLAB_PORT:-${HWLAB_CLOUD_API_PORT:-6667}}}\"; url=\"http://127.0.0.1:${port}/v1/internal/workbench/drain\"; /usr/local/bin/bun -e 'const [url, hostname] = process.argv.slice(2); await fetch(url, { method: \"POST\", headers: { \"x-hwlab-drain-hostname\": hostname || \"\" } }).catch(() => {});' \"$url\" \"${HOSTNAME:-}\" >/dev/null 2>&1 || true; sleep 3" - ] - } - } - } - }, - { - "name": "hwlab-metrics", - "image": "127.0.0.1:5000/hwlab/hwlab-ci-node-tools:node22-alpine-bun-v1", - "imagePullPolicy": "IfNotPresent", - "command": [ - "node", - "/metrics/metrics-sidecar.mjs" - ], - "env": [ - { - "name": "HWLAB_METRICS_SERVICE_ID", - "value": "hwlab-cloud-api" - }, - { - "name": "HWLAB_METRICS_NAMESPACE", - "value": "hwlab-v03" - }, - { - "name": "HWLAB_METRICS_GITOPS_TARGET", - "value": "v03" - }, - { - "name": "HWLAB_METRICS_PORT", - "value": "9100" - }, - { - "name": "HWLAB_METRICS_TARGET_URL", - "value": "http://127.0.0.1:6667/health/live" - }, - { - "name": "HWLAB_METRICS_TARGET_TIMEOUT_MS", - "value": "2000" - }, - { - "name": "HWLAB_METRICS_EXTRA_URL", - "value": "http://127.0.0.1:6667/v1/web-performance/metrics" - }, - { - "name": "HWLAB_METRICS_EXTRA_TIMEOUT_MS", - "value": "2000" - } - ], - "ports": [ - { - "name": "metrics", - "containerPort": 9100 - } - ], - "readinessProbe": { - "httpGet": { - "path": "/health/live", - "port": "metrics" - }, - "initialDelaySeconds": 3, - "periodSeconds": 10 - }, - "livenessProbe": { - "httpGet": { - "path": "/health/live", - "port": "metrics" - }, - "initialDelaySeconds": 10, - "periodSeconds": 20 - }, - "volumeMounts": [ - { - "name": "hwlab-metrics-sidecar", - "mountPath": "/metrics", - "readOnly": true - } - ] - } - ], - "volumes": [ - { - "name": "hwlab-user-skills", - "persistentVolumeClaim": { - "claimName": "hwlab-user-skills" - } - }, - { - "name": "hwlab-metrics-sidecar", - "configMap": { - "name": "hwlab-v03-metrics-sidecar" - } - }, - { - "name": "hwpod-preinstalled-specs", - "configMap": { - "name": "hwlab-v03-hwpod-preinstalled-specs" - } - } - ] - } - } - } - }, - { - "apiVersion": "apps/v1", - "kind": "Deployment", - "metadata": { - "name": "hwlab-user-billing", - "namespace": "hwlab-v03", - "labels": { - "app.kubernetes.io/name": "hwlab-user-billing", - "hwlab.pikastech.local/service-id": "hwlab-user-billing", - "app.kubernetes.io/part-of": "hwlab", - "hwlab.pikastech.local/environment": "v03", - "hwlab.pikastech.local/profile": "v03", - "hwlab.pikastech.local/gitops-target": "v03", - "hwlab.pikastech.local/gitops-render-source-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f", - "hwlab.pikastech.local/source-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f", - "unidesk.ai/node-staging": "false", - "hwlab.pikastech.local/monitoring": "enabled" - }, - "annotations": { - "hwlab.pikastech.local/gitops-note": "node DEV GitOps target.", - "hwlab.pikastech.local/gitops-render-source-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f", - "hwlab.pikastech.local/source-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f" - } - }, - "spec": { - "replicas": 1, - "selector": { - "matchLabels": { - "app.kubernetes.io/name": "hwlab-user-billing", - "app.kubernetes.io/part-of": "hwlab", - "hwlab.pikastech.local/environment": "v03", - "hwlab.pikastech.local/profile": "v03" - } - }, - "template": { - "metadata": { - "labels": { - "app.kubernetes.io/name": "hwlab-user-billing", - "hwlab.pikastech.local/service-id": "hwlab-user-billing", - "app.kubernetes.io/part-of": "hwlab", - "hwlab.pikastech.local/environment": "v03", - "hwlab.pikastech.local/profile": "v03", - "hwlab.pikastech.local/gitops-target": "v03", - "hwlab.pikastech.local/gitops-render-source-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f", - "hwlab.pikastech.local/source-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f", - "hwlab.pikastech.local/artifact-source-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f", - "hwlab.pikastech.local/monitoring": "enabled", - "hwlab.pikastech.local/runtime-mode": "env-reuse-git-mirror-checkout", - "hwlab.pikastech.local/boot-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f" - }, - "annotations": { - "hwlab.pikastech.local/metrics-sidecar-sha256": "782e26256b5a5cddff52a165a0eb5f852973eee1aac1b19acac4a313db7968f4", - "hwlab.pikastech.local/gitops-render-source-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f", - "hwlab.pikastech.local/source-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f", - "hwlab.pikastech.local/artifact-source-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f", - "hwlab.pikastech.local/rendered-by": "scripts/gitops-render.mjs", - "hwlab.pikastech.local/runtime-mode": "env-reuse-git-mirror-checkout", - "hwlab.pikastech.local/boot-repo": "git@github.com:pikasTech/HWLAB.git", - "hwlab.pikastech.local/boot-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f", - "hwlab.pikastech.local/boot-sh": "deploy/runtime/boot/hwlab-user-billing.sh", - "hwlab.pikastech.local/environment-digest": "sha256:58ab902431ce98b91e1442b719d5ab67f474f3a09d04b72638686784ad7bc7c6", - "hwlab.pikastech.local/environment-input-hash": "9c9feb03b74fe5946ca36a3c8d264ab6cebc51bf0986c1c4bc0bc2b6d5ecaca7", - "hwlab.pikastech.local/code-input-hash": "1c7f8090dc17d9a7dfc7cdd0714e7294bb231db899c396b388e4ab3642e5134e" - } - }, - "spec": { - "containers": [ - { - "name": "hwlab-user-billing", - "image": "127.0.0.1:5000/hwlab/hwlab-user-billing-env@sha256:58ab902431ce98b91e1442b719d5ab67f474f3a09d04b72638686784ad7bc7c6", - "ports": [ - { - "name": "http", - "containerPort": 6670 - } - ], - "env": [ - { - "name": "HWLAB_USER_BILLING_PORT", - "value": "6670" - }, - { - "name": "HWLAB_USER_BILLING_STATE_AUTHORITY", - "value": "pk01-postgres" - }, - { - "name": "HWLAB_USER_BILLING_STATELESS", - "value": "true" - }, - { - "name": "TZ", - "value": "Asia/Shanghai" - }, - { - "name": "HWLAB_USER_BILLING_DB_URL", - "valueFrom": { - "secretKeyRef": { - "name": "hwlab-cloud-api-v03-db", - "key": "database-url", - "optional": true - } - } - }, - { - "name": "HWLAB_USER_BILLING_DB_POOL_MAX", - "value": "2" - }, - { - "name": "HWLAB_USER_BILLING_MIGRATION_TIMEOUT_SECONDS", - "value": "180" - }, - { - "name": "HWLAB_USER_BILLING_BOOTSTRAP_TIMEOUT_SECONDS", - "value": "60" - }, - { - "name": "HWLAB_BOOTSTRAP_ADMIN_ID", - "value": "usr_v03_admin" - }, - { - "name": "HWLAB_BOOTSTRAP_ADMIN_USERNAME", - "value": "admin" - }, - { - "name": "HWLAB_BOOTSTRAP_ADMIN_DISPLAY_NAME", - "value": "HWLAB v0.3 Admin" - }, - { - "name": "HWLAB_BOOTSTRAP_ADMIN_PASSWORD_HASH", - "valueFrom": { - "secretKeyRef": { - "name": "hwlab-v03-bootstrap-admin", - "key": "password-hash", - "optional": true - } - } - }, - { - "name": "HWLAB_USER_BILLING_EXTERNAL_DB_LABEL", - "value": "pk01-external-postgres" - }, - { - "name": "HWLAB_USER_BILLING_REGISTRATION_ENABLED", - "value": "1" - }, - { - "name": "HWLAB_USER_BILLING_INITIAL_CREDITS", - "value": "0" - }, - { - "name": "HWLAB_USER_BILLING_CREDIT_PER_1K_TOKENS", - "value": "1" - }, - { - "name": "HWLAB_USER_BILLING_MIGRATE_ON_START", - "value": "1" - }, - { - "name": "HWLAB_USER_BILLING_REDIS_URL", - "value": "redis://hwlab-user-billing-redis.hwlab-v03.svc.cluster.local:6379/0" - }, - { - "name": "OTEL_EXPORTER_OTLP_TRACES_ENDPOINT", - "value": "http://otel-collector.platform-infra.svc.cluster.local:4318/v1/traces" - }, - { - "name": "OTEL_SERVICE_NAME", - "value": "hwlab-user-billing" - }, - { - "name": "HWLAB_ENVIRONMENT", - "value": "v03" - }, - { - "name": "HWLAB_COMMIT_ID", - "value": "effbb79199d1117de0634904cdb019c5c0b0ee9f" - }, - { - "name": "HWLAB_IMAGE", - "value": "127.0.0.1:5000/hwlab/hwlab-user-billing-env@sha256:58ab902431ce98b91e1442b719d5ab67f474f3a09d04b72638686784ad7bc7c6" - }, - { - "name": "HWLAB_IMAGE_TAG", - "value": "env-9c9feb03b74f" - }, - { - "name": "HWLAB_GITOPS_TARGET", - "value": "v03" - }, - { - "name": "HWLAB_GITOPS_PROFILE", - "value": "v03" - }, - { - "name": "HWLAB_GITOPS_SOURCE_COMMIT", - "value": "effbb79199d1117de0634904cdb019c5c0b0ee9f" - }, - { - "name": "HWLAB_RUNTIME_MODE", - "value": "env-reuse-git-mirror-checkout" - }, - { - "name": "HWLAB_BOOT_REPO", - "value": "git@github.com:pikasTech/HWLAB.git" - }, - { - "name": "HWLAB_BOOT_COMMIT", - "value": "effbb79199d1117de0634904cdb019c5c0b0ee9f" - }, - { - "name": "HWLAB_BOOT_REF", - "value": "v0.3" - }, - { - "name": "HWLAB_BOOT_SH", - "value": "deploy/runtime/boot/hwlab-user-billing.sh" - }, - { - "name": "HWLAB_BOOT_READ_URL", - "value": "http://git-mirror-http.devops-infra.svc.cluster.local/pikasTech/HWLAB.git" - }, - { - "name": "HWLAB_ENVIRONMENT_IMAGE", - "value": "127.0.0.1:5000/hwlab/hwlab-user-billing-env:env-9c9feb03b74f" - }, - { - "name": "HWLAB_ENVIRONMENT_DIGEST", - "value": "sha256:58ab902431ce98b91e1442b719d5ab67f474f3a09d04b72638686784ad7bc7c6" - }, - { - "name": "HWLAB_ENVIRONMENT_INPUT_HASH", - "value": "9c9feb03b74fe5946ca36a3c8d264ab6cebc51bf0986c1c4bc0bc2b6d5ecaca7" - }, - { - "name": "HWLAB_CODE_INPUT_HASH", - "value": "1c7f8090dc17d9a7dfc7cdd0714e7294bb231db899c396b388e4ab3642e5134e" - }, - { - "name": "HWLAB_IMAGE_DIGEST", - "value": "sha256:58ab902431ce98b91e1442b719d5ab67f474f3a09d04b72638686784ad7bc7c6" - } - ], - "readinessProbe": { - "httpGet": { - "path": "/health/ready", - "port": "http" - }, - "timeoutSeconds": 10, - "failureThreshold": 5 - }, - "livenessProbe": { - "httpGet": { - "path": "/health/live", - "port": "http" - }, - "timeoutSeconds": 5, - "failureThreshold": 6 - }, - "imagePullPolicy": "IfNotPresent", - "startupProbe": { - "httpGet": { - "path": "/health/ready", - "port": "http" - }, - "periodSeconds": 10, - "timeoutSeconds": 10, - "failureThreshold": 30, - "successThreshold": 1 - } - }, - { - "name": "hwlab-metrics", - "image": "127.0.0.1:5000/hwlab/hwlab-ci-node-tools:node22-alpine-bun-v1", - "imagePullPolicy": "IfNotPresent", - "command": [ - "node", - "/metrics/metrics-sidecar.mjs" - ], - "env": [ - { - "name": "HWLAB_METRICS_SERVICE_ID", - "value": "hwlab-user-billing" - }, - { - "name": "HWLAB_METRICS_NAMESPACE", - "value": "hwlab-v03" - }, - { - "name": "HWLAB_METRICS_GITOPS_TARGET", - "value": "v03" - }, - { - "name": "HWLAB_METRICS_PORT", - "value": "9100" - }, - { - "name": "HWLAB_METRICS_TARGET_URL", - "value": "http://127.0.0.1:6670/health/ready" - }, - { - "name": "HWLAB_METRICS_TARGET_TIMEOUT_MS", - "value": "2000" - } - ], - "ports": [ - { - "name": "metrics", - "containerPort": 9100 - } - ], - "readinessProbe": { - "httpGet": { - "path": "/health/live", - "port": "metrics" - }, - "initialDelaySeconds": 3, - "periodSeconds": 10 - }, - "livenessProbe": { - "httpGet": { - "path": "/health/live", - "port": "metrics" - }, - "initialDelaySeconds": 10, - "periodSeconds": 20 - }, - "volumeMounts": [ - { - "name": "hwlab-metrics-sidecar", - "mountPath": "/metrics", - "readOnly": true - } - ] - } - ], - "volumes": [ - { - "name": "hwlab-metrics-sidecar", - "configMap": { - "name": "hwlab-v03-metrics-sidecar" - } - } - ] - } - } - } - }, - { - "apiVersion": "apps/v1", - "kind": "Deployment", - "metadata": { - "name": "hwlab-cloud-web", - "namespace": "hwlab-v03", - "labels": { - "app.kubernetes.io/name": "hwlab-cloud-web", - "hwlab.pikastech.local/service-id": "hwlab-cloud-web", - "app.kubernetes.io/part-of": "hwlab", - "hwlab.pikastech.local/environment": "v03", - "hwlab.pikastech.local/profile": "v03", - "hwlab.pikastech.local/gitops-target": "v03", - "hwlab.pikastech.local/gitops-render-source-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f", - "hwlab.pikastech.local/source-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f", - "unidesk.ai/node-staging": "false", - "hwlab.pikastech.local/monitoring": "enabled" - }, - "annotations": { - "hwlab.pikastech.local/gitops-note": "node DEV GitOps target.", - "hwlab.pikastech.local/gitops-render-source-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f", - "hwlab.pikastech.local/source-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f" - } - }, - "spec": { - "replicas": 1, - "selector": { - "matchLabels": { - "app.kubernetes.io/name": "hwlab-cloud-web", - "app.kubernetes.io/part-of": "hwlab", - "hwlab.pikastech.local/environment": "v03", - "hwlab.pikastech.local/profile": "v03" - } - }, - "template": { - "metadata": { - "labels": { - "app.kubernetes.io/name": "hwlab-cloud-web", - "hwlab.pikastech.local/service-id": "hwlab-cloud-web", - "app.kubernetes.io/part-of": "hwlab", - "hwlab.pikastech.local/environment": "v03", - "hwlab.pikastech.local/profile": "v03", - "hwlab.pikastech.local/gitops-target": "v03", - "hwlab.pikastech.local/gitops-render-source-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f", - "hwlab.pikastech.local/source-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f", - "hwlab.pikastech.local/artifact-source-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f", - "hwlab.pikastech.local/monitoring": "enabled", - "hwlab.pikastech.local/runtime-mode": "env-reuse-git-mirror-checkout", - "hwlab.pikastech.local/boot-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f" - }, - "annotations": { - "hwlab.pikastech.local/metrics-sidecar-sha256": "782e26256b5a5cddff52a165a0eb5f852973eee1aac1b19acac4a313db7968f4", - "hwlab.pikastech.local/gitops-render-source-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f", - "hwlab.pikastech.local/source-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f", - "hwlab.pikastech.local/artifact-source-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f", - "hwlab.pikastech.local/rendered-by": "scripts/gitops-render.mjs", - "hwlab.pikastech.local/runtime-mode": "env-reuse-git-mirror-checkout", - "hwlab.pikastech.local/boot-repo": "git@github.com:pikasTech/HWLAB.git", - "hwlab.pikastech.local/boot-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f", - "hwlab.pikastech.local/boot-sh": "deploy/runtime/boot/hwlab-cloud-web.sh", - "hwlab.pikastech.local/environment-digest": "sha256:35be9f812c9aef6d989caf83def79bdfe5dca42f461d9f99fb34622b38ff9b2f", - "hwlab.pikastech.local/environment-input-hash": "f5109d26020b05d9023ab1a6dd4e34ed07c9bbca03fc8d0a4697cc208c85a175", - "hwlab.pikastech.local/code-input-hash": "a30d3b6d134dd5e18879523ba0022838e879eb06f3bfb0753eca9d236d7d7780" - } - }, - "spec": { - "containers": [ - { - "name": "hwlab-cloud-web", - "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web-env@sha256:35be9f812c9aef6d989caf83def79bdfe5dca42f461d9f99fb34622b38ff9b2f", - "ports": [ - { - "name": "http", - "containerPort": 8080 - } - ], - "env": [ - { - "name": "HWLAB_API_BASE_URL", - "value": "http://hwlab-cloud-api.hwlab-v03.svc.cluster.local:6667" - }, - { - "name": "HWLAB_CLOUD_WEB_PROXY_TIMEOUT_MS", - "value": "1260000" - }, - { - "name": "HWLAB_COMMIT_ID", - "value": "effbb79199d1117de0634904cdb019c5c0b0ee9f" - }, - { - "name": "HWLAB_IMAGE", - "value": "127.0.0.1:5000/hwlab/hwlab-cloud-web-env@sha256:35be9f812c9aef6d989caf83def79bdfe5dca42f461d9f99fb34622b38ff9b2f" - }, - { - "name": "HWLAB_IMAGE_TAG", - "value": "env-f5109d26020b" - }, - { - "name": "HWLAB_ENVIRONMENT", - "value": "v03" - }, - { - "name": "HWLAB_CLOUD_WEB_DISPLAY_TIME_ZONE", - "value": "Asia/Shanghai" - }, - { - "name": "HWLAB_CLOUD_WEB_DISPLAY_TIME_LOCALE", - "value": "zh-CN" - }, - { - "name": "HWLAB_CLOUD_WEB_DISPLAY_TIME_LABEL", - "value": "北京时间" - }, - { - "name": "HWLAB_CLOUD_WEB_OPENCODE_UPSTREAM_URL", - "value": "http://opencode-server.hwlab-v03.svc.cluster.local:4096" - }, - { - "name": "HWLAB_CLOUD_WEB_OPENCODE_USERNAME", - "valueFrom": { - "secretKeyRef": { - "name": "hwlab-v03-opencode-server-auth", - "key": "username", - "optional": true - } - } - }, - { - "name": "HWLAB_CLOUD_WEB_OPENCODE_PASSWORD", - "valueFrom": { - "secretKeyRef": { - "name": "hwlab-v03-opencode-server-auth", - "key": "password", - "optional": true - } - } - }, - { - "name": "HWLAB_CLOUD_WEB_OPENCODE_DEFAULT_PROJECT", - "value": "/workspace" - }, - { - "name": "HWLAB_CLOUD_WEB_OPENCODE_EVENT_DIRECTORY_FROM", - "value": "/workspace" - }, - { - "name": "HWLAB_CLOUD_WEB_OPENCODE_EVENT_DIRECTORY_TO", - "value": "/" - }, - { - "name": "OTEL_EXPORTER_OTLP_TRACES_ENDPOINT", - "value": "http://otel-collector.platform-infra.svc.cluster.local:4318/v1/traces" - }, - { - "name": "OTEL_SERVICE_NAME", - "value": "hwlab-cloud-web" - }, - { - "name": "HWLAB_GITOPS_TARGET", - "value": "v03" - }, - { - "name": "HWLAB_GITOPS_PROFILE", - "value": "v03" - }, - { - "name": "HWLAB_GITOPS_SOURCE_COMMIT", - "value": "effbb79199d1117de0634904cdb019c5c0b0ee9f" - }, - { - "name": "HWLAB_RUNTIME_MODE", - "value": "env-reuse-git-mirror-checkout" - }, - { - "name": "HWLAB_BOOT_REPO", - "value": "git@github.com:pikasTech/HWLAB.git" - }, - { - "name": "HWLAB_BOOT_COMMIT", - "value": "effbb79199d1117de0634904cdb019c5c0b0ee9f" - }, - { - "name": "HWLAB_BOOT_REF", - "value": "v0.3" - }, - { - "name": "HWLAB_BOOT_SH", - "value": "deploy/runtime/boot/hwlab-cloud-web.sh" - }, - { - "name": "HWLAB_BOOT_READ_URL", - "value": "http://git-mirror-http.devops-infra.svc.cluster.local/pikasTech/HWLAB.git" - }, - { - "name": "HWLAB_ENVIRONMENT_IMAGE", - "value": "127.0.0.1:5000/hwlab/hwlab-cloud-web-env:env-f5109d26020b" - }, - { - "name": "HWLAB_ENVIRONMENT_DIGEST", - "value": "sha256:35be9f812c9aef6d989caf83def79bdfe5dca42f461d9f99fb34622b38ff9b2f" - }, - { - "name": "HWLAB_ENVIRONMENT_INPUT_HASH", - "value": "f5109d26020b05d9023ab1a6dd4e34ed07c9bbca03fc8d0a4697cc208c85a175" - }, - { - "name": "HWLAB_CODE_INPUT_HASH", - "value": "a30d3b6d134dd5e18879523ba0022838e879eb06f3bfb0753eca9d236d7d7780" - }, - { - "name": "HWLAB_IMAGE_DIGEST", - "value": "sha256:35be9f812c9aef6d989caf83def79bdfe5dca42f461d9f99fb34622b38ff9b2f" - }, - { - "name": "HWLAB_PUBLIC_ENDPOINT", - "value": "https://hwlab-v03.74-48-78-17.nip.io" - }, - { - "name": "HWLAB_WORKBENCH_TRACE_AUTO_EXPAND_RUNNING", - "value": "0" - }, - { - "name": "HWLAB_WORKBENCH_TRACE_AUTO_COLLAPSE_TERMINAL", - "value": "0" - }, - { - "name": "HWLAB_WORKBENCH_TRACE_EXPLORER_URL_TEMPLATE", - "value": "/v1/workbench/traces/{trace_id}/events" - } - ], - "readinessProbe": { - "httpGet": { - "path": "/health/live", - "port": "http" - } - }, - "livenessProbe": { - "httpGet": { - "path": "/health/live", - "port": "http" - } - }, - "imagePullPolicy": "IfNotPresent", - "startupProbe": { - "httpGet": { - "path": "/health/live", - "port": "http" - }, - "periodSeconds": 10, - "timeoutSeconds": 2, - "failureThreshold": 30, - "successThreshold": 1 - } - }, - { - "name": "hwlab-metrics", - "image": "127.0.0.1:5000/hwlab/hwlab-ci-node-tools:node22-alpine-bun-v1", - "imagePullPolicy": "IfNotPresent", - "command": [ - "node", - "/metrics/metrics-sidecar.mjs" - ], - "env": [ - { - "name": "HWLAB_METRICS_SERVICE_ID", - "value": "hwlab-cloud-web" - }, - { - "name": "HWLAB_METRICS_NAMESPACE", - "value": "hwlab-v03" - }, - { - "name": "HWLAB_METRICS_GITOPS_TARGET", - "value": "v03" - }, - { - "name": "HWLAB_METRICS_PORT", - "value": "9100" - }, - { - "name": "HWLAB_METRICS_TARGET_URL", - "value": "http://127.0.0.1:8080/health/live" - }, - { - "name": "HWLAB_METRICS_TARGET_TIMEOUT_MS", - "value": "2000" - } - ], - "ports": [ - { - "name": "metrics", - "containerPort": 9100 - } - ], - "readinessProbe": { - "httpGet": { - "path": "/health/live", - "port": "metrics" - }, - "initialDelaySeconds": 3, - "periodSeconds": 10 - }, - "livenessProbe": { - "httpGet": { - "path": "/health/live", - "port": "metrics" - }, - "initialDelaySeconds": 10, - "periodSeconds": 20 - }, - "volumeMounts": [ - { - "name": "hwlab-metrics-sidecar", - "mountPath": "/metrics", - "readOnly": true - } - ] - } - ], - "volumes": [ - { - "name": "hwlab-metrics-sidecar", - "configMap": { - "name": "hwlab-v03-metrics-sidecar" - } - } - ] - } - } - } - }, - { - "apiVersion": "apps/v1", - "kind": "Deployment", - "metadata": { - "name": "hwlab-gateway", - "namespace": "hwlab-v03", - "labels": { - "app.kubernetes.io/name": "hwlab-gateway", - "hwlab.pikastech.local/service-id": "hwlab-gateway", - "hwlab.pikastech.local/activation": "manual", - "app.kubernetes.io/part-of": "hwlab", - "hwlab.pikastech.local/environment": "v03", - "hwlab.pikastech.local/profile": "v03", - "hwlab.pikastech.local/gitops-target": "v03", - "hwlab.pikastech.local/gitops-render-source-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f", - "hwlab.pikastech.local/source-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f", - "unidesk.ai/node-staging": "false" - }, - "annotations": { - "hwlab.pikastech.local/gitops-note": "node DEV GitOps target.", - "hwlab.pikastech.local/gitops-render-source-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f", - "hwlab.pikastech.local/source-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f" - } - }, - "spec": { - "replicas": 0, - "selector": { - "matchLabels": { - "app.kubernetes.io/name": "hwlab-gateway", - "app.kubernetes.io/part-of": "hwlab", - "hwlab.pikastech.local/environment": "v03", - "hwlab.pikastech.local/profile": "v03" - } - }, - "template": { - "metadata": { - "labels": { - "app.kubernetes.io/name": "hwlab-gateway", - "hwlab.pikastech.local/service-id": "hwlab-gateway", - "app.kubernetes.io/part-of": "hwlab", - "hwlab.pikastech.local/environment": "v03", - "hwlab.pikastech.local/profile": "v03", - "hwlab.pikastech.local/gitops-target": "v03", - "hwlab.pikastech.local/gitops-render-source-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f", - "hwlab.pikastech.local/source-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f", - "hwlab.pikastech.local/artifact-source-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f", - "hwlab.pikastech.local/runtime-mode": "env-reuse-git-mirror-checkout", - "hwlab.pikastech.local/boot-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f" - }, - "annotations": { - "hwlab.pikastech.local/gitops-render-source-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f", - "hwlab.pikastech.local/source-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f", - "hwlab.pikastech.local/artifact-source-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f", - "hwlab.pikastech.local/rendered-by": "scripts/gitops-render.mjs", - "hwlab.pikastech.local/runtime-mode": "env-reuse-git-mirror-checkout", - "hwlab.pikastech.local/boot-repo": "git@github.com:pikasTech/HWLAB.git", - "hwlab.pikastech.local/boot-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f", - "hwlab.pikastech.local/boot-sh": "deploy/runtime/boot/hwlab-gateway.sh", - "hwlab.pikastech.local/environment-digest": "sha256:b76f2121c080362affe89bdb21b1b55e9e42fabd15c31392b20ab5bc5018e964", - "hwlab.pikastech.local/environment-input-hash": "f5109d26020b05d9023ab1a6dd4e34ed07c9bbca03fc8d0a4697cc208c85a175", - "hwlab.pikastech.local/code-input-hash": "9693556c71091e3e85d61efc6ef7d62e1064fba145ec83b3b9c196477f0b2870" - } - }, - "spec": { - "containers": [ - { - "name": "hwlab-gateway", - "image": "127.0.0.1:5000/hwlab/hwlab-gateway-env@sha256:b76f2121c080362affe89bdb21b1b55e9e42fabd15c31392b20ab5bc5018e964", - "ports": [ - { - "name": "http", - "containerPort": 7001 - } - ], - "env": [ - { - "name": "HWLAB_GATEWAY_MODE", - "value": "hardware-boundary" - }, - { - "name": "HWLAB_ENVIRONMENT", - "value": "v03" - }, - { - "name": "TZ", - "value": "Asia/Shanghai" - }, - { - "name": "HWLAB_COMMIT_ID", - "value": "effbb79199d1117de0634904cdb019c5c0b0ee9f" - }, - { - "name": "HWLAB_IMAGE", - "value": "127.0.0.1:5000/hwlab/hwlab-gateway-env@sha256:b76f2121c080362affe89bdb21b1b55e9e42fabd15c31392b20ab5bc5018e964" - }, - { - "name": "HWLAB_IMAGE_TAG", - "value": "env-f5109d26020b" - }, - { - "name": "HWLAB_GITOPS_TARGET", - "value": "v03" - }, - { - "name": "HWLAB_GITOPS_PROFILE", - "value": "v03" - }, - { - "name": "HWLAB_GITOPS_SOURCE_COMMIT", - "value": "effbb79199d1117de0634904cdb019c5c0b0ee9f" - }, - { - "name": "HWLAB_RUNTIME_MODE", - "value": "env-reuse-git-mirror-checkout" - }, - { - "name": "HWLAB_BOOT_REPO", - "value": "git@github.com:pikasTech/HWLAB.git" - }, - { - "name": "HWLAB_BOOT_COMMIT", - "value": "effbb79199d1117de0634904cdb019c5c0b0ee9f" - }, - { - "name": "HWLAB_BOOT_REF", - "value": "v0.3" - }, - { - "name": "HWLAB_BOOT_SH", - "value": "deploy/runtime/boot/hwlab-gateway.sh" - }, - { - "name": "HWLAB_BOOT_READ_URL", - "value": "http://git-mirror-http.devops-infra.svc.cluster.local/pikasTech/HWLAB.git" - }, - { - "name": "HWLAB_ENVIRONMENT_IMAGE", - "value": "127.0.0.1:5000/hwlab/hwlab-gateway-env:env-f5109d26020b" - }, - { - "name": "HWLAB_ENVIRONMENT_DIGEST", - "value": "sha256:b76f2121c080362affe89bdb21b1b55e9e42fabd15c31392b20ab5bc5018e964" - }, - { - "name": "HWLAB_ENVIRONMENT_INPUT_HASH", - "value": "f5109d26020b05d9023ab1a6dd4e34ed07c9bbca03fc8d0a4697cc208c85a175" - }, - { - "name": "HWLAB_CODE_INPUT_HASH", - "value": "9693556c71091e3e85d61efc6ef7d62e1064fba145ec83b3b9c196477f0b2870" - }, - { - "name": "HWLAB_IMAGE_DIGEST", - "value": "sha256:b76f2121c080362affe89bdb21b1b55e9e42fabd15c31392b20ab5bc5018e964" - } - ], - "readinessProbe": { - "httpGet": { - "path": "/health/live", - "port": "http" - } - }, - "livenessProbe": { - "httpGet": { - "path": "/health/live", - "port": "http" - } - }, - "imagePullPolicy": "IfNotPresent", - "startupProbe": { - "httpGet": { - "path": "/health/live", - "port": "http" - }, - "periodSeconds": 10, - "timeoutSeconds": 2, - "failureThreshold": 30, - "successThreshold": 1 - } - } - ] - } - } - } - }, - { - "apiVersion": "apps/v1", - "kind": "Deployment", - "metadata": { - "name": "hwlab-edge-proxy", - "namespace": "hwlab-v03", - "labels": { - "app.kubernetes.io/name": "hwlab-edge-proxy", - "hwlab.pikastech.local/service-id": "hwlab-edge-proxy", - "app.kubernetes.io/part-of": "hwlab", - "hwlab.pikastech.local/environment": "v03", - "hwlab.pikastech.local/profile": "v03", - "hwlab.pikastech.local/gitops-target": "v03", - "hwlab.pikastech.local/gitops-render-source-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f", - "hwlab.pikastech.local/source-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f", - "unidesk.ai/node-staging": "false", - "hwlab.pikastech.local/monitoring": "enabled" - }, - "annotations": { - "hwlab.pikastech.local/gitops-note": "node DEV GitOps target.", - "hwlab.pikastech.local/gitops-render-source-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f", - "hwlab.pikastech.local/source-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f" - } - }, - "spec": { - "replicas": 1, - "selector": { - "matchLabels": { - "app.kubernetes.io/name": "hwlab-edge-proxy", - "app.kubernetes.io/part-of": "hwlab", - "hwlab.pikastech.local/environment": "v03", - "hwlab.pikastech.local/profile": "v03" - } - }, - "template": { - "metadata": { - "labels": { - "app.kubernetes.io/name": "hwlab-edge-proxy", - "hwlab.pikastech.local/service-id": "hwlab-edge-proxy", - "app.kubernetes.io/part-of": "hwlab", - "hwlab.pikastech.local/environment": "v03", - "hwlab.pikastech.local/profile": "v03", - "hwlab.pikastech.local/gitops-target": "v03", - "hwlab.pikastech.local/gitops-render-source-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f", - "hwlab.pikastech.local/source-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f", - "hwlab.pikastech.local/artifact-source-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f", - "hwlab.pikastech.local/monitoring": "enabled", - "hwlab.pikastech.local/runtime-mode": "env-reuse-git-mirror-checkout", - "hwlab.pikastech.local/boot-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f" - }, - "annotations": { - "hwlab.pikastech.local/metrics-sidecar-sha256": "782e26256b5a5cddff52a165a0eb5f852973eee1aac1b19acac4a313db7968f4", - "hwlab.pikastech.local/gitops-render-source-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f", - "hwlab.pikastech.local/source-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f", - "hwlab.pikastech.local/artifact-source-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f", - "hwlab.pikastech.local/rendered-by": "scripts/gitops-render.mjs", - "hwlab.pikastech.local/runtime-mode": "env-reuse-git-mirror-checkout", - "hwlab.pikastech.local/boot-repo": "git@github.com:pikasTech/HWLAB.git", - "hwlab.pikastech.local/boot-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f", - "hwlab.pikastech.local/boot-sh": "deploy/runtime/boot/hwlab-edge-proxy.sh", - "hwlab.pikastech.local/environment-digest": "sha256:f676f4feed046fadfc36f4ec21608f2531559f70ee647ebad2b311967f55a028", - "hwlab.pikastech.local/environment-input-hash": "f5109d26020b05d9023ab1a6dd4e34ed07c9bbca03fc8d0a4697cc208c85a175", - "hwlab.pikastech.local/code-input-hash": "c97d19939c872e128a6931bdf73f28a75a684948a76a2b1af37508dd47481544" - } - }, - "spec": { - "containers": [ - { - "name": "hwlab-edge-proxy", - "image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy-env@sha256:f676f4feed046fadfc36f4ec21608f2531559f70ee647ebad2b311967f55a028", - "ports": [ - { - "name": "http", - "containerPort": 6667 - } - ], - "env": [ - { - "name": "HWLAB_EDGE_LISTEN", - "value": "0.0.0.0:6667" - }, - { - "name": "HWLAB_EDGE_UPSTREAM", - "value": "http://hwlab-cloud-api.hwlab-v03.svc.cluster.local:6667" - }, - { - "name": "HWLAB_EDGE_PROXY_TIMEOUT_MS", - "value": "1260000" - }, - { - "name": "HWLAB_EDGE_IDLE_TIMEOUT_SECONDS", - "value": "120" - }, - { - "name": "TZ", - "value": "Asia/Shanghai" - }, - { - "name": "HWLAB_ENVIRONMENT", - "value": "v03" - }, - { - "name": "HWLAB_COMMIT_ID", - "value": "effbb79199d1117de0634904cdb019c5c0b0ee9f" - }, - { - "name": "HWLAB_IMAGE", - "value": "127.0.0.1:5000/hwlab/hwlab-edge-proxy-env@sha256:f676f4feed046fadfc36f4ec21608f2531559f70ee647ebad2b311967f55a028" - }, - { - "name": "HWLAB_IMAGE_TAG", - "value": "env-f5109d26020b" - }, - { - "name": "HWLAB_GITOPS_TARGET", - "value": "v03" - }, - { - "name": "HWLAB_GITOPS_PROFILE", - "value": "v03" - }, - { - "name": "HWLAB_GITOPS_SOURCE_COMMIT", - "value": "effbb79199d1117de0634904cdb019c5c0b0ee9f" - }, - { - "name": "HWLAB_RUNTIME_MODE", - "value": "env-reuse-git-mirror-checkout" - }, - { - "name": "HWLAB_BOOT_REPO", - "value": "git@github.com:pikasTech/HWLAB.git" - }, - { - "name": "HWLAB_BOOT_COMMIT", - "value": "effbb79199d1117de0634904cdb019c5c0b0ee9f" - }, - { - "name": "HWLAB_BOOT_REF", - "value": "v0.3" - }, - { - "name": "HWLAB_BOOT_SH", - "value": "deploy/runtime/boot/hwlab-edge-proxy.sh" - }, - { - "name": "HWLAB_BOOT_READ_URL", - "value": "http://git-mirror-http.devops-infra.svc.cluster.local/pikasTech/HWLAB.git" - }, - { - "name": "HWLAB_ENVIRONMENT_IMAGE", - "value": "127.0.0.1:5000/hwlab/hwlab-edge-proxy-env:env-f5109d26020b" - }, - { - "name": "HWLAB_ENVIRONMENT_DIGEST", - "value": "sha256:f676f4feed046fadfc36f4ec21608f2531559f70ee647ebad2b311967f55a028" - }, - { - "name": "HWLAB_ENVIRONMENT_INPUT_HASH", - "value": "f5109d26020b05d9023ab1a6dd4e34ed07c9bbca03fc8d0a4697cc208c85a175" - }, - { - "name": "HWLAB_CODE_INPUT_HASH", - "value": "c97d19939c872e128a6931bdf73f28a75a684948a76a2b1af37508dd47481544" - }, - { - "name": "HWLAB_IMAGE_DIGEST", - "value": "sha256:f676f4feed046fadfc36f4ec21608f2531559f70ee647ebad2b311967f55a028" - }, - { - "name": "HWLAB_PUBLIC_ENDPOINT", - "value": "https://hwlab-v03.74-48-78-17.nip.io" - } - ], - "readinessProbe": { - "httpGet": { - "path": "/health", - "port": "http" - }, - "timeoutSeconds": 3, - "failureThreshold": 5 - }, - "livenessProbe": { - "httpGet": { - "path": "/health", - "port": "http" - }, - "periodSeconds": 20, - "timeoutSeconds": 5, - "failureThreshold": 6 - }, - "imagePullPolicy": "IfNotPresent", - "startupProbe": { - "httpGet": { - "path": "/health/live", - "port": "http" - }, - "periodSeconds": 10, - "timeoutSeconds": 3, - "failureThreshold": 30, - "successThreshold": 1 - } - }, - { - "name": "hwlab-metrics", - "image": "127.0.0.1:5000/hwlab/hwlab-ci-node-tools:node22-alpine-bun-v1", - "imagePullPolicy": "IfNotPresent", - "command": [ - "node", - "/metrics/metrics-sidecar.mjs" - ], - "env": [ - { - "name": "HWLAB_METRICS_SERVICE_ID", - "value": "hwlab-edge-proxy" - }, - { - "name": "HWLAB_METRICS_NAMESPACE", - "value": "hwlab-v03" - }, - { - "name": "HWLAB_METRICS_GITOPS_TARGET", - "value": "v03" - }, - { - "name": "HWLAB_METRICS_PORT", - "value": "9100" - }, - { - "name": "HWLAB_METRICS_TARGET_URL", - "value": "http://127.0.0.1:6667/health" - }, - { - "name": "HWLAB_METRICS_TARGET_TIMEOUT_MS", - "value": "2000" - } - ], - "ports": [ - { - "name": "metrics", - "containerPort": 9100 - } - ], - "readinessProbe": { - "httpGet": { - "path": "/health/live", - "port": "metrics" - }, - "initialDelaySeconds": 3, - "periodSeconds": 10 - }, - "livenessProbe": { - "httpGet": { - "path": "/health/live", - "port": "metrics" - }, - "initialDelaySeconds": 10, - "periodSeconds": 20 - }, - "volumeMounts": [ - { - "name": "hwlab-metrics-sidecar", - "mountPath": "/metrics", - "readOnly": true - } - ] - } - ], - "volumes": [ - { - "name": "hwlab-metrics-sidecar", - "configMap": { - "name": "hwlab-v03-metrics-sidecar" - } - } - ] - } - } - } - }, - { - "apiVersion": "apps/v1", - "kind": "Deployment", - "metadata": { - "name": "hwlab-agent-skills", - "namespace": "hwlab-v03", - "labels": { - "app.kubernetes.io/name": "hwlab-agent-skills", - "hwlab.pikastech.local/service-id": "hwlab-agent-skills", - "app.kubernetes.io/part-of": "hwlab", - "hwlab.pikastech.local/environment": "v03", - "hwlab.pikastech.local/profile": "v03", - "hwlab.pikastech.local/gitops-target": "v03", - "hwlab.pikastech.local/gitops-render-source-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f", - "hwlab.pikastech.local/source-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f", - "unidesk.ai/node-staging": "false", - "hwlab.pikastech.local/monitoring": "enabled" - }, - "annotations": { - "hwlab.pikastech.local/gitops-note": "node DEV GitOps target.", - "hwlab.pikastech.local/gitops-render-source-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f", - "hwlab.pikastech.local/source-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f" - } - }, - "spec": { - "replicas": 1, - "selector": { - "matchLabels": { - "app.kubernetes.io/name": "hwlab-agent-skills", - "app.kubernetes.io/part-of": "hwlab", - "hwlab.pikastech.local/environment": "v03", - "hwlab.pikastech.local/profile": "v03" - } - }, - "template": { - "metadata": { - "labels": { - "app.kubernetes.io/name": "hwlab-agent-skills", - "hwlab.pikastech.local/service-id": "hwlab-agent-skills", - "app.kubernetes.io/part-of": "hwlab", - "hwlab.pikastech.local/environment": "v03", - "hwlab.pikastech.local/profile": "v03", - "hwlab.pikastech.local/gitops-target": "v03", - "hwlab.pikastech.local/gitops-render-source-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f", - "hwlab.pikastech.local/source-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f", - "hwlab.pikastech.local/artifact-source-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f", - "hwlab.pikastech.local/monitoring": "enabled", - "hwlab.pikastech.local/runtime-mode": "env-reuse-git-mirror-checkout", - "hwlab.pikastech.local/boot-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f" - }, - "annotations": { - "hwlab.pikastech.local/metrics-sidecar-sha256": "782e26256b5a5cddff52a165a0eb5f852973eee1aac1b19acac4a313db7968f4", - "hwlab.pikastech.local/gitops-render-source-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f", - "hwlab.pikastech.local/source-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f", - "hwlab.pikastech.local/artifact-source-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f", - "hwlab.pikastech.local/rendered-by": "scripts/gitops-render.mjs", - "hwlab.pikastech.local/runtime-mode": "env-reuse-git-mirror-checkout", - "hwlab.pikastech.local/boot-repo": "git@github.com:pikasTech/HWLAB.git", - "hwlab.pikastech.local/boot-commit": "effbb79199d1117de0634904cdb019c5c0b0ee9f", - "hwlab.pikastech.local/boot-sh": "deploy/runtime/boot/hwlab-agent-skills.sh", - "hwlab.pikastech.local/environment-digest": "sha256:c5f17f44cbca65aa5c9d0d0dc53e1f136163b44f234e7d052b411ba9d54b0eaf", - "hwlab.pikastech.local/environment-input-hash": "f5109d26020b05d9023ab1a6dd4e34ed07c9bbca03fc8d0a4697cc208c85a175", - "hwlab.pikastech.local/code-input-hash": "369ca524ae4010fb5d9adfd30b4290808a035804b4674755bc193fee743f3d5a" - } - }, - "spec": { - "containers": [ - { - "name": "hwlab-agent-skills", - "image": "127.0.0.1:5000/hwlab/hwlab-agent-skills-env@sha256:c5f17f44cbca65aa5c9d0d0dc53e1f136163b44f234e7d052b411ba9d54b0eaf", - "ports": [ - { - "name": "http", - "containerPort": 7430 - } - ], - "env": [ - { - "name": "HWLAB_SKILLS_COMMIT_ID", - "value": "effbb79199d1117de0634904cdb019c5c0b0ee9f" - }, - { - "name": "TZ", - "value": "Asia/Shanghai" - }, - { - "name": "HWLAB_ENVIRONMENT", - "value": "v03" - }, - { - "name": "HWLAB_COMMIT_ID", - "value": "effbb79199d1117de0634904cdb019c5c0b0ee9f" - }, - { - "name": "HWLAB_IMAGE", - "value": "127.0.0.1:5000/hwlab/hwlab-agent-skills-env@sha256:c5f17f44cbca65aa5c9d0d0dc53e1f136163b44f234e7d052b411ba9d54b0eaf" - }, - { - "name": "HWLAB_IMAGE_TAG", - "value": "env-f5109d26020b" - }, - { - "name": "HWLAB_GITOPS_TARGET", - "value": "v03" - }, - { - "name": "HWLAB_GITOPS_PROFILE", - "value": "v03" - }, - { - "name": "HWLAB_GITOPS_SOURCE_COMMIT", - "value": "effbb79199d1117de0634904cdb019c5c0b0ee9f" - }, - { - "name": "HWLAB_RUNTIME_MODE", - "value": "env-reuse-git-mirror-checkout" - }, - { - "name": "HWLAB_BOOT_REPO", - "value": "git@github.com:pikasTech/HWLAB.git" - }, - { - "name": "HWLAB_BOOT_COMMIT", - "value": "effbb79199d1117de0634904cdb019c5c0b0ee9f" - }, - { - "name": "HWLAB_BOOT_REF", - "value": "v0.3" - }, - { - "name": "HWLAB_BOOT_SH", - "value": "deploy/runtime/boot/hwlab-agent-skills.sh" - }, - { - "name": "HWLAB_BOOT_READ_URL", - "value": "http://git-mirror-http.devops-infra.svc.cluster.local/pikasTech/HWLAB.git" - }, - { - "name": "HWLAB_ENVIRONMENT_IMAGE", - "value": "127.0.0.1:5000/hwlab/hwlab-agent-skills-env:env-f5109d26020b" - }, - { - "name": "HWLAB_ENVIRONMENT_DIGEST", - "value": "sha256:c5f17f44cbca65aa5c9d0d0dc53e1f136163b44f234e7d052b411ba9d54b0eaf" - }, - { - "name": "HWLAB_ENVIRONMENT_INPUT_HASH", - "value": "f5109d26020b05d9023ab1a6dd4e34ed07c9bbca03fc8d0a4697cc208c85a175" - }, - { - "name": "HWLAB_CODE_INPUT_HASH", - "value": "369ca524ae4010fb5d9adfd30b4290808a035804b4674755bc193fee743f3d5a" - }, - { - "name": "HWLAB_IMAGE_DIGEST", - "value": "sha256:c5f17f44cbca65aa5c9d0d0dc53e1f136163b44f234e7d052b411ba9d54b0eaf" - } - ], - "readinessProbe": { - "httpGet": { - "path": "/health/live", - "port": "http" - } - }, - "livenessProbe": { - "httpGet": { - "path": "/health/live", - "port": "http" - } - }, - "imagePullPolicy": "IfNotPresent", - "startupProbe": { - "httpGet": { - "path": "/health/live", - "port": "http" - }, - "periodSeconds": 10, - "timeoutSeconds": 2, - "failureThreshold": 30, - "successThreshold": 1 - } - }, - { - "name": "hwlab-metrics", - "image": "127.0.0.1:5000/hwlab/hwlab-ci-node-tools:node22-alpine-bun-v1", - "imagePullPolicy": "IfNotPresent", - "command": [ - "node", - "/metrics/metrics-sidecar.mjs" - ], - "env": [ - { - "name": "HWLAB_METRICS_SERVICE_ID", - "value": "hwlab-agent-skills" - }, - { - "name": "HWLAB_METRICS_NAMESPACE", - "value": "hwlab-v03" - }, - { - "name": "HWLAB_METRICS_GITOPS_TARGET", - "value": "v03" - }, - { - "name": "HWLAB_METRICS_PORT", - "value": "9100" - }, - { - "name": "HWLAB_METRICS_TARGET_URL", - "value": "http://127.0.0.1:7430/health/live" - }, - { - "name": "HWLAB_METRICS_TARGET_TIMEOUT_MS", - "value": "2000" - } - ], - "ports": [ - { - "name": "metrics", - "containerPort": 9100 - } - ], - "readinessProbe": { - "httpGet": { - "path": "/health/live", - "port": "metrics" - }, - "initialDelaySeconds": 3, - "periodSeconds": 10 - }, - "livenessProbe": { - "httpGet": { - "path": "/health/live", - "port": "metrics" - }, - "initialDelaySeconds": 10, - "periodSeconds": 20 - }, - "volumeMounts": [ - { - "name": "hwlab-metrics-sidecar", - "mountPath": "/metrics", - "readOnly": true - } - ] - } - ], - "volumes": [ - { - "name": "hwlab-metrics-sidecar", - "configMap": { - "name": "hwlab-v03-metrics-sidecar" - } - } - ] - } - } - } - } - ] -} +apiVersion: v1 +kind: List +items: + - apiVersion: v1 + kind: PersistentVolumeClaim + metadata: + labels: + app.kubernetes.io/name: hwlab-user-skills + hwlab.pikastech.local/service-id: hwlab-user-skills + app.kubernetes.io/part-of: hwlab + hwlab.pikastech.local/environment: v03 + hwlab.pikastech.local/profile: v03 + hwlab.pikastech.local/gitops-target: v03 + hwlab.pikastech.local/gitops-render-source-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + hwlab.pikastech.local/source-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + unidesk.ai/node-staging: "false" + name: hwlab-user-skills + namespace: hwlab-v03 + annotations: + hwlab.pikastech.local/gitops-note: node DEV GitOps target. + hwlab.pikastech.local/gitops-render-source-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + hwlab.pikastech.local/source-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 2Gi + - apiVersion: apps/v1 + kind: Deployment + metadata: + name: hwlab-project-management + namespace: hwlab-v03 + labels: + app.kubernetes.io/name: hwlab-project-management + hwlab.pikastech.local/service-id: hwlab-project-management + app.kubernetes.io/part-of: hwlab + hwlab.pikastech.local/environment: v03 + hwlab.pikastech.local/profile: v03 + hwlab.pikastech.local/gitops-target: v03 + hwlab.pikastech.local/gitops-render-source-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + hwlab.pikastech.local/source-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + unidesk.ai/node-staging: "false" + hwlab.pikastech.local/monitoring: disabled + annotations: + hwlab.pikastech.local/gitops-note: node DEV GitOps target. + hwlab.pikastech.local/gitops-render-source-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + hwlab.pikastech.local/source-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + spec: + replicas: 1 + selector: + matchLabels: + app.kubernetes.io/name: hwlab-project-management + app.kubernetes.io/part-of: hwlab + hwlab.pikastech.local/environment: v03 + hwlab.pikastech.local/profile: v03 + template: + metadata: + labels: + app.kubernetes.io/name: hwlab-project-management + hwlab.pikastech.local/service-id: hwlab-project-management + app.kubernetes.io/part-of: hwlab + hwlab.pikastech.local/environment: v03 + hwlab.pikastech.local/profile: v03 + hwlab.pikastech.local/gitops-target: v03 + hwlab.pikastech.local/gitops-render-source-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + hwlab.pikastech.local/source-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + hwlab.pikastech.local/artifact-source-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + hwlab.pikastech.local/monitoring: disabled + hwlab.pikastech.local/runtime-mode: env-reuse-git-mirror-checkout + hwlab.pikastech.local/boot-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + annotations: + hwlab.pikastech.local/gitops-render-source-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + hwlab.pikastech.local/source-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + hwlab.pikastech.local/artifact-source-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + hwlab.pikastech.local/rendered-by: scripts/gitops-render.mjs + hwlab.pikastech.local/runtime-mode: env-reuse-git-mirror-checkout + hwlab.pikastech.local/boot-repo: git@github.com:pikasTech/HWLAB.git + hwlab.pikastech.local/boot-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + hwlab.pikastech.local/boot-sh: deploy/runtime/boot/hwlab-project-management.sh + hwlab.pikastech.local/environment-digest: sha256:c638efb6f3559e015da9fea0870a0c5cd8603622820045742e710d33e10e9fdf + hwlab.pikastech.local/environment-input-hash: f5109d26020b05d9023ab1a6dd4e34ed07c9bbca03fc8d0a4697cc208c85a175 + hwlab.pikastech.local/code-input-hash: 4cbd4e24c3020037d215271ed248ac38d5a1c385855443ffe5c112b1a04118f6 + spec: + containers: + - name: hwlab-project-management + image: 127.0.0.1:5000/hwlab/hwlab-project-management-env@sha256:c638efb6f3559e015da9fea0870a0c5cd8603622820045742e710d33e10e9fdf + ports: + - name: http + containerPort: 6672 + env: + - name: HWLAB_PROJECT_MANAGEMENT_PORT + value: "6672" + - name: TZ + value: Asia/Shanghai + - name: HWLAB_PROJECT_MANAGEMENT_DB_URL + valueFrom: + secretKeyRef: + name: hwlab-cloud-api-v03-db + key: database-url + optional: true + - name: HWLAB_PROJECT_MANAGEMENT_DB_CONNECT_TIMEOUT_MS + value: "5000" + - name: HWLAB_PROJECT_MANAGEMENT_SOURCE_ROOT + value: /workspace/hwlab-boot/repo + - name: HWLAB_PROJECT_MANAGEMENT_SOURCE_ID + value: hwlab-v03-mdtodo + - name: HWLAB_PROJECT_MANAGEMENT_SOURCE_NAME + value: HWLAB v0.3 MDTODO + - name: HWLAB_PROJECT_MANAGEMENT_PROJECT_ID + value: project_hwlab_v03 + - name: HWLAB_PROJECT_MANAGEMENT_MDTODO_TASK_DEFAULT_LIMIT + value: "200" + - name: HWLAB_PROJECT_MANAGEMENT_MDTODO_TASK_MAX_LIMIT + value: "500" + - name: HWLAB_PROJECT_MANAGEMENT_HWPOD_NODE_OPS_URL + value: http://hwlab-cloud-api.hwlab-v03.svc.cluster.local:6667/v1/hwpod-node-ops + - name: HWLAB_PROJECT_MANAGEMENT_HWPOD_NODE_OPS_API_KEY + valueFrom: + secretKeyRef: + name: hwlab-v03-master-server-admin-api-key + key: api-key + optional: true + - name: HWLAB_PROJECT_MANAGEMENT_BOOTSTRAP_SOURCES_PATH + value: /etc/hwlab/project-management/sources.json + - name: OTEL_EXPORTER_OTLP_TRACES_ENDPOINT + value: http://otel-collector.platform-infra.svc.cluster.local:4318/v1/traces + - name: OTEL_SERVICE_NAME + value: hwlab-project-management + - name: HWLAB_ENVIRONMENT + value: v03 + - name: HWLAB_COMMIT_ID + value: effbb79199d1117de0634904cdb019c5c0b0ee9f + - name: HWLAB_IMAGE + value: 127.0.0.1:5000/hwlab/hwlab-project-management-env@sha256:c638efb6f3559e015da9fea0870a0c5cd8603622820045742e710d33e10e9fdf + - name: HWLAB_IMAGE_TAG + value: env-f5109d26020b + - name: HWLAB_GITOPS_TARGET + value: v03 + - name: HWLAB_GITOPS_PROFILE + value: v03 + - name: HWLAB_GITOPS_SOURCE_COMMIT + value: effbb79199d1117de0634904cdb019c5c0b0ee9f + - name: HWLAB_RUNTIME_MODE + value: env-reuse-git-mirror-checkout + - name: HWLAB_BOOT_REPO + value: git@github.com:pikasTech/HWLAB.git + - name: HWLAB_BOOT_COMMIT + value: effbb79199d1117de0634904cdb019c5c0b0ee9f + - name: HWLAB_BOOT_REF + value: v0.3 + - name: HWLAB_BOOT_SH + value: deploy/runtime/boot/hwlab-project-management.sh + - name: HWLAB_BOOT_READ_URL + value: http://git-mirror-http.devops-infra.svc.cluster.local:8080/pikasTech/HWLAB.git + - name: HWLAB_ENVIRONMENT_IMAGE + value: 127.0.0.1:5000/hwlab/hwlab-project-management-env:env-f5109d26020b + - name: HWLAB_ENVIRONMENT_DIGEST + value: sha256:c638efb6f3559e015da9fea0870a0c5cd8603622820045742e710d33e10e9fdf + - name: HWLAB_ENVIRONMENT_INPUT_HASH + value: f5109d26020b05d9023ab1a6dd4e34ed07c9bbca03fc8d0a4697cc208c85a175 + - name: HWLAB_CODE_INPUT_HASH + value: 4cbd4e24c3020037d215271ed248ac38d5a1c385855443ffe5c112b1a04118f6 + - name: HWLAB_IMAGE_DIGEST + value: sha256:c638efb6f3559e015da9fea0870a0c5cd8603622820045742e710d33e10e9fdf + readinessProbe: + httpGet: + path: /health/ready + port: http + timeoutSeconds: 10 + failureThreshold: 5 + livenessProbe: + httpGet: + path: /health/live + port: http + timeoutSeconds: 5 + failureThreshold: 6 + imagePullPolicy: IfNotPresent + volumeMounts: + - name: project-management-bootstrap + mountPath: /etc/hwlab/project-management + readOnly: true + startupProbe: + httpGet: + path: /health/ready + port: http + periodSeconds: 10 + timeoutSeconds: 10 + failureThreshold: 30 + successThreshold: 1 + volumes: + - name: project-management-bootstrap + configMap: + name: hwlab-v03-project-management-bootstrap + - apiVersion: apps/v1 + kind: Deployment + metadata: + name: hwlab-workbench-runtime + namespace: hwlab-v03 + labels: + app.kubernetes.io/name: hwlab-workbench-runtime + hwlab.pikastech.local/service-id: hwlab-workbench-runtime + app.kubernetes.io/part-of: hwlab + hwlab.pikastech.local/environment: v03 + hwlab.pikastech.local/profile: v03 + hwlab.pikastech.local/gitops-target: v03 + hwlab.pikastech.local/gitops-render-source-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + hwlab.pikastech.local/source-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + unidesk.ai/node-staging: "false" + hwlab.pikastech.local/monitoring: disabled + annotations: + hwlab.pikastech.local/gitops-note: node DEV GitOps target. + hwlab.pikastech.local/gitops-render-source-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + hwlab.pikastech.local/source-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + spec: + replicas: 1 + selector: + matchLabels: + app.kubernetes.io/name: hwlab-workbench-runtime + app.kubernetes.io/part-of: hwlab + hwlab.pikastech.local/environment: v03 + hwlab.pikastech.local/profile: v03 + template: + metadata: + labels: + app.kubernetes.io/name: hwlab-workbench-runtime + hwlab.pikastech.local/service-id: hwlab-workbench-runtime + app.kubernetes.io/part-of: hwlab + hwlab.pikastech.local/environment: v03 + hwlab.pikastech.local/profile: v03 + hwlab.pikastech.local/gitops-target: v03 + hwlab.pikastech.local/gitops-render-source-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + hwlab.pikastech.local/source-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + hwlab.pikastech.local/artifact-source-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + hwlab.pikastech.local/monitoring: disabled + hwlab.pikastech.local/runtime-mode: env-reuse-git-mirror-checkout + hwlab.pikastech.local/boot-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + annotations: + hwlab.pikastech.local/gitops-render-source-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + hwlab.pikastech.local/source-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + hwlab.pikastech.local/artifact-source-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + hwlab.pikastech.local/rendered-by: scripts/gitops-render.mjs + hwlab.pikastech.local/runtime-mode: env-reuse-git-mirror-checkout + hwlab.pikastech.local/boot-repo: git@github.com:pikasTech/HWLAB.git + hwlab.pikastech.local/boot-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + hwlab.pikastech.local/boot-sh: deploy/runtime/boot/hwlab-workbench-runtime.sh + hwlab.pikastech.local/environment-digest: sha256:6627afec4c746d85a6499d594552775936bd09a9a4cef5adf643c187eb03aa10 + hwlab.pikastech.local/environment-input-hash: 9c9feb03b74fe5946ca36a3c8d264ab6cebc51bf0986c1c4bc0bc2b6d5ecaca7 + hwlab.pikastech.local/code-input-hash: 2db125ce4bebccf3c3e95b50291559144cf647eb905628d59ebebc17c65e2c8b + spec: + containers: + - name: hwlab-workbench-runtime + image: 127.0.0.1:5000/hwlab/hwlab-workbench-runtime-env@sha256:6627afec4c746d85a6499d594552775936bd09a9a4cef5adf643c187eb03aa10 + ports: + - name: http + containerPort: 6671 + env: + - name: HWLAB_WORKBENCH_RUNTIME_PORT + value: "6671" + - name: TZ + value: Asia/Shanghai + - name: HWLAB_WORKBENCH_SESSIONS_SUMMARY_QUERY_MAX_ATTEMPTS + value: "1" + - name: HWLAB_WORKBENCH_SESSIONS_SUMMARY_QUERY_ATTEMPT_TIMEOUT_MS + value: "10000" + - name: HWLAB_WORKBENCH_SESSIONS_SUMMARY_QUERY_BACKOFF_MS + value: "0" + - name: HWLAB_WORKBENCH_RUNTIME_DB_POOL_MAX + value: "16" + - name: HWLAB_WORKBENCH_RUNTIME_QUERY_TIMEOUT_MS + value: "10000" + - name: HWLAB_WORKBENCH_RUNTIME_READY_TIMEOUT_MS + value: "10000" + - name: HWLAB_WORKBENCH_CACHE_REDIS_ENABLED + value: "1" + - name: HWLAB_WORKBENCH_CACHE_REDIS_NAMESPACE + value: hwlab-v03 + - name: HWLAB_WORKBENCH_CACHE_REDIS_SERVICE_NAME + value: hwlab-workbench-redis + - name: HWLAB_WORKBENCH_CACHE_REDIS_PORT + value: "6379" + - name: HWLAB_WORKBENCH_CACHE_REDIS_URL + value: redis://hwlab-workbench-redis.hwlab-v03.svc.cluster.local:6379/0 + - name: HWLAB_WORKBENCH_CACHE_REDIS_TTL_SESSIONS_SUMMARY_MS + value: "30000" + - name: HWLAB_WORKBENCH_CACHE_REDIS_TTL_TERMINAL_TURN_MS + value: "300000" + - name: HWLAB_WORKBENCH_CACHE_REDIS_TTL_TERMINAL_TRACE_PAGE_MS + value: "300000" + - name: HWLAB_WORKBENCH_CACHE_REDIS_TTL_RUNNING_PAGE_MS + value: "5000" + - name: HWLAB_WORKBENCH_CACHE_REDIS_MAX_KEY_BYTES + value: "512" + - name: HWLAB_WORKBENCH_CACHE_REDIS_MAX_PAYLOAD_BYTES + value: "262144" + - name: HWLAB_WORKBENCH_CACHE_REDIS_CONNECT_TIMEOUT_MS + value: "200" + - name: HWLAB_WORKBENCH_CACHE_REDIS_OPERATION_TIMEOUT_MS + value: "100" + - name: HWLAB_WORKBENCH_CACHE_REDIS_METRICS_LABELS + value: '{"lane":"v03","service":"hwlab-workbench-runtime","cacheKeyClass":"workbench-derived-read"}' + - name: HWLAB_WORKBENCH_CACHE_REDIS_UNAVAILABLE_LIVENESS_FAILURE + value: "0" + - name: HWLAB_WORKBENCH_CACHE_REDIS_UNAVAILABLE_READ_MODE + value: db-or-degraded + - name: HWLAB_WORKBENCH_CACHE_REDIS_UNAVAILABLE_FALLBACK_STATE_SOURCE + value: "0" + - name: HWLAB_WORKBENCH_RUNTIME_DB_URL + valueFrom: + secretKeyRef: + name: hwlab-cloud-api-v03-db + key: database-url + optional: true + - name: OTEL_EXPORTER_OTLP_TRACES_ENDPOINT + value: http://otel-collector.platform-infra.svc.cluster.local:4318/v1/traces + - name: OTEL_SERVICE_NAME + value: hwlab-workbench-runtime + - name: HWLAB_ENVIRONMENT + value: v03 + - name: HWLAB_COMMIT_ID + value: effbb79199d1117de0634904cdb019c5c0b0ee9f + - name: HWLAB_IMAGE + value: 127.0.0.1:5000/hwlab/hwlab-workbench-runtime-env@sha256:6627afec4c746d85a6499d594552775936bd09a9a4cef5adf643c187eb03aa10 + - name: HWLAB_IMAGE_TAG + value: env-9c9feb03b74f + - name: HWLAB_GITOPS_TARGET + value: v03 + - name: HWLAB_GITOPS_PROFILE + value: v03 + - name: HWLAB_GITOPS_SOURCE_COMMIT + value: effbb79199d1117de0634904cdb019c5c0b0ee9f + - name: HWLAB_RUNTIME_MODE + value: env-reuse-git-mirror-checkout + - name: HWLAB_BOOT_REPO + value: git@github.com:pikasTech/HWLAB.git + - name: HWLAB_BOOT_COMMIT + value: effbb79199d1117de0634904cdb019c5c0b0ee9f + - name: HWLAB_BOOT_REF + value: v0.3 + - name: HWLAB_BOOT_SH + value: deploy/runtime/boot/hwlab-workbench-runtime.sh + - name: HWLAB_BOOT_READ_URL + value: http://git-mirror-http.devops-infra.svc.cluster.local:8080/pikasTech/HWLAB.git + - name: HWLAB_ENVIRONMENT_IMAGE + value: 127.0.0.1:5000/hwlab/hwlab-workbench-runtime-env:env-9c9feb03b74f + - name: HWLAB_ENVIRONMENT_DIGEST + value: sha256:6627afec4c746d85a6499d594552775936bd09a9a4cef5adf643c187eb03aa10 + - name: HWLAB_ENVIRONMENT_INPUT_HASH + value: 9c9feb03b74fe5946ca36a3c8d264ab6cebc51bf0986c1c4bc0bc2b6d5ecaca7 + - name: HWLAB_CODE_INPUT_HASH + value: 2db125ce4bebccf3c3e95b50291559144cf647eb905628d59ebebc17c65e2c8b + - name: HWLAB_IMAGE_DIGEST + value: sha256:6627afec4c746d85a6499d594552775936bd09a9a4cef5adf643c187eb03aa10 + readinessProbe: + httpGet: + path: /health/ready + port: http + timeoutSeconds: 10 + failureThreshold: 5 + livenessProbe: + httpGet: + path: /health/live + port: http + timeoutSeconds: 5 + failureThreshold: 6 + imagePullPolicy: IfNotPresent + startupProbe: + httpGet: + path: /health/ready + port: http + periodSeconds: 10 + timeoutSeconds: 10 + failureThreshold: 30 + successThreshold: 1 + volumes: [] + - apiVersion: apps/v1 + kind: Deployment + metadata: + name: hwlab-cloud-api + namespace: hwlab-v03 + labels: + app.kubernetes.io/name: hwlab-cloud-api + hwlab.pikastech.local/service-id: hwlab-cloud-api + app.kubernetes.io/part-of: hwlab + hwlab.pikastech.local/environment: v03 + hwlab.pikastech.local/profile: v03 + hwlab.pikastech.local/gitops-target: v03 + hwlab.pikastech.local/gitops-render-source-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + hwlab.pikastech.local/source-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + unidesk.ai/node-staging: "false" + hwlab.pikastech.local/monitoring: disabled + annotations: + hwlab.pikastech.local/gitops-note: node DEV GitOps target. + hwlab.pikastech.local/gitops-render-source-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + hwlab.pikastech.local/source-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + spec: + replicas: 1 + selector: + matchLabels: + app.kubernetes.io/name: hwlab-cloud-api + app.kubernetes.io/part-of: hwlab + hwlab.pikastech.local/environment: v03 + hwlab.pikastech.local/profile: v03 + template: + metadata: + labels: + app.kubernetes.io/name: hwlab-cloud-api + hwlab.pikastech.local/service-id: hwlab-cloud-api + app.kubernetes.io/part-of: hwlab + hwlab.pikastech.local/environment: v03 + hwlab.pikastech.local/profile: v03 + hwlab.pikastech.local/gitops-target: v03 + hwlab.pikastech.local/gitops-render-source-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + hwlab.pikastech.local/source-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + hwlab.pikastech.local/artifact-source-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + hwlab.pikastech.local/monitoring: disabled + hwlab.pikastech.local/runtime-mode: env-reuse-git-mirror-checkout + hwlab.pikastech.local/boot-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + annotations: + hwlab.pikastech.local/gitops-render-source-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + hwlab.pikastech.local/source-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + hwlab.pikastech.local/artifact-source-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + hwlab.pikastech.local/rendered-by: scripts/gitops-render.mjs + hwlab.pikastech.local/runtime-mode: env-reuse-git-mirror-checkout + hwlab.pikastech.local/boot-repo: git@github.com:pikasTech/HWLAB.git + hwlab.pikastech.local/boot-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + hwlab.pikastech.local/boot-sh: deploy/runtime/boot/hwlab-cloud-api.sh + hwlab.pikastech.local/environment-digest: sha256:d696dbd9ed99e1bf1152fb88fac47552526816faf141fb84bcfe74e6689bb5e3 + hwlab.pikastech.local/environment-input-hash: f5109d26020b05d9023ab1a6dd4e34ed07c9bbca03fc8d0a4697cc208c85a175 + hwlab.pikastech.local/code-input-hash: e9ce96840e4a0b5732e5b0f4de06e81947ad0cf3ccaf711d1f1108f592e9bee1 + spec: + initContainers: [] + containers: + - name: hwlab-cloud-api + image: 127.0.0.1:5000/hwlab/hwlab-cloud-api-env@sha256:d696dbd9ed99e1bf1152fb88fac47552526816faf141fb84bcfe74e6689bb5e3 + ports: + - name: http + containerPort: 6667 + env: + - name: HWLAB_ENVIRONMENT + value: v03 + - name: HWLAB_PUBLIC_ENDPOINT + value: https://hwlab.pikapython.com + - name: HWLAB_CLOUD_API_PORT + value: "6667" + - name: HWLAB_COMMIT_ID + value: effbb79199d1117de0634904cdb019c5c0b0ee9f + - name: HWLAB_IMAGE + value: 127.0.0.1:5000/hwlab/hwlab-cloud-api-env@sha256:d696dbd9ed99e1bf1152fb88fac47552526816faf141fb84bcfe74e6689bb5e3 + - name: HWLAB_IMAGE_TAG + value: env-f5109d26020b + - name: HWLAB_RUNTIME_SUBSTITUTE_FORBIDDEN + value: unidesk-backend,provider-gateway,microservice-proxy + - name: HWLAB_CLOUD_DB_URL + valueFrom: + secretKeyRef: + name: hwlab-cloud-api-v03-db + key: database-url + optional: true + - name: HWLAB_CLOUD_DB_SSL_MODE + value: disable + - name: HWLAB_CLOUD_DB_CONTRACT + value: v03-redacted-presence-only + - name: HWLAB_CLOUD_RUNTIME_ADAPTER + value: postgres + - name: HWLAB_CLOUD_RUNTIME_DURABLE + value: "true" + - name: HWLAB_M3_IO_CONTROL_ENABLED + value: "false" + - name: HWLAB_CODE_AGENT_TIMEOUT_MS + value: "1200000" + - name: NO_PROXY + value: hwlab-v03.svc.cluster.local,.svc,.cluster.local,hyueapi.com,.hyueapi.com,hyui.com,.hyui.com,127.0.0.1,localhost,::1,10.0.0.0/8,10.42.0.0/16,10.43.0.0/16,api.minimaxi.com,.minimaxi.com + - name: no_proxy + value: hwlab-v03.svc.cluster.local,.svc,.cluster.local,hyueapi.com,.hyueapi.com,hyui.com,.hyui.com,127.0.0.1,localhost,::1,10.0.0.0/8,10.42.0.0/16,10.43.0.0/16,api.minimaxi.com,.minimaxi.com + - name: HWLAB_CODE_AGENT_SKILLS_DIRS + value: /app/skills:/data/user-skills + - name: HWLAB_PREINSTALLED_SKILLS_DIR + value: /app/skills + - name: HWLAB_USER_SKILLS_DIR + value: /data/user-skills + - name: HWLAB_CODE_AGENT_DEFAULT_PROVIDER_PROFILE + value: dsflash-go + - name: HWLAB_CODE_AGENT_DEEPSEEK_MODEL + value: deepseek-chat + - name: HWLAB_CODE_AGENT_DEEPSEEK_BASE_URL + value: http://hwlab-deepseek-proxy.hwlab-v03.svc.cluster.local:4000/v1/responses + - name: HWLAB_CODE_AGENT_CODEX_API_MODEL + value: gpt-5.5 + - name: HWLAB_CODE_AGENT_CODEX_API_BASE_URL + value: http://127.0.0.1:49280/responses + - name: HWLAB_CODE_AGENT_CODEX_API_UPSTREAM_BASE_URL + value: https://hyueapi.com + - name: HWLAB_CODE_AGENT_CODEX_API_FORWARDER_PORT + value: "49280" + - name: TZ + value: Asia/Shanghai + - name: HWLAB_METRICS_NAMESPACE + value: hwlab-v03 + - name: HWLAB_OBSERVABILITY_CONFIG_REVISION + value: PJ2026-01060505-20260619-long-trace-timeout-mitigation + - name: HWLAB_CODE_AGENT_TURN_STATUS_REFRESH_TIMEOUT_MS + value: "30000" + - name: HWLAB_CODE_AGENT_AGENTRUN_NO_RESPONSE_TIMEOUT_MS + value: "600000" + - name: HWLAB_CODE_AGENT_AGENTRUN_DISPATCH_RETRY_MAX + value: "5" + - name: HWLAB_CODE_AGENT_AGENTRUN_DISPATCH_RETRY_BASE_MS + value: "1000" + - name: HWLAB_CODE_AGENT_AGENTRUN_DISPATCH_RETRY_MAX_DELAY_MS + value: "30000" + - name: HWLAB_CODE_AGENT_AGENTRUN_PROJECTION_SYNC_POLL_INTERVAL_MS + value: "1000" + - name: HWLAB_CODE_AGENT_AGENTRUN_PROJECTION_RESUME_ENABLED + value: "1" + - name: HWLAB_CODE_AGENT_AGENTRUN_PROJECTION_RESUME_INITIAL_DELAY_MS + value: "5000" + - name: HWLAB_CODE_AGENT_AGENTRUN_PROJECTION_RESUME_INTERVAL_MS + value: "60000" + - name: HWLAB_CODE_AGENT_AGENTRUN_PROJECTION_RESUME_MIN_AGE_MS + value: "30000" + - name: HWLAB_CODE_AGENT_AGENTRUN_PROJECTION_RESUME_BATCH_SIZE + value: "100" + - name: HWLAB_CODE_AGENT_AGENTRUN_PROJECTION_RESUME_JITTER_MS + value: "15000" + - name: HWLAB_CODE_AGENT_AGENTRUN_PROJECTION_RESUME_FAILURE_BACKOFF_MS + value: "120000" + - name: HWLAB_BOOTSTRAP_ADMIN_PASSWORD_HASH + valueFrom: + secretKeyRef: + name: hwlab-v03-bootstrap-admin + key: password-hash + optional: true + - name: HWLAB_PRESET_USER_HUIGGAO_PASSWORD_HASH + valueFrom: + secretKeyRef: + name: hwlab-v03-preset-users + key: huiggao-password-hash + optional: true + - name: HWLAB_ACCESS_CONTROL_USERS_JSON + value: '[{"id":"usr_v03_admin","username":"admin","displayName":"HWLAB v0.3 + Admin","email":null,"role":"admin","status":"active","navProfile":"admin-full","passwordHashEnv":"HWLAB_BOOTSTRAP_ADMIN_PASSWORD_HASH"},{"id":"usr_v03_huiggao","username":"huiggao@163.com","displayName":"huiggao@163.com","email":"huiggao@163.com","role":"user","status":"active","navProfile":"code-mdtodo-only","passwordHashEnv":"HWLAB_PRESET_USER_HUIGGAO_PASSWORD_HASH"}]' + - name: HWLAB_ACCESS_CONTROL_NAV_PROFILES_JSON + value: '[{"id":"admin-full","displayName":"Admin full + access","allowedIds":["*"]},{"id":"code-mdtodo-only","displayName":"Code + and MDTODO + only","allowedIds":["workbench.code","project.mdtodo"]}]' + - name: HWLAB_CLOUD_DB_POOL_MAX + value: "16" + - name: HWLAB_CLOUD_DB_PROBE_TIMEOUT_MS + value: "5000" + - name: HWLAB_CLOUD_DB_QUERY_RETRY_MAX_ATTEMPTS + value: "5" + - name: HWLAB_CLOUD_DB_QUERY_RETRY_INITIAL_DELAY_MS + value: "250" + - name: HWLAB_CLOUD_DB_QUERY_RETRY_MAX_DELAY_MS + value: "5000" + - name: HWLAB_WORKBENCH_RUNTIME_TIMEOUT_MS + value: "3000" + - name: HWLAB_WORKBENCH_FACTS_QUERY_MAX_ATTEMPTS + value: "1" + - name: HWLAB_WORKBENCH_FACTS_QUERY_BACKOFF_BASE_MS + value: "0" + - name: HWLAB_WORKBENCH_FACTS_QUERY_BACKOFF_MAX_MS + value: "1" + - name: HWLAB_ACCESS_CONTROL_REQUIRED + value: "1" + - name: HWLAB_SESSION_COOKIE_DOMAIN + value: .pikapython.com + - name: HWLAB_SESSION_COOKIE_SAMESITE + value: None + - name: HWLAB_BOOTSTRAP_ADMIN_ID + value: usr_v03_admin + - name: HWLAB_BOOTSTRAP_ADMIN_USERNAME + value: admin + - name: HWLAB_BOOTSTRAP_ADMIN_DISPLAY_NAME + value: HWLAB v0.3 Admin + - name: HWLAB_BOOTSTRAP_ADMIN_API_KEY_ID + value: key_master_server_admin + - name: HWLAB_BOOTSTRAP_ADMIN_API_KEY + valueFrom: + secretKeyRef: + name: hwlab-v03-master-server-admin-api-key + key: api-key + optional: true + - name: HWLAB_USER_BILLING_URL + value: http://hwlab-user-billing.hwlab-v03.svc.cluster.local:6670 + - name: HWLAB_WORKBENCH_RUNTIME_URL + value: http://hwlab-workbench-runtime.hwlab-v03.svc.cluster.local:6671 + - name: HWLAB_PROJECT_MANAGEMENT_URL + value: http://hwlab-project-management.hwlab-v03.svc.cluster.local:6672 + - name: HWLAB_HWPOD_SPEC_REGISTRY_DIRS + value: /etc/hwlab/hwpod-specs + - name: HWLAB_USER_BILLING_LOGIN_RETRY_ATTEMPTS + value: "2" + - name: HWLAB_USER_BILLING_LOGIN_RETRY_DELAY_MS + value: "250" + - name: HWLAB_USER_BILLING_CODE_AGENT_ENABLED + value: "1" + - name: HWLAB_USER_BILLING_CODE_AGENT_ESTIMATED_CREDITS + value: "1" + - name: HWLAB_USER_BILLING_CODE_AGENT_USED_CREDITS + value: "1" + - name: HWLAB_KEYCLOAK_ISSUER + value: https://auth.74-48-78-17.nip.io/realms/hwlab + - name: HWLAB_KEYCLOAK_CLIENT_ID + value: hwlab-cloud-web + - name: HWLAB_KEYCLOAK_CLIENT_SECRET + valueFrom: + secretKeyRef: + name: hwlab-cloud-web-client + key: client-secret + optional: true + - name: HWLAB_CODE_AGENT_ADAPTER + value: agentrun-v02 + - name: OTEL_EXPORTER_OTLP_TRACES_ENDPOINT + value: http://otel-collector.platform-infra.svc.cluster.local:4318/v1/traces + - name: OTEL_SERVICE_NAME + value: hwlab-cloud-api + - name: AGENTRUN_MGR_URL + value: http://agentrun-mgr.agentrun-v02.svc.cluster.local:8080 + - name: AGENTRUN_API_KEY + valueFrom: + secretKeyRef: + name: hwlab-v03-master-server-admin-api-key + key: api-key + - name: HWLAB_CODE_AGENT_AGENTRUN_RUNNER_NAMESPACE + value: agentrun-v02 + - name: HWLAB_CODE_AGENT_AGENTRUN_SECRET_NAMESPACE + value: agentrun-v02 + - name: HWLAB_CODE_AGENT_AGENTRUN_REPO_URL + value: http://git-mirror-http.devops-infra.svc.cluster.local:8080/pikasTech/HWLAB.git + - name: HWLAB_WORKBENCH_EMPTY_SESSION_GC_ENABLED + value: "1" + - name: HWLAB_WORKBENCH_EMPTY_SESSION_TTL_MS + value: "600000" + - name: HWLAB_WORKBENCH_EMPTY_SESSION_GC_INTERVAL_MS + value: "60000" + - name: HWLAB_WORKBENCH_EMPTY_SESSION_GC_INITIAL_DELAY_MS + value: "5000" + - name: HWLAB_WORKBENCH_EMPTY_SESSION_GC_BATCH_SIZE + value: "100" + - name: HWLAB_WORKBENCH_EMPTY_SESSION_GC_JITTER_MS + value: "15000" + - name: HWLAB_WORKBENCH_EMPTY_SESSION_GC_FAILURE_BACKOFF_MS + value: "120000" + - name: HWLAB_SECRET_PLANE_SMOKE + valueFrom: + secretKeyRef: + name: hwlab-secret-plane-smoke + key: password + optional: true + - name: HWLAB_GITOPS_TARGET + value: v03 + - name: HWLAB_GITOPS_PROFILE + value: v03 + - name: HWLAB_GITOPS_SOURCE_COMMIT + value: effbb79199d1117de0634904cdb019c5c0b0ee9f + - name: HWLAB_CODE_AGENT_AGENTRUN_SOURCE_COMMIT + value: effbb79199d1117de0634904cdb019c5c0b0ee9f + - name: HWLAB_RUNTIME_MODE + value: env-reuse-git-mirror-checkout + - name: HWLAB_BOOT_REPO + value: git@github.com:pikasTech/HWLAB.git + - name: HWLAB_BOOT_COMMIT + value: effbb79199d1117de0634904cdb019c5c0b0ee9f + - name: HWLAB_BOOT_REF + value: v0.3 + - name: HWLAB_BOOT_SH + value: deploy/runtime/boot/hwlab-cloud-api.sh + - name: HWLAB_BOOT_READ_URL + value: http://git-mirror-http.devops-infra.svc.cluster.local:8080/pikasTech/HWLAB.git + - name: HWLAB_ENVIRONMENT_IMAGE + value: 127.0.0.1:5000/hwlab/hwlab-cloud-api-env:env-f5109d26020b + - name: HWLAB_ENVIRONMENT_DIGEST + value: sha256:d696dbd9ed99e1bf1152fb88fac47552526816faf141fb84bcfe74e6689bb5e3 + - name: HWLAB_ENVIRONMENT_INPUT_HASH + value: f5109d26020b05d9023ab1a6dd4e34ed07c9bbca03fc8d0a4697cc208c85a175 + - name: HWLAB_CODE_INPUT_HASH + value: e9ce96840e4a0b5732e5b0f4de06e81947ad0cf3ccaf711d1f1108f592e9bee1 + - name: HWLAB_IMAGE_DIGEST + value: sha256:d696dbd9ed99e1bf1152fb88fac47552526816faf141fb84bcfe74e6689bb5e3 + - name: HWLAB_WORKBENCH_SSE_DRAIN_TIMEOUT_MS + value: "2500" + - name: HWLAB_CODE_AGENT_AGENTRUN_PROVIDER_ID + value: JD01 + - name: HWLAB_OPENFGA_MODE + value: enforce + - name: HWLAB_OPENFGA_API_URL + value: http://hwlab-openfga.hwlab-v03.svc.cluster.local:8080 + - name: HWLAB_OPENFGA_AUTHN_TOKEN + valueFrom: + secretKeyRef: + name: hwlab-v03-openfga + key: authn-preshared-key + optional: true + - name: UNIDESK_MAIN_SERVER_IP + value: http://74.48.78.17:18081 + - name: HWLAB_CODE_AGENT_CODEX_STDIO_SUPERVISOR + value: repo-owned + readinessProbe: + httpGet: + path: /health/live + port: http + timeoutSeconds: 3 + failureThreshold: 5 + livenessProbe: + httpGet: + path: /health/live + port: http + periodSeconds: 20 + timeoutSeconds: 5 + failureThreshold: 6 + volumeMounts: + - name: hwlab-user-skills + mountPath: /data/user-skills + - name: hwpod-preinstalled-specs + mountPath: /etc/hwlab/hwpod-specs + readOnly: true + imagePullPolicy: IfNotPresent + startupProbe: + httpGet: + path: /health/live + port: http + periodSeconds: 10 + timeoutSeconds: 3 + failureThreshold: 30 + successThreshold: 1 + lifecycle: + preStop: + exec: + command: + - sh + - -c + - "port=\"${PORT:-${HWLAB_PORT:-${HWLAB_CLOUD_API_PORT:-6\ + 667}}}\"; + url=\"http://127.0.0.1:${port}/v1/internal/workbench/dr\ + ain\"; /usr/local/bin/bun -e 'const [url, hostname] = + process.argv.slice(2); await fetch(url, { method: + \"POST\", headers: { \"x-hwlab-drain-hostname\": + hostname || \"\" } }).catch(() => {});' \"$url\" + \"${HOSTNAME:-}\" >/dev/null 2>&1 || true; sleep 3" + - name: hwlab-codex-api-forwarder + image: 127.0.0.1:5000/hwlab/hwlab-cloud-api-env@sha256:d696dbd9ed99e1bf1152fb88fac47552526816faf141fb84bcfe74e6689bb5e3 + ports: + - name: codex-api + containerPort: 49280 + env: + - name: HWLAB_CODE_AGENT_CODEX_API_FORWARDER_HOST + value: 127.0.0.1 + - name: HWLAB_CODE_AGENT_CODEX_API_FORWARDER_PORT + value: "49280" + - name: HWLAB_CODE_AGENT_CODEX_API_UPSTREAM_BASE_URL + value: https://hyueapi.com + - name: NO_PROXY + value: hwlab-v03.svc.cluster.local,.svc,.cluster.local,hyueapi.com,.hyueapi.com,hyui.com,.hyui.com,127.0.0.1,localhost,::1,10.0.0.0/8,10.42.0.0/16,10.43.0.0/16,api.minimaxi.com,.minimaxi.com + - name: no_proxy + value: hwlab-v03.svc.cluster.local,.svc,.cluster.local,hyueapi.com,.hyueapi.com,hyui.com,.hyui.com,127.0.0.1,localhost,::1,10.0.0.0/8,10.42.0.0/16,10.43.0.0/16,api.minimaxi.com,.minimaxi.com + - name: HWLAB_M3_IO_CONTROL_ENABLED + value: "false" + - name: HWLAB_ENVIRONMENT + value: v03 + - name: HWLAB_PUBLIC_ENDPOINT + value: https://hwlab.pikapython.com + - name: HWLAB_CLOUD_API_PORT + value: "6667" + - name: HWLAB_RUNTIME_SUBSTITUTE_FORBIDDEN + value: unidesk-backend,provider-gateway,microservice-proxy + - name: HWLAB_CLOUD_DB_URL + valueFrom: + secretKeyRef: + name: hwlab-cloud-api-v03-db + key: database-url + optional: true + - name: HWLAB_CLOUD_DB_SSL_MODE + value: disable + - name: HWLAB_CLOUD_DB_CONTRACT + value: v03-redacted-presence-only + - name: HWLAB_CLOUD_RUNTIME_ADAPTER + value: postgres + - name: HWLAB_CLOUD_RUNTIME_DURABLE + value: "true" + - name: HWLAB_CODE_AGENT_TIMEOUT_MS + value: "1200000" + - name: HWLAB_CODE_AGENT_SKILLS_DIRS + value: /app/skills:/data/user-skills + - name: HWLAB_PREINSTALLED_SKILLS_DIR + value: /app/skills + - name: HWLAB_USER_SKILLS_DIR + value: /data/user-skills + - name: HWLAB_CODE_AGENT_DEFAULT_PROVIDER_PROFILE + value: deepseek + - name: HWLAB_CODE_AGENT_DEEPSEEK_MODEL + value: deepseek-chat + - name: HWLAB_CODE_AGENT_DEEPSEEK_BASE_URL + value: http://hwlab-deepseek-proxy.hwlab-v03.svc.cluster.local:4000/v1/responses + - name: HWLAB_CODE_AGENT_CODEX_API_MODEL + value: gpt-5.5 + - name: HWLAB_CODE_AGENT_CODEX_API_BASE_URL + value: http://127.0.0.1:49280/responses + - name: TZ + value: Asia/Shanghai + - name: HWLAB_METRICS_NAMESPACE + value: hwlab-v03 + - name: HWLAB_OBSERVABILITY_CONFIG_REVISION + value: PJ2026-01060505-20260619-long-trace-timeout-mitigation + - name: HWLAB_CODE_AGENT_TURN_STATUS_REFRESH_TIMEOUT_MS + value: "30000" + - name: HWLAB_CODE_AGENT_AGENTRUN_NO_RESPONSE_TIMEOUT_MS + value: "600000" + - name: HWLAB_CODE_AGENT_AGENTRUN_DISPATCH_RETRY_MAX + value: "5" + - name: HWLAB_CODE_AGENT_AGENTRUN_DISPATCH_RETRY_BASE_MS + value: "1000" + - name: HWLAB_CODE_AGENT_AGENTRUN_DISPATCH_RETRY_MAX_DELAY_MS + value: "30000" + - name: HWLAB_CODE_AGENT_AGENTRUN_PROJECTION_SYNC_POLL_INTERVAL_MS + value: "1000" + - name: HWLAB_CODE_AGENT_AGENTRUN_PROJECTION_RESUME_ENABLED + value: "1" + - name: HWLAB_CODE_AGENT_AGENTRUN_PROJECTION_RESUME_INITIAL_DELAY_MS + value: "5000" + - name: HWLAB_CODE_AGENT_AGENTRUN_PROJECTION_RESUME_INTERVAL_MS + value: "60000" + - name: HWLAB_CODE_AGENT_AGENTRUN_PROJECTION_RESUME_MIN_AGE_MS + value: "30000" + - name: HWLAB_CODE_AGENT_AGENTRUN_PROJECTION_RESUME_BATCH_SIZE + value: "100" + - name: HWLAB_CODE_AGENT_AGENTRUN_PROJECTION_RESUME_JITTER_MS + value: "15000" + - name: HWLAB_CODE_AGENT_AGENTRUN_PROJECTION_RESUME_FAILURE_BACKOFF_MS + value: "120000" + - name: HWLAB_BOOTSTRAP_ADMIN_PASSWORD_HASH + valueFrom: + secretKeyRef: + name: hwlab-v03-bootstrap-admin + key: password-hash + optional: true + - name: HWLAB_PRESET_USER_HUIGGAO_PASSWORD_HASH + valueFrom: + secretKeyRef: + name: hwlab-v03-preset-users + key: huiggao-password-hash + optional: true + - name: HWLAB_ACCESS_CONTROL_USERS_JSON + value: '[{"id":"usr_v03_admin","username":"admin","displayName":"HWLAB v0.3 + Admin","email":null,"role":"admin","status":"active","navProfile":"admin-full","passwordHashEnv":"HWLAB_BOOTSTRAP_ADMIN_PASSWORD_HASH"},{"id":"usr_v03_huiggao","username":"huiggao@163.com","displayName":"huiggao@163.com","email":"huiggao@163.com","role":"user","status":"active","navProfile":"code-mdtodo-only","passwordHashEnv":"HWLAB_PRESET_USER_HUIGGAO_PASSWORD_HASH"}]' + - name: HWLAB_ACCESS_CONTROL_NAV_PROFILES_JSON + value: '[{"id":"admin-full","displayName":"Admin full + access","allowedIds":["*"]},{"id":"code-mdtodo-only","displayName":"Code + and MDTODO + only","allowedIds":["workbench.code","project.mdtodo"]}]' + - name: HWLAB_CLOUD_DB_POOL_MAX + value: "16" + - name: HWLAB_CLOUD_DB_PROBE_TIMEOUT_MS + value: "5000" + - name: HWLAB_CLOUD_DB_QUERY_RETRY_MAX_ATTEMPTS + value: "5" + - name: HWLAB_CLOUD_DB_QUERY_RETRY_INITIAL_DELAY_MS + value: "250" + - name: HWLAB_CLOUD_DB_QUERY_RETRY_MAX_DELAY_MS + value: "5000" + - name: HWLAB_WORKBENCH_RUNTIME_TIMEOUT_MS + value: "3000" + - name: HWLAB_WORKBENCH_FACTS_QUERY_MAX_ATTEMPTS + value: "1" + - name: HWLAB_WORKBENCH_FACTS_QUERY_BACKOFF_BASE_MS + value: "0" + - name: HWLAB_WORKBENCH_FACTS_QUERY_BACKOFF_MAX_MS + value: "1" + - name: HWLAB_ACCESS_CONTROL_REQUIRED + value: "1" + - name: HWLAB_SESSION_COOKIE_DOMAIN + value: .pikapython.com + - name: HWLAB_SESSION_COOKIE_SAMESITE + value: None + - name: HWLAB_BOOTSTRAP_ADMIN_ID + value: usr_v03_admin + - name: HWLAB_BOOTSTRAP_ADMIN_USERNAME + value: admin + - name: HWLAB_BOOTSTRAP_ADMIN_DISPLAY_NAME + value: HWLAB v0.3 Admin + - name: HWLAB_BOOTSTRAP_ADMIN_API_KEY_ID + value: key_master_server_admin + - name: HWLAB_BOOTSTRAP_ADMIN_API_KEY + valueFrom: + secretKeyRef: + name: hwlab-v03-master-server-admin-api-key + key: api-key + optional: true + - name: HWLAB_USER_BILLING_URL + value: http://hwlab-user-billing.hwlab-v03.svc.cluster.local:6670 + - name: HWLAB_WORKBENCH_RUNTIME_URL + value: http://hwlab-workbench-runtime.hwlab-v03.svc.cluster.local:6671 + - name: HWLAB_PROJECT_MANAGEMENT_URL + value: http://hwlab-project-management.hwlab-v03.svc.cluster.local:6672 + - name: HWLAB_HWPOD_SPEC_REGISTRY_DIRS + value: /etc/hwlab/hwpod-specs + - name: HWLAB_USER_BILLING_LOGIN_RETRY_ATTEMPTS + value: "2" + - name: HWLAB_USER_BILLING_LOGIN_RETRY_DELAY_MS + value: "250" + - name: HWLAB_USER_BILLING_CODE_AGENT_ENABLED + value: "1" + - name: HWLAB_USER_BILLING_CODE_AGENT_ESTIMATED_CREDITS + value: "1" + - name: HWLAB_USER_BILLING_CODE_AGENT_USED_CREDITS + value: "1" + - name: HWLAB_KEYCLOAK_ISSUER + value: https://auth.74-48-78-17.nip.io/realms/hwlab + - name: HWLAB_KEYCLOAK_CLIENT_ID + value: hwlab-cloud-web + - name: HWLAB_KEYCLOAK_CLIENT_SECRET + valueFrom: + secretKeyRef: + name: hwlab-cloud-web-client + key: client-secret + optional: true + - name: HWLAB_CODE_AGENT_ADAPTER + value: agentrun-v01 + - name: OTEL_EXPORTER_OTLP_TRACES_ENDPOINT + value: http://otel-collector.platform-infra.svc.cluster.local:4318/v1/traces + - name: OTEL_SERVICE_NAME + value: hwlab-cloud-api + - name: AGENTRUN_MGR_URL + value: http://agentrun-mgr.agentrun-v02.svc.cluster.local:8080 + - name: AGENTRUN_API_KEY + valueFrom: + secretKeyRef: + name: hwlab-v03-master-server-admin-api-key + key: api-key + optional: true + - name: HWLAB_CODE_AGENT_AGENTRUN_RUNNER_NAMESPACE + value: agentrun-v02 + - name: HWLAB_CODE_AGENT_AGENTRUN_SECRET_NAMESPACE + value: agentrun-v02 + - name: HWLAB_CODE_AGENT_AGENTRUN_REPO_URL + value: http://git-mirror-http.devops-infra.svc.cluster.local:8080/pikasTech/HWLAB.git + - name: HWLAB_WORKBENCH_EMPTY_SESSION_GC_ENABLED + value: "1" + - name: HWLAB_WORKBENCH_EMPTY_SESSION_TTL_MS + value: "600000" + - name: HWLAB_WORKBENCH_EMPTY_SESSION_GC_INTERVAL_MS + value: "60000" + - name: HWLAB_WORKBENCH_EMPTY_SESSION_GC_INITIAL_DELAY_MS + value: "5000" + - name: HWLAB_WORKBENCH_EMPTY_SESSION_GC_BATCH_SIZE + value: "100" + - name: HWLAB_WORKBENCH_EMPTY_SESSION_GC_JITTER_MS + value: "15000" + - name: HWLAB_WORKBENCH_EMPTY_SESSION_GC_FAILURE_BACKOFF_MS + value: "120000" + - name: HWLAB_SECRET_PLANE_SMOKE + valueFrom: + secretKeyRef: + name: hwlab-secret-plane-smoke + key: password + optional: true + - name: HWLAB_COMMIT_ID + value: effbb79199d1117de0634904cdb019c5c0b0ee9f + - name: HWLAB_IMAGE + value: 127.0.0.1:5000/hwlab/hwlab-cloud-api-env@sha256:d696dbd9ed99e1bf1152fb88fac47552526816faf141fb84bcfe74e6689bb5e3 + - name: HWLAB_IMAGE_TAG + value: env-f5109d26020b + - name: HWLAB_GITOPS_TARGET + value: v03 + - name: HWLAB_GITOPS_PROFILE + value: v03 + - name: HWLAB_GITOPS_SOURCE_COMMIT + value: effbb79199d1117de0634904cdb019c5c0b0ee9f + - name: HWLAB_CODE_AGENT_AGENTRUN_SOURCE_COMMIT + value: effbb79199d1117de0634904cdb019c5c0b0ee9f + - name: HWLAB_RUNTIME_MODE + value: env-reuse-git-mirror-checkout + - name: HWLAB_BOOT_REPO + value: git@github.com:pikasTech/HWLAB.git + - name: HWLAB_BOOT_COMMIT + value: effbb79199d1117de0634904cdb019c5c0b0ee9f + - name: HWLAB_BOOT_REF + value: v0.3 + - name: HWLAB_BOOT_SH + value: deploy/runtime/boot/hwlab-codex-api-responses-forwarder.sh + - name: HWLAB_BOOT_READ_URL + value: http://git-mirror-http.devops-infra.svc.cluster.local:8080/pikasTech/HWLAB.git + - name: HWLAB_ENVIRONMENT_IMAGE + value: 127.0.0.1:5000/hwlab/hwlab-cloud-api-env:env-f5109d26020b + - name: HWLAB_ENVIRONMENT_DIGEST + value: sha256:d696dbd9ed99e1bf1152fb88fac47552526816faf141fb84bcfe74e6689bb5e3 + - name: HWLAB_ENVIRONMENT_INPUT_HASH + value: f5109d26020b05d9023ab1a6dd4e34ed07c9bbca03fc8d0a4697cc208c85a175 + - name: HWLAB_CODE_INPUT_HASH + value: e9ce96840e4a0b5732e5b0f4de06e81947ad0cf3ccaf711d1f1108f592e9bee1 + - name: HWLAB_IMAGE_DIGEST + value: sha256:d696dbd9ed99e1bf1152fb88fac47552526816faf141fb84bcfe74e6689bb5e3 + - name: HWLAB_WORKBENCH_SSE_DRAIN_TIMEOUT_MS + value: "2500" + - name: HWLAB_CODE_AGENT_AGENTRUN_PROVIDER_ID + value: JD01 + - name: HWLAB_OPENFGA_MODE + value: enforce + - name: HWLAB_OPENFGA_API_URL + value: http://hwlab-openfga.hwlab-v03.svc.cluster.local:8080 + - name: HWLAB_OPENFGA_AUTHN_TOKEN + valueFrom: + secretKeyRef: + name: hwlab-v03-openfga + key: authn-preshared-key + optional: true + - name: UNIDESK_MAIN_SERVER_IP + value: http://74.48.78.17:18081 + readinessProbe: + exec: + command: + - node + - -e + - "fetch('http://127.0.0.1:49280/health/readiness').then((r\ + esponse) => process.exit(response.ok ? 0 : 1)).catch(() => + process.exit(1))" + timeoutSeconds: 2 + livenessProbe: + exec: + command: + - node + - -e + - "fetch('http://127.0.0.1:49280/health/live').then((respon\ + se) => process.exit(response.ok ? 0 : 1)).catch(() => + process.exit(1))" + timeoutSeconds: 2 + volumeMounts: + - name: hwpod-preinstalled-specs + mountPath: /etc/hwlab/hwpod-specs + readOnly: true + imagePullPolicy: IfNotPresent + startupProbe: + exec: + command: + - node + - -e + - "fetch('http://127.0.0.1:49280/health/readiness').then((r\ + esponse) => process.exit(response.ok ? 0 : 1)).catch(() => + process.exit(1))" + timeoutSeconds: 2 + periodSeconds: 10 + failureThreshold: 30 + successThreshold: 1 + lifecycle: + preStop: + exec: + command: + - sh + - -c + - "port=\"${PORT:-${HWLAB_PORT:-${HWLAB_CLOUD_API_PORT:-6\ + 667}}}\"; + url=\"http://127.0.0.1:${port}/v1/internal/workbench/dr\ + ain\"; /usr/local/bin/bun -e 'const [url, hostname] = + process.argv.slice(2); await fetch(url, { method: + \"POST\", headers: { \"x-hwlab-drain-hostname\": + hostname || \"\" } }).catch(() => {});' \"$url\" + \"${HOSTNAME:-}\" >/dev/null 2>&1 || true; sleep 3" + volumes: + - name: hwlab-user-skills + persistentVolumeClaim: + claimName: hwlab-user-skills + - name: hwpod-preinstalled-specs + configMap: + name: hwlab-v03-hwpod-preinstalled-specs + - apiVersion: apps/v1 + kind: Deployment + metadata: + name: hwlab-user-billing + namespace: hwlab-v03 + labels: + app.kubernetes.io/name: hwlab-user-billing + hwlab.pikastech.local/service-id: hwlab-user-billing + app.kubernetes.io/part-of: hwlab + hwlab.pikastech.local/environment: v03 + hwlab.pikastech.local/profile: v03 + hwlab.pikastech.local/gitops-target: v03 + hwlab.pikastech.local/gitops-render-source-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + hwlab.pikastech.local/source-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + unidesk.ai/node-staging: "false" + hwlab.pikastech.local/monitoring: disabled + annotations: + hwlab.pikastech.local/gitops-note: node DEV GitOps target. + hwlab.pikastech.local/gitops-render-source-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + hwlab.pikastech.local/source-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + spec: + replicas: 1 + selector: + matchLabels: + app.kubernetes.io/name: hwlab-user-billing + app.kubernetes.io/part-of: hwlab + hwlab.pikastech.local/environment: v03 + hwlab.pikastech.local/profile: v03 + template: + metadata: + labels: + app.kubernetes.io/name: hwlab-user-billing + hwlab.pikastech.local/service-id: hwlab-user-billing + app.kubernetes.io/part-of: hwlab + hwlab.pikastech.local/environment: v03 + hwlab.pikastech.local/profile: v03 + hwlab.pikastech.local/gitops-target: v03 + hwlab.pikastech.local/gitops-render-source-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + hwlab.pikastech.local/source-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + hwlab.pikastech.local/artifact-source-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + hwlab.pikastech.local/monitoring: disabled + hwlab.pikastech.local/runtime-mode: env-reuse-git-mirror-checkout + hwlab.pikastech.local/boot-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + annotations: + hwlab.pikastech.local/gitops-render-source-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + hwlab.pikastech.local/source-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + hwlab.pikastech.local/artifact-source-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + hwlab.pikastech.local/rendered-by: scripts/gitops-render.mjs + hwlab.pikastech.local/runtime-mode: env-reuse-git-mirror-checkout + hwlab.pikastech.local/boot-repo: git@github.com:pikasTech/HWLAB.git + hwlab.pikastech.local/boot-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + hwlab.pikastech.local/boot-sh: deploy/runtime/boot/hwlab-user-billing.sh + hwlab.pikastech.local/environment-digest: sha256:58ab902431ce98b91e1442b719d5ab67f474f3a09d04b72638686784ad7bc7c6 + hwlab.pikastech.local/environment-input-hash: 9c9feb03b74fe5946ca36a3c8d264ab6cebc51bf0986c1c4bc0bc2b6d5ecaca7 + hwlab.pikastech.local/code-input-hash: 1c7f8090dc17d9a7dfc7cdd0714e7294bb231db899c396b388e4ab3642e5134e + spec: + containers: + - name: hwlab-user-billing + image: 127.0.0.1:5000/hwlab/hwlab-user-billing-env@sha256:58ab902431ce98b91e1442b719d5ab67f474f3a09d04b72638686784ad7bc7c6 + ports: + - name: http + containerPort: 6670 + env: + - name: HWLAB_USER_BILLING_PORT + value: "6670" + - name: HWLAB_USER_BILLING_STATE_AUTHORITY + value: pk01-postgres + - name: HWLAB_USER_BILLING_STATELESS + value: "true" + - name: TZ + value: Asia/Shanghai + - name: HWLAB_USER_BILLING_DB_URL + valueFrom: + secretKeyRef: + name: hwlab-cloud-api-v03-db + key: database-url + optional: true + - name: HWLAB_USER_BILLING_DB_POOL_MAX + value: "2" + - name: HWLAB_USER_BILLING_MIGRATION_TIMEOUT_SECONDS + value: "180" + - name: HWLAB_USER_BILLING_BOOTSTRAP_TIMEOUT_SECONDS + value: "60" + - name: HWLAB_BOOTSTRAP_ADMIN_ID + value: usr_v03_admin + - name: HWLAB_BOOTSTRAP_ADMIN_USERNAME + value: admin + - name: HWLAB_BOOTSTRAP_ADMIN_DISPLAY_NAME + value: HWLAB v0.3 Admin + - name: HWLAB_BOOTSTRAP_ADMIN_PASSWORD_HASH + valueFrom: + secretKeyRef: + name: hwlab-v03-bootstrap-admin + key: password-hash + optional: true + - name: HWLAB_USER_BILLING_EXTERNAL_DB_LABEL + value: pk01-external-postgres + - name: HWLAB_USER_BILLING_REGISTRATION_ENABLED + value: "1" + - name: HWLAB_USER_BILLING_INITIAL_CREDITS + value: "0" + - name: HWLAB_USER_BILLING_CREDIT_PER_1K_TOKENS + value: "1" + - name: HWLAB_USER_BILLING_MIGRATE_ON_START + value: "1" + - name: HWLAB_USER_BILLING_REDIS_URL + value: redis://hwlab-user-billing-redis.hwlab-v03.svc.cluster.local:6379/0 + - name: OTEL_EXPORTER_OTLP_TRACES_ENDPOINT + value: http://otel-collector.platform-infra.svc.cluster.local:4318/v1/traces + - name: OTEL_SERVICE_NAME + value: hwlab-user-billing + - name: HWLAB_ENVIRONMENT + value: v03 + - name: HWLAB_COMMIT_ID + value: effbb79199d1117de0634904cdb019c5c0b0ee9f + - name: HWLAB_IMAGE + value: 127.0.0.1:5000/hwlab/hwlab-user-billing-env@sha256:58ab902431ce98b91e1442b719d5ab67f474f3a09d04b72638686784ad7bc7c6 + - name: HWLAB_IMAGE_TAG + value: env-9c9feb03b74f + - name: HWLAB_GITOPS_TARGET + value: v03 + - name: HWLAB_GITOPS_PROFILE + value: v03 + - name: HWLAB_GITOPS_SOURCE_COMMIT + value: effbb79199d1117de0634904cdb019c5c0b0ee9f + - name: HWLAB_RUNTIME_MODE + value: env-reuse-git-mirror-checkout + - name: HWLAB_BOOT_REPO + value: git@github.com:pikasTech/HWLAB.git + - name: HWLAB_BOOT_COMMIT + value: effbb79199d1117de0634904cdb019c5c0b0ee9f + - name: HWLAB_BOOT_REF + value: v0.3 + - name: HWLAB_BOOT_SH + value: deploy/runtime/boot/hwlab-user-billing.sh + - name: HWLAB_BOOT_READ_URL + value: http://git-mirror-http.devops-infra.svc.cluster.local:8080/pikasTech/HWLAB.git + - name: HWLAB_ENVIRONMENT_IMAGE + value: 127.0.0.1:5000/hwlab/hwlab-user-billing-env:env-9c9feb03b74f + - name: HWLAB_ENVIRONMENT_DIGEST + value: sha256:58ab902431ce98b91e1442b719d5ab67f474f3a09d04b72638686784ad7bc7c6 + - name: HWLAB_ENVIRONMENT_INPUT_HASH + value: 9c9feb03b74fe5946ca36a3c8d264ab6cebc51bf0986c1c4bc0bc2b6d5ecaca7 + - name: HWLAB_CODE_INPUT_HASH + value: 1c7f8090dc17d9a7dfc7cdd0714e7294bb231db899c396b388e4ab3642e5134e + - name: HWLAB_IMAGE_DIGEST + value: sha256:58ab902431ce98b91e1442b719d5ab67f474f3a09d04b72638686784ad7bc7c6 + readinessProbe: + httpGet: + path: /health/ready + port: http + timeoutSeconds: 10 + failureThreshold: 5 + livenessProbe: + httpGet: + path: /health/live + port: http + timeoutSeconds: 5 + failureThreshold: 6 + imagePullPolicy: IfNotPresent + startupProbe: + httpGet: + path: /health/ready + port: http + periodSeconds: 10 + timeoutSeconds: 10 + failureThreshold: 30 + successThreshold: 1 + volumes: [] + - apiVersion: apps/v1 + kind: Deployment + metadata: + name: hwlab-cloud-web + namespace: hwlab-v03 + labels: + app.kubernetes.io/name: hwlab-cloud-web + hwlab.pikastech.local/service-id: hwlab-cloud-web + app.kubernetes.io/part-of: hwlab + hwlab.pikastech.local/environment: v03 + hwlab.pikastech.local/profile: v03 + hwlab.pikastech.local/gitops-target: v03 + hwlab.pikastech.local/gitops-render-source-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + hwlab.pikastech.local/source-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + unidesk.ai/node-staging: "false" + hwlab.pikastech.local/monitoring: disabled + annotations: + hwlab.pikastech.local/gitops-note: node DEV GitOps target. + hwlab.pikastech.local/gitops-render-source-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + hwlab.pikastech.local/source-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + spec: + replicas: 1 + selector: + matchLabels: + app.kubernetes.io/name: hwlab-cloud-web + app.kubernetes.io/part-of: hwlab + hwlab.pikastech.local/environment: v03 + hwlab.pikastech.local/profile: v03 + template: + metadata: + labels: + app.kubernetes.io/name: hwlab-cloud-web + hwlab.pikastech.local/service-id: hwlab-cloud-web + app.kubernetes.io/part-of: hwlab + hwlab.pikastech.local/environment: v03 + hwlab.pikastech.local/profile: v03 + hwlab.pikastech.local/gitops-target: v03 + hwlab.pikastech.local/gitops-render-source-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + hwlab.pikastech.local/source-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + hwlab.pikastech.local/artifact-source-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + hwlab.pikastech.local/monitoring: disabled + hwlab.pikastech.local/runtime-mode: env-reuse-git-mirror-checkout + hwlab.pikastech.local/boot-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + annotations: + hwlab.pikastech.local/gitops-render-source-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + hwlab.pikastech.local/source-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + hwlab.pikastech.local/artifact-source-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + hwlab.pikastech.local/rendered-by: scripts/gitops-render.mjs + hwlab.pikastech.local/runtime-mode: env-reuse-git-mirror-checkout + hwlab.pikastech.local/boot-repo: git@github.com:pikasTech/HWLAB.git + hwlab.pikastech.local/boot-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + hwlab.pikastech.local/boot-sh: deploy/runtime/boot/hwlab-cloud-web.sh + hwlab.pikastech.local/environment-digest: sha256:35be9f812c9aef6d989caf83def79bdfe5dca42f461d9f99fb34622b38ff9b2f + hwlab.pikastech.local/environment-input-hash: f5109d26020b05d9023ab1a6dd4e34ed07c9bbca03fc8d0a4697cc208c85a175 + hwlab.pikastech.local/code-input-hash: a30d3b6d134dd5e18879523ba0022838e879eb06f3bfb0753eca9d236d7d7780 + spec: + containers: + - name: hwlab-cloud-web + image: 127.0.0.1:5000/hwlab/hwlab-cloud-web-env@sha256:35be9f812c9aef6d989caf83def79bdfe5dca42f461d9f99fb34622b38ff9b2f + ports: + - name: http + containerPort: 8080 + env: + - name: HWLAB_API_BASE_URL + value: http://hwlab-cloud-api.hwlab-v03.svc.cluster.local:6667 + - name: HWLAB_CLOUD_WEB_PROXY_TIMEOUT_MS + value: "1260000" + - name: HWLAB_COMMIT_ID + value: effbb79199d1117de0634904cdb019c5c0b0ee9f + - name: HWLAB_IMAGE + value: 127.0.0.1:5000/hwlab/hwlab-cloud-web-env@sha256:35be9f812c9aef6d989caf83def79bdfe5dca42f461d9f99fb34622b38ff9b2f + - name: HWLAB_IMAGE_TAG + value: env-f5109d26020b + - name: HWLAB_ENVIRONMENT + value: v03 + - name: HWLAB_CLOUD_WEB_DISPLAY_TIME_ZONE + value: Asia/Shanghai + - name: HWLAB_CLOUD_WEB_DISPLAY_TIME_LOCALE + value: zh-CN + - name: HWLAB_CLOUD_WEB_DISPLAY_TIME_LABEL + value: 北京时间 + - name: HWLAB_CLOUD_WEB_OPENCODE_UPSTREAM_URL + value: http://opencode-server.hwlab-v03.svc.cluster.local:4096 + - name: HWLAB_CLOUD_WEB_OPENCODE_USERNAME + valueFrom: + secretKeyRef: + name: hwlab-v03-opencode-server-auth + key: username + optional: true + - name: HWLAB_CLOUD_WEB_OPENCODE_PASSWORD + valueFrom: + secretKeyRef: + name: hwlab-v03-opencode-server-auth + key: password + optional: true + - name: HWLAB_CLOUD_WEB_OPENCODE_DEFAULT_PROJECT + value: /workspace + - name: HWLAB_CLOUD_WEB_OPENCODE_EVENT_DIRECTORY_FROM + value: /workspace + - name: HWLAB_CLOUD_WEB_OPENCODE_EVENT_DIRECTORY_TO + value: / + - name: OTEL_EXPORTER_OTLP_TRACES_ENDPOINT + value: http://otel-collector.platform-infra.svc.cluster.local:4318/v1/traces + - name: OTEL_SERVICE_NAME + value: hwlab-cloud-web + - name: HWLAB_GITOPS_TARGET + value: v03 + - name: HWLAB_GITOPS_PROFILE + value: v03 + - name: HWLAB_GITOPS_SOURCE_COMMIT + value: effbb79199d1117de0634904cdb019c5c0b0ee9f + - name: HWLAB_RUNTIME_MODE + value: env-reuse-git-mirror-checkout + - name: HWLAB_BOOT_REPO + value: git@github.com:pikasTech/HWLAB.git + - name: HWLAB_BOOT_COMMIT + value: effbb79199d1117de0634904cdb019c5c0b0ee9f + - name: HWLAB_BOOT_REF + value: v0.3 + - name: HWLAB_BOOT_SH + value: deploy/runtime/boot/hwlab-cloud-web.sh + - name: HWLAB_BOOT_READ_URL + value: http://git-mirror-http.devops-infra.svc.cluster.local:8080/pikasTech/HWLAB.git + - name: HWLAB_ENVIRONMENT_IMAGE + value: 127.0.0.1:5000/hwlab/hwlab-cloud-web-env:env-f5109d26020b + - name: HWLAB_ENVIRONMENT_DIGEST + value: sha256:35be9f812c9aef6d989caf83def79bdfe5dca42f461d9f99fb34622b38ff9b2f + - name: HWLAB_ENVIRONMENT_INPUT_HASH + value: f5109d26020b05d9023ab1a6dd4e34ed07c9bbca03fc8d0a4697cc208c85a175 + - name: HWLAB_CODE_INPUT_HASH + value: a30d3b6d134dd5e18879523ba0022838e879eb06f3bfb0753eca9d236d7d7780 + - name: HWLAB_IMAGE_DIGEST + value: sha256:35be9f812c9aef6d989caf83def79bdfe5dca42f461d9f99fb34622b38ff9b2f + - name: HWLAB_PUBLIC_ENDPOINT + value: https://hwlab.pikapython.com + - name: HWLAB_WORKBENCH_TRACE_AUTO_EXPAND_RUNNING + value: "0" + - name: HWLAB_WORKBENCH_TRACE_AUTO_COLLAPSE_TERMINAL + value: "0" + - name: HWLAB_CLOUD_WEB_OPENCODE_URL + value: https://opencode-jd01-v03.pikapython.com + readinessProbe: + httpGet: + path: /health/live + port: http + livenessProbe: + httpGet: + path: /health/live + port: http + imagePullPolicy: IfNotPresent + startupProbe: + httpGet: + path: /health/live + port: http + periodSeconds: 10 + timeoutSeconds: 2 + failureThreshold: 30 + successThreshold: 1 + volumes: [] + - apiVersion: apps/v1 + kind: Deployment + metadata: + name: hwlab-gateway + namespace: hwlab-v03 + labels: + app.kubernetes.io/name: hwlab-gateway + hwlab.pikastech.local/service-id: hwlab-gateway + hwlab.pikastech.local/activation: manual + app.kubernetes.io/part-of: hwlab + hwlab.pikastech.local/environment: v03 + hwlab.pikastech.local/profile: v03 + hwlab.pikastech.local/gitops-target: v03 + hwlab.pikastech.local/gitops-render-source-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + hwlab.pikastech.local/source-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + unidesk.ai/node-staging: "false" + annotations: + hwlab.pikastech.local/gitops-note: node DEV GitOps target. + hwlab.pikastech.local/gitops-render-source-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + hwlab.pikastech.local/source-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + spec: + replicas: 0 + selector: + matchLabels: + app.kubernetes.io/name: hwlab-gateway + app.kubernetes.io/part-of: hwlab + hwlab.pikastech.local/environment: v03 + hwlab.pikastech.local/profile: v03 + template: + metadata: + labels: + app.kubernetes.io/name: hwlab-gateway + hwlab.pikastech.local/service-id: hwlab-gateway + app.kubernetes.io/part-of: hwlab + hwlab.pikastech.local/environment: v03 + hwlab.pikastech.local/profile: v03 + hwlab.pikastech.local/gitops-target: v03 + hwlab.pikastech.local/gitops-render-source-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + hwlab.pikastech.local/source-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + hwlab.pikastech.local/artifact-source-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + hwlab.pikastech.local/runtime-mode: env-reuse-git-mirror-checkout + hwlab.pikastech.local/boot-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + annotations: + hwlab.pikastech.local/gitops-render-source-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + hwlab.pikastech.local/source-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + hwlab.pikastech.local/artifact-source-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + hwlab.pikastech.local/rendered-by: scripts/gitops-render.mjs + hwlab.pikastech.local/runtime-mode: env-reuse-git-mirror-checkout + hwlab.pikastech.local/boot-repo: git@github.com:pikasTech/HWLAB.git + hwlab.pikastech.local/boot-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + hwlab.pikastech.local/boot-sh: deploy/runtime/boot/hwlab-gateway.sh + hwlab.pikastech.local/environment-digest: sha256:b76f2121c080362affe89bdb21b1b55e9e42fabd15c31392b20ab5bc5018e964 + hwlab.pikastech.local/environment-input-hash: f5109d26020b05d9023ab1a6dd4e34ed07c9bbca03fc8d0a4697cc208c85a175 + hwlab.pikastech.local/code-input-hash: 9693556c71091e3e85d61efc6ef7d62e1064fba145ec83b3b9c196477f0b2870 + spec: + containers: + - name: hwlab-gateway + image: 127.0.0.1:5000/hwlab/hwlab-gateway-env@sha256:b76f2121c080362affe89bdb21b1b55e9e42fabd15c31392b20ab5bc5018e964 + ports: + - name: http + containerPort: 7001 + env: + - name: HWLAB_GATEWAY_MODE + value: hardware-boundary + - name: HWLAB_ENVIRONMENT + value: v03 + - name: TZ + value: Asia/Shanghai + - name: HWLAB_COMMIT_ID + value: effbb79199d1117de0634904cdb019c5c0b0ee9f + - name: HWLAB_IMAGE + value: 127.0.0.1:5000/hwlab/hwlab-gateway-env@sha256:b76f2121c080362affe89bdb21b1b55e9e42fabd15c31392b20ab5bc5018e964 + - name: HWLAB_IMAGE_TAG + value: env-f5109d26020b + - name: HWLAB_GITOPS_TARGET + value: v03 + - name: HWLAB_GITOPS_PROFILE + value: v03 + - name: HWLAB_GITOPS_SOURCE_COMMIT + value: effbb79199d1117de0634904cdb019c5c0b0ee9f + - name: HWLAB_RUNTIME_MODE + value: env-reuse-git-mirror-checkout + - name: HWLAB_BOOT_REPO + value: git@github.com:pikasTech/HWLAB.git + - name: HWLAB_BOOT_COMMIT + value: effbb79199d1117de0634904cdb019c5c0b0ee9f + - name: HWLAB_BOOT_REF + value: v0.3 + - name: HWLAB_BOOT_SH + value: deploy/runtime/boot/hwlab-gateway.sh + - name: HWLAB_BOOT_READ_URL + value: http://git-mirror-http.devops-infra.svc.cluster.local:8080/pikasTech/HWLAB.git + - name: HWLAB_ENVIRONMENT_IMAGE + value: 127.0.0.1:5000/hwlab/hwlab-gateway-env:env-f5109d26020b + - name: HWLAB_ENVIRONMENT_DIGEST + value: sha256:b76f2121c080362affe89bdb21b1b55e9e42fabd15c31392b20ab5bc5018e964 + - name: HWLAB_ENVIRONMENT_INPUT_HASH + value: f5109d26020b05d9023ab1a6dd4e34ed07c9bbca03fc8d0a4697cc208c85a175 + - name: HWLAB_CODE_INPUT_HASH + value: 9693556c71091e3e85d61efc6ef7d62e1064fba145ec83b3b9c196477f0b2870 + - name: HWLAB_IMAGE_DIGEST + value: sha256:b76f2121c080362affe89bdb21b1b55e9e42fabd15c31392b20ab5bc5018e964 + readinessProbe: + httpGet: + path: /health/live + port: http + livenessProbe: + httpGet: + path: /health/live + port: http + imagePullPolicy: IfNotPresent + startupProbe: + httpGet: + path: /health/live + port: http + periodSeconds: 10 + timeoutSeconds: 2 + failureThreshold: 30 + successThreshold: 1 + - apiVersion: apps/v1 + kind: Deployment + metadata: + name: hwlab-edge-proxy + namespace: hwlab-v03 + labels: + app.kubernetes.io/name: hwlab-edge-proxy + hwlab.pikastech.local/service-id: hwlab-edge-proxy + app.kubernetes.io/part-of: hwlab + hwlab.pikastech.local/environment: v03 + hwlab.pikastech.local/profile: v03 + hwlab.pikastech.local/gitops-target: v03 + hwlab.pikastech.local/gitops-render-source-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + hwlab.pikastech.local/source-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + unidesk.ai/node-staging: "false" + hwlab.pikastech.local/monitoring: disabled + annotations: + hwlab.pikastech.local/gitops-note: node DEV GitOps target. + hwlab.pikastech.local/gitops-render-source-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + hwlab.pikastech.local/source-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + spec: + replicas: 1 + selector: + matchLabels: + app.kubernetes.io/name: hwlab-edge-proxy + app.kubernetes.io/part-of: hwlab + hwlab.pikastech.local/environment: v03 + hwlab.pikastech.local/profile: v03 + template: + metadata: + labels: + app.kubernetes.io/name: hwlab-edge-proxy + hwlab.pikastech.local/service-id: hwlab-edge-proxy + app.kubernetes.io/part-of: hwlab + hwlab.pikastech.local/environment: v03 + hwlab.pikastech.local/profile: v03 + hwlab.pikastech.local/gitops-target: v03 + hwlab.pikastech.local/gitops-render-source-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + hwlab.pikastech.local/source-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + hwlab.pikastech.local/artifact-source-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + hwlab.pikastech.local/monitoring: disabled + hwlab.pikastech.local/runtime-mode: env-reuse-git-mirror-checkout + hwlab.pikastech.local/boot-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + annotations: + hwlab.pikastech.local/gitops-render-source-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + hwlab.pikastech.local/source-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + hwlab.pikastech.local/artifact-source-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + hwlab.pikastech.local/rendered-by: scripts/gitops-render.mjs + hwlab.pikastech.local/runtime-mode: env-reuse-git-mirror-checkout + hwlab.pikastech.local/boot-repo: git@github.com:pikasTech/HWLAB.git + hwlab.pikastech.local/boot-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + hwlab.pikastech.local/boot-sh: deploy/runtime/boot/hwlab-edge-proxy.sh + hwlab.pikastech.local/environment-digest: sha256:f676f4feed046fadfc36f4ec21608f2531559f70ee647ebad2b311967f55a028 + hwlab.pikastech.local/environment-input-hash: f5109d26020b05d9023ab1a6dd4e34ed07c9bbca03fc8d0a4697cc208c85a175 + hwlab.pikastech.local/code-input-hash: c97d19939c872e128a6931bdf73f28a75a684948a76a2b1af37508dd47481544 + spec: + containers: + - name: hwlab-edge-proxy + image: 127.0.0.1:5000/hwlab/hwlab-edge-proxy-env@sha256:f676f4feed046fadfc36f4ec21608f2531559f70ee647ebad2b311967f55a028 + ports: + - name: http + containerPort: 6667 + env: + - name: HWLAB_EDGE_LISTEN + value: 0.0.0.0:6667 + - name: HWLAB_EDGE_UPSTREAM + value: http://hwlab-cloud-api.hwlab-v03.svc.cluster.local:6667 + - name: HWLAB_EDGE_PROXY_TIMEOUT_MS + value: "1260000" + - name: HWLAB_EDGE_IDLE_TIMEOUT_SECONDS + value: "120" + - name: TZ + value: Asia/Shanghai + - name: HWLAB_ENVIRONMENT + value: v03 + - name: HWLAB_COMMIT_ID + value: effbb79199d1117de0634904cdb019c5c0b0ee9f + - name: HWLAB_IMAGE + value: 127.0.0.1:5000/hwlab/hwlab-edge-proxy-env@sha256:f676f4feed046fadfc36f4ec21608f2531559f70ee647ebad2b311967f55a028 + - name: HWLAB_IMAGE_TAG + value: env-f5109d26020b + - name: HWLAB_GITOPS_TARGET + value: v03 + - name: HWLAB_GITOPS_PROFILE + value: v03 + - name: HWLAB_GITOPS_SOURCE_COMMIT + value: effbb79199d1117de0634904cdb019c5c0b0ee9f + - name: HWLAB_RUNTIME_MODE + value: env-reuse-git-mirror-checkout + - name: HWLAB_BOOT_REPO + value: git@github.com:pikasTech/HWLAB.git + - name: HWLAB_BOOT_COMMIT + value: effbb79199d1117de0634904cdb019c5c0b0ee9f + - name: HWLAB_BOOT_REF + value: v0.3 + - name: HWLAB_BOOT_SH + value: deploy/runtime/boot/hwlab-edge-proxy.sh + - name: HWLAB_BOOT_READ_URL + value: http://git-mirror-http.devops-infra.svc.cluster.local:8080/pikasTech/HWLAB.git + - name: HWLAB_ENVIRONMENT_IMAGE + value: 127.0.0.1:5000/hwlab/hwlab-edge-proxy-env:env-f5109d26020b + - name: HWLAB_ENVIRONMENT_DIGEST + value: sha256:f676f4feed046fadfc36f4ec21608f2531559f70ee647ebad2b311967f55a028 + - name: HWLAB_ENVIRONMENT_INPUT_HASH + value: f5109d26020b05d9023ab1a6dd4e34ed07c9bbca03fc8d0a4697cc208c85a175 + - name: HWLAB_CODE_INPUT_HASH + value: c97d19939c872e128a6931bdf73f28a75a684948a76a2b1af37508dd47481544 + - name: HWLAB_IMAGE_DIGEST + value: sha256:f676f4feed046fadfc36f4ec21608f2531559f70ee647ebad2b311967f55a028 + - name: HWLAB_PUBLIC_ENDPOINT + value: https://hwlab.pikapython.com + readinessProbe: + httpGet: + path: /health + port: http + timeoutSeconds: 3 + failureThreshold: 5 + livenessProbe: + httpGet: + path: /health + port: http + periodSeconds: 20 + timeoutSeconds: 5 + failureThreshold: 6 + imagePullPolicy: IfNotPresent + startupProbe: + httpGet: + path: /health/live + port: http + periodSeconds: 10 + timeoutSeconds: 3 + failureThreshold: 30 + successThreshold: 1 + volumes: [] + - apiVersion: apps/v1 + kind: Deployment + metadata: + name: hwlab-agent-skills + namespace: hwlab-v03 + labels: + app.kubernetes.io/name: hwlab-agent-skills + hwlab.pikastech.local/service-id: hwlab-agent-skills + app.kubernetes.io/part-of: hwlab + hwlab.pikastech.local/environment: v03 + hwlab.pikastech.local/profile: v03 + hwlab.pikastech.local/gitops-target: v03 + hwlab.pikastech.local/gitops-render-source-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + hwlab.pikastech.local/source-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + unidesk.ai/node-staging: "false" + hwlab.pikastech.local/monitoring: disabled + annotations: + hwlab.pikastech.local/gitops-note: node DEV GitOps target. + hwlab.pikastech.local/gitops-render-source-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + hwlab.pikastech.local/source-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + spec: + replicas: 1 + selector: + matchLabels: + app.kubernetes.io/name: hwlab-agent-skills + app.kubernetes.io/part-of: hwlab + hwlab.pikastech.local/environment: v03 + hwlab.pikastech.local/profile: v03 + template: + metadata: + labels: + app.kubernetes.io/name: hwlab-agent-skills + hwlab.pikastech.local/service-id: hwlab-agent-skills + app.kubernetes.io/part-of: hwlab + hwlab.pikastech.local/environment: v03 + hwlab.pikastech.local/profile: v03 + hwlab.pikastech.local/gitops-target: v03 + hwlab.pikastech.local/gitops-render-source-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + hwlab.pikastech.local/source-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + hwlab.pikastech.local/artifact-source-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + hwlab.pikastech.local/monitoring: disabled + hwlab.pikastech.local/runtime-mode: env-reuse-git-mirror-checkout + hwlab.pikastech.local/boot-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + annotations: + hwlab.pikastech.local/gitops-render-source-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + hwlab.pikastech.local/source-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + hwlab.pikastech.local/artifact-source-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + hwlab.pikastech.local/rendered-by: scripts/gitops-render.mjs + hwlab.pikastech.local/runtime-mode: env-reuse-git-mirror-checkout + hwlab.pikastech.local/boot-repo: git@github.com:pikasTech/HWLAB.git + hwlab.pikastech.local/boot-commit: effbb79199d1117de0634904cdb019c5c0b0ee9f + hwlab.pikastech.local/boot-sh: deploy/runtime/boot/hwlab-agent-skills.sh + hwlab.pikastech.local/environment-digest: sha256:c5f17f44cbca65aa5c9d0d0dc53e1f136163b44f234e7d052b411ba9d54b0eaf + hwlab.pikastech.local/environment-input-hash: f5109d26020b05d9023ab1a6dd4e34ed07c9bbca03fc8d0a4697cc208c85a175 + hwlab.pikastech.local/code-input-hash: 369ca524ae4010fb5d9adfd30b4290808a035804b4674755bc193fee743f3d5a + spec: + containers: + - name: hwlab-agent-skills + image: 127.0.0.1:5000/hwlab/hwlab-agent-skills-env@sha256:c5f17f44cbca65aa5c9d0d0dc53e1f136163b44f234e7d052b411ba9d54b0eaf + ports: + - name: http + containerPort: 7430 + env: + - name: HWLAB_SKILLS_COMMIT_ID + value: effbb79199d1117de0634904cdb019c5c0b0ee9f + - name: TZ + value: Asia/Shanghai + - name: HWLAB_ENVIRONMENT + value: v03 + - name: HWLAB_COMMIT_ID + value: effbb79199d1117de0634904cdb019c5c0b0ee9f + - name: HWLAB_IMAGE + value: 127.0.0.1:5000/hwlab/hwlab-agent-skills-env@sha256:c5f17f44cbca65aa5c9d0d0dc53e1f136163b44f234e7d052b411ba9d54b0eaf + - name: HWLAB_IMAGE_TAG + value: env-f5109d26020b + - name: HWLAB_GITOPS_TARGET + value: v03 + - name: HWLAB_GITOPS_PROFILE + value: v03 + - name: HWLAB_GITOPS_SOURCE_COMMIT + value: effbb79199d1117de0634904cdb019c5c0b0ee9f + - name: HWLAB_RUNTIME_MODE + value: env-reuse-git-mirror-checkout + - name: HWLAB_BOOT_REPO + value: git@github.com:pikasTech/HWLAB.git + - name: HWLAB_BOOT_COMMIT + value: effbb79199d1117de0634904cdb019c5c0b0ee9f + - name: HWLAB_BOOT_REF + value: v0.3 + - name: HWLAB_BOOT_SH + value: deploy/runtime/boot/hwlab-agent-skills.sh + - name: HWLAB_BOOT_READ_URL + value: http://git-mirror-http.devops-infra.svc.cluster.local:8080/pikasTech/HWLAB.git + - name: HWLAB_ENVIRONMENT_IMAGE + value: 127.0.0.1:5000/hwlab/hwlab-agent-skills-env:env-f5109d26020b + - name: HWLAB_ENVIRONMENT_DIGEST + value: sha256:c5f17f44cbca65aa5c9d0d0dc53e1f136163b44f234e7d052b411ba9d54b0eaf + - name: HWLAB_ENVIRONMENT_INPUT_HASH + value: f5109d26020b05d9023ab1a6dd4e34ed07c9bbca03fc8d0a4697cc208c85a175 + - name: HWLAB_CODE_INPUT_HASH + value: 369ca524ae4010fb5d9adfd30b4290808a035804b4674755bc193fee743f3d5a + - name: HWLAB_IMAGE_DIGEST + value: sha256:c5f17f44cbca65aa5c9d0d0dc53e1f136163b44f234e7d052b411ba9d54b0eaf + readinessProbe: + httpGet: + path: /health/live + port: http + livenessProbe: + httpGet: + path: /health/live + port: http + imagePullPolicy: IfNotPresent + startupProbe: + httpGet: + path: /health/live + port: http + periodSeconds: 10 + timeoutSeconds: 2 + failureThreshold: 30 + successThreshold: 1 + volumes: []