From 07fcb84c5ee45b239c5142ea78aade61f8291164 Mon Sep 17 00:00:00 2001 From: veryCrunchy Date: Sun, 1 Feb 2026 07:00:56 +0100 Subject: [PATCH] refactor(api): remove deprecated docker container endpoints Remove several server API routes for Docker management from the dashboard app and clean up workspace tsconfig references. Deleted endpoints: - POST /api/docker/status-container (start/stop/restart/kill container) - GET /api/docker/list-containers (list and map container info) - GET /api/docker/attach-stream (attach to container logs/stream) Also removed a lingering package reference to the database package from packages/config/tsconfig.json and commented workspace references in the root tsconfig.json (and removed the database project reference). These changes simplify the dashboard server surface and remove unused or deprecated container control endpoints and stale TypeScript project references. --- apps/dashboard/package.json | 1 - .../server/api/docker/attach-stream.get.ts | 140 ------------------ .../api/docker/create-container.post.ts | 32 ---- .../api/docker/inspect-container.get.ts | 12 -- .../server/api/docker/list-containers.get.ts | 50 ------- .../api/docker/status-container.post.ts | 33 ----- apps/dashboard/server/docker-config.ts | 7 - packages/config/tsconfig.json | 1 - tsconfig.json | 6 - 9 files changed, 282 deletions(-) delete mode 100644 apps/dashboard/server/api/docker/attach-stream.get.ts delete mode 100644 apps/dashboard/server/api/docker/create-container.post.ts delete mode 100644 apps/dashboard/server/api/docker/inspect-container.get.ts delete mode 100644 apps/dashboard/server/api/docker/list-containers.get.ts delete mode 100644 apps/dashboard/server/api/docker/status-container.post.ts delete mode 100644 apps/dashboard/server/docker-config.ts diff --git a/apps/dashboard/package.json b/apps/dashboard/package.json index 847a70d6..70ebf411 100644 --- a/apps/dashboard/package.json +++ b/apps/dashboard/package.json @@ -22,7 +22,6 @@ "@connectrpc/connect-web": "^2.1.1", "@heroicons/vue": "^2.2.0", "@nuxt/icon": "^2.1.0", - "@obiente/docker-engine": "workspace:*", "@obiente/proto": "workspace:*", "@obiente/types": "workspace:*", "@pinia/nuxt": "^0.11.3", diff --git a/apps/dashboard/server/api/docker/attach-stream.get.ts b/apps/dashboard/server/api/docker/attach-stream.get.ts deleted file mode 100644 index 1ddcc69b..00000000 --- a/apps/dashboard/server/api/docker/attach-stream.get.ts +++ /dev/null @@ -1,140 +0,0 @@ -import { ContainerApi } from "@obiente/docker-engine"; -import { config } from "../../docker-config"; - -export default defineEventHandler(async (event) => { - const query = getQuery(event); - const { id, follow = "true", tail = "100", timestamps = "true" } = query; - - if (!id || typeof id !== "string") { - throw createError({ - statusCode: 400, - statusMessage: "Container ID is required", - }); - } - - setHeader(event, "Content-Type", "text/event-stream"); - setHeader(event, "Cache-Control", "no-cache"); - setHeader(event, "Connection", "keep-alive"); - setHeader(event, "Access-Control-Allow-Origin", "*"); - setHeader(event, "Access-Control-Allow-Headers", "Cache-Control"); - - try { - const api = new ContainerApi(config); - - const containerResponse = await api.containerInspect(id); - if (!containerResponse.data) { - const errorEvent = { - type: "error", - data: "Container not found", - timestamp: new Date().toISOString(), - }; - event.node.res.write(`data: ${JSON.stringify(errorEvent)}\n\n`); - event.node.res.end(); - return; - } - - console.log(`Attaching to container ${id}...`); - const res = await api.containerAttach( - id, - undefined, - true, - true, - true, - true, - true, - { - responseType: "stream", - } - ); - console.log("connection established", res); - - const connectEvent = { - type: "connected", - data: `Connected to container ${id}`, - timestamp: new Date().toISOString(), - }; - event.node.res.write(`data: ${JSON.stringify(connectEvent)}\n\n`); - - if (res) { - const stream = res.data as unknown as NodeJS.ReadableStream; - let buffer = Buffer.alloc(0); - - stream.on("data", (chunk: Buffer) => { - console.log("data received"); - buffer = Buffer.concat([buffer, chunk]); - - while (buffer.length >= 8) { - // [STREAM_TYPE, 0, 0, 0, SIZE1, SIZE2, SIZE3, SIZE4] - const streamType = buffer[0]; - const size = buffer.readUInt32BE(4); - - if (buffer.length >= 8 + size) { - const payload = buffer.slice(8, 8 + size); - const message = payload.toString("utf8").trim(); - - if (message) { - const eventData = { - type: - streamType === 1 - ? "stdout" - : streamType === 2 - ? "stderr" - : "stdin", - data: message, - timestamp: new Date().toISOString(), - }; - - event.node.res.write(`data: ${JSON.stringify(eventData)}\n\n`); - } - - buffer = buffer.slice(8 + size); - } else { - break; - } - } - }); - - stream.on("error", (error: Error) => { - console.error("Stream error:", error); - const errorEvent = { - type: "error", - data: error.message, - timestamp: new Date().toISOString(), - }; - event.node.res.write(`data: ${JSON.stringify(errorEvent)}\n\n`); - }); - - stream.on("end", () => { - const endEvent = { - type: "end", - data: "Stream ended", - timestamp: new Date().toISOString(), - }; - event.node.res.write(`data: ${JSON.stringify(endEvent)}\n\n`); - event.node.res.end(); - }); - - event.node.req.on("close", () => { - console.log("Client disconnected from container stream"); - if (typeof (stream as any).destroy === "function") { - (stream as any).destroy(); - } - }); - - return new Promise((resolve) => { - event.node.req.on("close", resolve); - }); - } - } catch (error: any) { - console.error("Error setting up container stream:", error); - - const errorEvent = { - type: "error", - data: error.message || "Failed to connect to container", - timestamp: new Date().toISOString(), - }; - - event.node.res.write(`data: ${JSON.stringify(errorEvent)}\n\n`); - event.node.res.end(); - } -}); diff --git a/apps/dashboard/server/api/docker/create-container.post.ts b/apps/dashboard/server/api/docker/create-container.post.ts deleted file mode 100644 index 430226e2..00000000 --- a/apps/dashboard/server/api/docker/create-container.post.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { ContainerApi, NodeApi } from "@obiente/docker-engine"; -import { config } from "../../docker-config"; - -export default defineEventHandler(async (event) => { - const query = getQuery(event); - - const randomName = - Math.random().toString(36).substring(2, 15) + - Math.random().toString(36).substring(2, 15); - - const api = new ContainerApi(config); - - const createResponse = await api.containerCreate({ - Hostname: randomName, - Image: "alpine", - Cmd: ["tail", "-f", "/dev/null"], - Labels: { - id: "dargy", - }, - AttachStdin: false, - AttachStdout: false, - AttachStderr: false, - Tty: false, - }); - - const containerId = createResponse.data.Id; - if (containerId) { - await api.containerStart(containerId); - } - - return createResponse.data; -}); diff --git a/apps/dashboard/server/api/docker/inspect-container.get.ts b/apps/dashboard/server/api/docker/inspect-container.get.ts deleted file mode 100644 index f14440be..00000000 --- a/apps/dashboard/server/api/docker/inspect-container.get.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { ContainerApi, NodeApi } from "@obiente/docker-engine"; -import { config } from "../../docker-config"; - -export default defineEventHandler(async (event) => { - const query = getQuery(event); - const id = query && query.id ? String(query.id) : undefined; - if (!id) throw new Error("Container ID is required"); - - const api = new ContainerApi(config); - const data = (await api.containerInspect(id)).data; - return data; -}); diff --git a/apps/dashboard/server/api/docker/list-containers.get.ts b/apps/dashboard/server/api/docker/list-containers.get.ts deleted file mode 100644 index 5c8e2ed3..00000000 --- a/apps/dashboard/server/api/docker/list-containers.get.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { ContainerApi } from "@obiente/docker-engine"; -import { config } from "../../docker-config"; - -export default defineEventHandler(async (event) => { - const query = getQuery(event); - const { all = "false", size = "false" } = query; - - try { - const api = new ContainerApi(config); - - // List containers (all=true includes stopped containers) - const response = await api.containerList( - all === "true", // all containers or just running - undefined, // limit - size === "true", // include size information - undefined // filters - ); - - // Transform the response to include useful information - const containers = response.data.map((container) => ({ - id: container.Id, - names: container.Names, - image: container.Image, - imageId: container.ImageID, - command: container.Command, - created: container.Created, - ports: container.Ports, - labels: container.Labels, - state: container.State, - status: container.Status, - hostConfig: container.HostConfig, - networkSettings: container.NetworkSettings, - mounts: container.Mounts, - size: container.SizeRw || 0, - sizeRootFs: container.SizeRootFs || 0, - })); - - return { - success: true, - containers, - count: containers.length, - }; - } catch (error) { - console.error("Error listing containers:", error); - throw createError({ - statusCode: 500, - statusMessage: "Failed to list containers: " + (error as Error).message, - }); - } -}); diff --git a/apps/dashboard/server/api/docker/status-container.post.ts b/apps/dashboard/server/api/docker/status-container.post.ts deleted file mode 100644 index d570fa5e..00000000 --- a/apps/dashboard/server/api/docker/status-container.post.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { ContainerApi, NodeApi } from "@obiente/docker-engine"; -import { config } from "../../docker-config"; - -export default defineEventHandler(async (event) => { - const query = getQuery(event); - const id = query && query.id ? String(query.id) : undefined; - if (!id) throw new Error("Container ID is required"); - const status = query && query.status ? String(query.status) : undefined; - if (!status) throw new Error("Status parameter is required"); - - const api = new ContainerApi(config); - switch (status) { - case "start": - const startData = (await api.containerStart(id)).data; - return startData; - break; - case "stop": - const stopData = (await api.containerStop(id)).data; - return stopData; - break; - case "restart": - const restartData = (await api.containerRestart(id)).data; - return restartData; - break; - case "kill": - const killData = (await api.containerKill(id)).data; - return killData; - break; - default: - throw new Error("Invalid status parameter"); - break; - } -}); diff --git a/apps/dashboard/server/docker-config.ts b/apps/dashboard/server/docker-config.ts deleted file mode 100644 index 6fadc8a6..00000000 --- a/apps/dashboard/server/docker-config.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { Configuration } from "@obiente/docker-engine"; - -export const config = new Configuration({ - baseOptions: { - socketPath: "/var/run/docker.sock", - }, -}); diff --git a/packages/config/tsconfig.json b/packages/config/tsconfig.json index 4460bc8a..6a80954c 100644 --- a/packages/config/tsconfig.json +++ b/packages/config/tsconfig.json @@ -6,7 +6,6 @@ "@obiente/types": ["../types/src"], "@obiente/ui": ["../ui/src"], "@obiente/proto": ["../proto/src"], - "@obiente/database": ["../database/src"] } }, "include": ["src/**/*", "**/*.ts", "**/*.js"], diff --git a/tsconfig.json b/tsconfig.json index 89da617c..5be487f1 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -5,9 +5,6 @@ // "@obiente/config/*": [ // "./packages/config/*" // ], - // "@obiente/database": [ - // "./packages/database/src" - // ], // "@obiente/proto": [ // "./packages/proto/src" // ], @@ -22,9 +19,6 @@ "include": ["apps/**/*", "packages/**/*", ".**"], "exclude": ["node_modules", "dist"], "references": [ - { - "path": "./packages/database" - }, { "path": "./tools/nxsh" }