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" }