From bd37c8dc44e541939f97f9f321db85468bfdc3ee Mon Sep 17 00:00:00 2001 From: Leo dev Date: Sat, 27 Dec 2025 14:58:50 +0100 Subject: [PATCH] Node data --- src/app/api/get-docker/route.ts | 9 ++++++-- src/app/nodes/page.tsx | 39 +++++++++++++++++++-------------- src/core/client/node.ts | 21 +++++++++++++----- src/core/docker.ts | 4 ++-- src/lib/types.ts | 10 ++++++++- 5 files changed, 56 insertions(+), 27 deletions(-) diff --git a/src/app/api/get-docker/route.ts b/src/app/api/get-docker/route.ts index a6866c3..c70f62c 100644 --- a/src/app/api/get-docker/route.ts +++ b/src/app/api/get-docker/route.ts @@ -1,6 +1,8 @@ import { NextRequest, NextResponse } from "next/server"; import testAuth from "../auth"; import { StatusCodes } from "http-status-codes"; +import { getDocker } from "@/core/docker"; +import { Docker } from "@/lib/types"; export async function GET(req: NextRequest): Promise { const auth = await testAuth(req); @@ -12,8 +14,11 @@ export async function GET(req: NextRequest): Promise { ); } + const docker = await getDocker(); + return NextResponse.json({ message: "ok", - containers: [], - }); + version: docker.version.Version, + containers: docker.containers, + } as Docker); } diff --git a/src/app/nodes/page.tsx b/src/app/nodes/page.tsx index 2cc30ff..7235425 100644 --- a/src/app/nodes/page.tsx +++ b/src/app/nodes/page.tsx @@ -6,9 +6,9 @@ import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { Server, Plus, Settings, Trash2 } from "lucide-react"; import { Progress } from "@/components/ui/progress"; -import { Node, NodeLiveData } from "@/lib/types"; +import { Docker, Node, NodeLiveData } from "@/lib/types"; import { useEffect, useState } from "react"; -import { getLiveNodes } from "@/core/client/node"; +import { getDockerNode, getLiveNodes } from "@/core/client/node"; import { formatBytes } from "@/lib/format"; function DiskUsage({ liveData }: NodeLiveData) { @@ -28,6 +28,7 @@ function DiskUsage({ liveData }: NodeLiveData) { export default function NodesPage() { const [nodes, setNodes] = useState<(NodeLiveData & Node)[]>([]); + const [dockerNodes, setDockerNodes] = useState([]); useEffect(() => { const fetchNodes = async () => { @@ -39,6 +40,13 @@ export default function NodesPage() { return () => clearInterval(interval); }, []); + useEffect(() => { + const fetchDocker = async () => { + setDockerNodes(await Promise.all(nodes.map(getDockerNode))); + }; + fetchDocker(); + }, [nodes]); + return (
@@ -54,7 +62,7 @@ export default function NodesPage() {
- {nodes.map((node) => ( + {nodes.map((node, i) => (
@@ -72,16 +80,11 @@ export default function NodesPage() {
- {node.labels && - node.labels.map((label) => ( - - {label} - - ))} + {node.labels.map((label) => ( + + {label} + + ))} @@ -100,15 +103,19 @@ export default function NodesPage() {
OS - {/* {node.os} */} + {node.os}
Docker - {/* {node.docker} */} + + {dockerNodes[i]?.version} +
Containers - {/* {node.containers} */} + + {dockerNodes[i]?.containers.length} +
diff --git a/src/core/client/node.ts b/src/core/client/node.ts index 1add48b..5358031 100644 --- a/src/core/client/node.ts +++ b/src/core/client/node.ts @@ -1,7 +1,7 @@ "use server"; import { read, write } from "@/app/api/file"; -import { Node, NodeLiveData } from "@/lib/types"; +import { Docker, Node, NodeLiveData } from "@/lib/types"; import axios from "axios"; export async function getNodes(): Promise { @@ -17,11 +17,6 @@ export async function getNode(node_id: string): Promise { return nodes.find((v) => v.node_id === node_id); } -export async function getLiveNodes(): Promise<(NodeLiveData & Node)[]> { - const nodes = await read(() => [], "data", "nodes.json"); - return await Promise.all(nodes.map(getLiveNode)); -} - export async function getLiveNode(node: Node): Promise { const data = await ( await axios.get(`http://${node.ip}:3000/api/status`, { @@ -30,3 +25,17 @@ export async function getLiveNode(node: Node): Promise { ).data; return { ...node, liveData: data.liveData }; } + +export async function getLiveNodes(): Promise<(NodeLiveData & Node)[]> { + const nodes = await read(() => [], "data", "nodes.json"); + return await Promise.all(nodes.map(getLiveNode)); +} + +export async function getDockerNode(node: Node): Promise { + const data = await ( + await axios.get(`http://${node.ip}:3000/api/get-docker`, { + headers: { Authorization: `ApiKey ${node.key}` }, + }) + ).data; + return { ...node, containers: data.containers, version: data.version }; +} diff --git a/src/core/docker.ts b/src/core/docker.ts index 2fbb53b..fdb79a2 100644 --- a/src/core/docker.ts +++ b/src/core/docker.ts @@ -6,6 +6,6 @@ const docker = new Docker(); export async function getDocker() { const version = await docker.version(); - console.log("Docker version:", version); - return version; + const containers = await docker.listContainers(); + return { version, containers }; } diff --git a/src/lib/types.ts b/src/lib/types.ts index d136f5f..5a69e60 100644 --- a/src/lib/types.ts +++ b/src/lib/types.ts @@ -1,9 +1,12 @@ +import { ContainerInfo } from "dockerode"; + export interface Node { node_id: string; key: string; ip: string; + os: string; name: string; - labels?: string[]; + labels: string[]; } export interface NodeLiveData { @@ -38,3 +41,8 @@ export interface NodeLiveData { }[]; }; } + +export interface Docker { + version: string; + containers: ContainerInfo[]; +}