feat: add code queue deploy cli

This commit is contained in:
Codex
2026-05-16 04:10:02 +00:00
parent 502f5971b1
commit 88516cec6a
10 changed files with 888 additions and 15 deletions
@@ -42,6 +42,211 @@ endpoints:
- addresses:
- "172.25.0.3"
---
apiVersion: v1
kind: ConfigMap
metadata:
name: d601-tcp-egress-gateway
namespace: unidesk
labels:
app.kubernetes.io/name: tcp-egress-gateway
app.kubernetes.io/part-of: unidesk
unidesk.ai/provider-id: D601
data:
tcp-egress-gateway.js: |
const net = require("node:net");
const proxyUrl = new URL(process.env.TCP_EGRESS_HTTP_PROXY || "http://d601-provider-egress-proxy.unidesk.svc.cluster.local:18789");
const proxyHost = proxyUrl.hostname;
const proxyPort = Number(proxyUrl.port || 80);
const healthPort = Number(process.env.TCP_EGRESS_HEALTH_PORT || 18080);
const rawRoutes = process.env.TCP_EGRESS_ROUTES || "";
const startedAt = new Date().toISOString();
function parseRoute(text) {
const parts = text.trim().split("=");
if (parts.length !== 3) throw new Error(`invalid route: ${text}`);
const [name, listenPortText, target] = parts;
const [targetHost, targetPortText] = target.split(":");
const listenPort = Number(listenPortText);
const targetPort = Number(targetPortText);
if (!name || !targetHost || !Number.isInteger(listenPort) || !Number.isInteger(targetPort)) throw new Error(`invalid route: ${text}`);
return { name, listenPort, targetHost, targetPort };
}
const routes = rawRoutes.split(",").map((item) => item.trim()).filter(Boolean).map(parseRoute);
if (routes.length === 0) throw new Error("TCP_EGRESS_ROUTES must define at least one route");
function findHeaderEnd(buffer) {
for (let index = 0; index <= buffer.length - 4; index += 1) {
if (buffer[index] === 13 && buffer[index + 1] === 10 && buffer[index + 2] === 13 && buffer[index + 3] === 10) return index + 4;
}
return -1;
}
function log(level, message, data = {}) {
console.log(JSON.stringify({ ts: new Date().toISOString(), service: "tcp-egress-gateway", level, message, data }));
}
function pipeViaHttpConnect(client, route) {
const proxy = net.connect({ host: proxyHost, port: proxyPort });
const earlyClientChunks = [];
const proxyHeaderChunks = [];
let tunnelReady = false;
let closed = false;
const closeBoth = () => {
if (closed) return;
closed = true;
client.destroy();
proxy.destroy();
};
client.on("data", (chunk) => {
if (tunnelReady) proxy.write(chunk);
else earlyClientChunks.push(chunk);
});
client.on("error", closeBoth);
client.on("close", closeBoth);
proxy.on("connect", () => {
proxy.write(`CONNECT ${route.targetHost}:${route.targetPort} HTTP/1.1\r\nHost: ${route.targetHost}:${route.targetPort}\r\n\r\n`);
});
proxy.on("data", (chunk) => {
if (tunnelReady) {
client.write(chunk);
return;
}
proxyHeaderChunks.push(chunk);
const headerBuffer = Buffer.concat(proxyHeaderChunks);
const headerEnd = findHeaderEnd(headerBuffer);
if (headerEnd < 0) return;
const header = headerBuffer.subarray(0, headerEnd).toString("latin1");
if (!/^HTTP\/1\.[01] 200\b/u.test(header)) {
log("warn", "connect_rejected", { route: route.name, header: header.slice(0, 200) });
closeBoth();
return;
}
tunnelReady = true;
const remaining = headerBuffer.subarray(headerEnd);
if (remaining.length > 0) client.write(remaining);
for (const early of earlyClientChunks) proxy.write(early);
earlyClientChunks.length = 0;
});
proxy.on("error", (error) => {
log("warn", "proxy_error", { route: route.name, error: String(error?.message || error) });
closeBoth();
});
proxy.on("close", closeBoth);
}
for (const route of routes) {
net.createServer((client) => pipeViaHttpConnect(client, route)).listen(route.listenPort, "0.0.0.0", () => {
log("info", "route_listening", { route: route.name, listenPort: route.listenPort, target: `${route.targetHost}:${route.targetPort}`, proxy: `${proxyHost}:${proxyPort}` });
});
}
Bun.serve({
hostname: "0.0.0.0",
port: healthPort,
fetch() {
return Response.json({ ok: true, service: "tcp-egress-gateway", startedAt, proxy: `${proxyHost}:${proxyPort}`, routes });
},
});
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: d601-tcp-egress-gateway
namespace: unidesk
labels:
app.kubernetes.io/name: tcp-egress-gateway
app.kubernetes.io/part-of: unidesk
unidesk.ai/provider-id: D601
spec:
replicas: 1
selector:
matchLabels:
app.kubernetes.io/name: tcp-egress-gateway
unidesk.ai/provider-id: D601
template:
metadata:
labels:
app.kubernetes.io/name: tcp-egress-gateway
app.kubernetes.io/part-of: unidesk
unidesk.ai/provider-id: D601
unidesk.ai/node-id: D601
spec:
nodeSelector:
unidesk.ai/node-id: D601
containers:
- name: tcp-egress-gateway
image: unidesk-code-queue:d601
imagePullPolicy: IfNotPresent
command:
- bun
- /etc/unidesk-tcp-egress/tcp-egress-gateway.js
ports:
- name: pg
containerPort: 15432
- name: oa
containerPort: 4255
- name: health
containerPort: 18080
env:
- name: TCP_EGRESS_HTTP_PROXY
value: "http://d601-provider-egress-proxy.unidesk.svc.cluster.local:18789"
- name: TCP_EGRESS_ROUTES
value: "postgres=15432=74.48.78.17:15432,oa-event-flow=4255=74.48.78.17:4255"
- name: TCP_EGRESS_HEALTH_PORT
value: "18080"
volumeMounts:
- name: script
mountPath: /etc/unidesk-tcp-egress
readOnly: true
readinessProbe:
httpGet:
path: /health
port: health
periodSeconds: 5
timeoutSeconds: 3
failureThreshold: 12
livenessProbe:
httpGet:
path: /health
port: health
periodSeconds: 10
timeoutSeconds: 3
failureThreshold: 6
volumes:
- name: script
configMap:
name: d601-tcp-egress-gateway
---
apiVersion: v1
kind: Service
metadata:
name: d601-tcp-egress-gateway
namespace: unidesk
labels:
app.kubernetes.io/name: tcp-egress-gateway
app.kubernetes.io/part-of: unidesk
unidesk.ai/provider-id: D601
spec:
type: ClusterIP
selector:
app.kubernetes.io/name: tcp-egress-gateway
unidesk.ai/provider-id: D601
ports:
- name: pg
port: 15432
targetPort: pg
- name: oa
port: 4255
targetPort: oa
- name: health
port: 18080
targetPort: health
---
apiVersion: apps/v1
kind: Deployment
metadata:
@@ -86,6 +291,8 @@ spec:
value: "0.0.0.0"
- name: PORT
value: "4222"
- name: DATABASE_URL
value: "postgres://unidesk:unidesk_dev_password@d601-tcp-egress-gateway.unidesk.svc.cluster.local:15432/unidesk"
- name: CODE_QUEUE_INSTANCE_ID
value: "D601"
- name: CODE_QUEUE_SCHEDULER_ENABLED
@@ -139,7 +346,7 @@ spec:
- name: CODE_QUEUE_EGRESS_PROXY_URL
value: "http://d601-provider-egress-proxy.unidesk.svc.cluster.local:18789"
- name: CODE_QUEUE_EGRESS_PROXY_NO_PROXY
value: "localhost,127.0.0.1,::1,host.docker.internal,d601-provider-egress-proxy,d601-provider-egress-proxy.unidesk,d601-provider-egress-proxy.unidesk.svc,d601-provider-egress-proxy.unidesk.svc.cluster.local,172.25.0.3,unidesk-provider-gateway-D601,74.48.78.17,backend-core,oa-event-flow,database"
value: "localhost,127.0.0.1,::1,host.docker.internal,d601-provider-egress-proxy,d601-provider-egress-proxy.unidesk,d601-provider-egress-proxy.unidesk.svc,d601-provider-egress-proxy.unidesk.svc.cluster.local,d601-tcp-egress-gateway,d601-tcp-egress-gateway.unidesk,d601-tcp-egress-gateway.unidesk.svc,d601-tcp-egress-gateway.unidesk.svc.cluster.local,172.25.0.3,unidesk-provider-gateway-D601,backend-core,oa-event-flow,database"
- name: HTTP_PROXY
value: "http://d601-provider-egress-proxy.unidesk.svc.cluster.local:18789"
- name: HTTPS_PROXY
@@ -153,11 +360,11 @@ spec:
- name: all_proxy
value: "http://d601-provider-egress-proxy.unidesk.svc.cluster.local:18789"
- name: NO_PROXY
value: "localhost,127.0.0.1,::1,host.docker.internal,d601-provider-egress-proxy,d601-provider-egress-proxy.unidesk,d601-provider-egress-proxy.unidesk.svc,d601-provider-egress-proxy.unidesk.svc.cluster.local,172.25.0.3,unidesk-provider-gateway-D601,74.48.78.17,backend-core,oa-event-flow,database"
value: "localhost,127.0.0.1,::1,host.docker.internal,d601-provider-egress-proxy,d601-provider-egress-proxy.unidesk,d601-provider-egress-proxy.unidesk.svc,d601-provider-egress-proxy.unidesk.svc.cluster.local,d601-tcp-egress-gateway,d601-tcp-egress-gateway.unidesk,d601-tcp-egress-gateway.unidesk.svc,d601-tcp-egress-gateway.unidesk.svc.cluster.local,172.25.0.3,unidesk-provider-gateway-D601,backend-core,oa-event-flow,database"
- name: no_proxy
value: "localhost,127.0.0.1,::1,host.docker.internal,d601-provider-egress-proxy,d601-provider-egress-proxy.unidesk,d601-provider-egress-proxy.unidesk.svc,d601-provider-egress-proxy.unidesk.svc.cluster.local,172.25.0.3,unidesk-provider-gateway-D601,74.48.78.17,backend-core,oa-event-flow,database"
value: "localhost,127.0.0.1,::1,host.docker.internal,d601-provider-egress-proxy,d601-provider-egress-proxy.unidesk,d601-provider-egress-proxy.unidesk.svc,d601-provider-egress-proxy.unidesk.svc.cluster.local,d601-tcp-egress-gateway,d601-tcp-egress-gateway.unidesk,d601-tcp-egress-gateway.unidesk.svc,d601-tcp-egress-gateway.unidesk.svc.cluster.local,172.25.0.3,unidesk-provider-gateway-D601,backend-core,oa-event-flow,database"
- name: OA_EVENT_FLOW_BASE_URL
value: "http://74.48.78.17:4255"
value: "http://d601-tcp-egress-gateway.unidesk.svc.cluster.local:4255"
- name: CODE_QUEUE_NOTIFY_CLAUDEQQ_ENABLED
value: "true"
- name: CODE_QUEUE_NOTIFY_CLAUDEQQ_BASE_URL
@@ -310,6 +517,8 @@ spec:
value: "0.0.0.0"
- name: PORT
value: "4222"
- name: DATABASE_URL
value: "postgres://unidesk:unidesk_dev_password@d601-tcp-egress-gateway.unidesk.svc.cluster.local:15432/unidesk"
- name: CODE_QUEUE_INSTANCE_ID
value: "D518"
- name: CODE_QUEUE_SCHEDULER_ENABLED
@@ -363,7 +572,7 @@ spec:
- name: CODE_QUEUE_EGRESS_PROXY_URL
value: ""
- name: CODE_QUEUE_EGRESS_PROXY_NO_PROXY
value: "localhost,127.0.0.1,::1,host.docker.internal,74.48.78.17,backend-core,oa-event-flow,database"
value: "localhost,127.0.0.1,::1,host.docker.internal,d601-tcp-egress-gateway,d601-tcp-egress-gateway.unidesk,d601-tcp-egress-gateway.unidesk.svc,d601-tcp-egress-gateway.unidesk.svc.cluster.local,backend-core,oa-event-flow,database"
- name: HTTP_PROXY
value: ""
- name: HTTPS_PROXY
@@ -377,11 +586,11 @@ spec:
- name: all_proxy
value: ""
- name: NO_PROXY
value: "localhost,127.0.0.1,::1,host.docker.internal,74.48.78.17,backend-core,oa-event-flow,database"
value: "localhost,127.0.0.1,::1,host.docker.internal,d601-tcp-egress-gateway,d601-tcp-egress-gateway.unidesk,d601-tcp-egress-gateway.unidesk.svc,d601-tcp-egress-gateway.unidesk.svc.cluster.local,backend-core,oa-event-flow,database"
- name: no_proxy
value: "localhost,127.0.0.1,::1,host.docker.internal,74.48.78.17,backend-core,oa-event-flow,database"
value: "localhost,127.0.0.1,::1,host.docker.internal,d601-tcp-egress-gateway,d601-tcp-egress-gateway.unidesk,d601-tcp-egress-gateway.unidesk.svc,d601-tcp-egress-gateway.unidesk.svc.cluster.local,backend-core,oa-event-flow,database"
- name: OA_EVENT_FLOW_BASE_URL
value: "http://74.48.78.17:4255"
value: "http://d601-tcp-egress-gateway.unidesk.svc.cluster.local:4255"
- name: CODE_QUEUE_NOTIFY_CLAUDEQQ_ENABLED
value: "false"
- name: CODE_QUEUE_NOTIFY_CLAUDEQQ_BASE_URL