diff --git a/server/src/api/validation/monitorValidation.ts b/server/src/api/validation/monitorValidation.ts index 2d3a16c49..09f85401c 100644 --- a/server/src/api/validation/monitorValidation.ts +++ b/server/src/api/validation/monitorValidation.ts @@ -13,7 +13,7 @@ import { ProxyModes, } from "@/domain/monitors/monitor.type.js"; import { DateRanges, SortOrders } from "@/types/query.js"; -import { DockerContainerStates, DockerHealthStatuses, DockerPortProtocols } from "@/types/network.js"; +import { DockerContainerStates, DockerHealthStatuses, DockerPortProtocols } from "@/domain/docker/docker.type.js"; const httpStatusCode = z.number().refine((code) => HttpStatusCodeSet.has(code), { message: "Must be a valid HTTP status code" }); diff --git a/server/src/domain/checks/check.model.ts b/server/src/domain/checks/check.model.ts index cdab5fec7..a4319056e 100644 --- a/server/src/domain/checks/check.model.ts +++ b/server/src/domain/checks/check.model.ts @@ -22,7 +22,7 @@ import { DockerContainerSummary, DockerHealthStatuses, DockerPortProtocols, -} from "@/types/network.js"; +} from "@/domain/docker/docker.type.js"; type CheckMetadataDocument = Omit & { monitorId: Types.ObjectId; diff --git a/server/src/domain/checks/check.snapshot.ts b/server/src/domain/checks/check.snapshot.ts index 7348a2d55..65ef4f60a 100644 --- a/server/src/domain/checks/check.snapshot.ts +++ b/server/src/domain/checks/check.snapshot.ts @@ -11,7 +11,7 @@ import type { SnapshotHostInfo, SnapshotMemoryInfo, } from "@/domain/checks/check.type.js"; -import { DockerContainerSummary } from "@/types/network.js"; +import { DockerContainerSummary } from "@/domain/docker/docker.type.js"; import { toDateString } from "@/utils/mongoMappers.js"; export type CheckSnapshotSource = Pick< diff --git a/server/src/domain/checks/check.type.ts b/server/src/domain/checks/check.type.ts index feeb4439a..afea301be 100644 --- a/server/src/domain/checks/check.type.ts +++ b/server/src/domain/checks/check.type.ts @@ -1,5 +1,5 @@ import type { MonitorType } from "@/domain/monitors/monitor.type.js"; -import { DockerContainerInfo, DockerContainerSummary } from "@/types/network.js"; +import { DockerContainerInfo, DockerContainerSummary } from "@/domain/docker/docker.type.js"; import type { Response } from "got"; export const CHECK_TTL_SENTINEL = 366; diff --git a/server/src/domain/docker/docker.type.ts b/server/src/domain/docker/docker.type.ts new file mode 100644 index 000000000..66504e273 --- /dev/null +++ b/server/src/domain/docker/docker.type.ts @@ -0,0 +1,65 @@ +export const DockerContainerStates = ["created", "running", "paused", "restarting", "removing", "exited", "dead"] as const; +export type DockerContainerState = (typeof DockerContainerStates)[number]; + +export const DockerHealthStatuses = ["healthy", "unhealthy", "starting", "none"] as const; +export type DockerHealthStatus = (typeof DockerHealthStatuses)[number]; + +export const DockerPortProtocols = ["tcp", "udp", "sctp"] as const; +export type DockerPortProtocol = (typeof DockerPortProtocols)[number]; + +export const DockerLogStreams = ["stdout", "stderr"] as const; +export type DockerLogStream = (typeof DockerLogStreams)[number]; + +export const DOCKER_LOG_TAIL_LINES = 200; + +export interface DockerLogLine { + ts: string; + stream: DockerLogStream; + text: string; +} + +export interface DockerContainerLogs { + containerId: string; + containerName: string; + lines: DockerLogLine[]; +} + +export interface DockerContainerPort { + privatePort: number; + protocol: DockerPortProtocol; + publicPort?: number; + hostIp?: string; +} + +export interface DockerContainerMount { + type: string; // open set: bind, volume, tmpfs, image, npipe, cluster, … + name?: string; + source: string; + destination: string; + mode: string; + rw: boolean; +} + +export interface DockerContainerInfo { + id: string; + name: string; + image: string; + state: DockerContainerState; + status: string; + health: DockerHealthStatus; + cpuPct?: number; // fraction of one core (docker stats convention / 100); exceeds 1 when using multiple cores + memoryUsedBytes?: number; + memoryLimitBytes?: number; + memoryPct?: number; // 0-1 fraction of the memory limit + restartCount?: number; + startedAt?: string; // ISO date + ports?: DockerContainerPort[]; + mounts?: DockerContainerMount[]; +} + +export interface DockerContainerSummary { + total: number; + running: number; + stopped: number; + unhealthy: number; +} diff --git a/server/src/service/network/DockerProvider.ts b/server/src/service/network/DockerProvider.ts index 8d515b604..7b6c98e7c 100644 --- a/server/src/service/network/DockerProvider.ts +++ b/server/src/service/network/DockerProvider.ts @@ -1,4 +1,6 @@ import { IStatusProvider } from "@/service/network/IStatusProvider.js"; +import { DockerStatusPayload, MonitorStatusResponse } from "@/types/network.js"; + import { DockerContainerInfo, DockerContainerMount, @@ -10,9 +12,7 @@ import { DockerHealthStatuses, DockerPortProtocol, DockerPortProtocols, - DockerStatusPayload, - MonitorStatusResponse, -} from "@/types/network.js"; +} from "@/domain/docker/docker.type.js"; import { Monitor, MonitorType } from "@/domain/monitors/monitor.type.js"; import { ILogger } from "@/utils/logger.js"; import { AppError } from "@/utils/AppError.js"; diff --git a/server/src/types/network.ts b/server/src/types/network.ts index 49df868d2..bbbd41403 100644 --- a/server/src/types/network.ts +++ b/server/src/types/network.ts @@ -9,6 +9,7 @@ import type { GotTimings, ILighthouseAudit, } from "@/domain/checks/check.type.js"; +import { DockerContainerInfo, DockerContainerLogs, DockerContainerSummary } from "@/domain/docker/docker.type.js"; import type { DnsRecordType, Monitor, MonitorMatchMethod, MonitorStatus, MonitorType } from "@/domain/monitors/monitor.type.js"; import type { QueryResult } from "gamedig"; @@ -97,68 +98,6 @@ export interface HardwareStatusPayload { } // Docker host monitoring -export const DockerContainerStates = ["created", "running", "paused", "restarting", "removing", "exited", "dead"] as const; -export type DockerContainerState = (typeof DockerContainerStates)[number]; - -export const DockerHealthStatuses = ["healthy", "unhealthy", "starting", "none"] as const; -export type DockerHealthStatus = (typeof DockerHealthStatuses)[number]; - -export const DockerLogStreams = ["stdout", "stderr"] as const; -export type DockerLogStream = (typeof DockerLogStreams)[number]; -export interface DockerLogLine { - ts: string; - stream: DockerLogStream; - text: string; -} - -export interface DockerContainerLogs { - containerId: string; - containerName: string; - lines: DockerLogLine[]; -} - -export interface DockerContainerSummary { - total: number; - running: number; - stopped: number; - unhealthy: number; -} - -export interface DockerContainerInfo { - id: string; - name: string; - image: string; - state: DockerContainerState; - status: string; - health: DockerHealthStatus; - cpuPct?: number; // fraction of one core (docker stats convention / 100); exceeds 1 when using multiple cores - memoryUsedBytes?: number; - memoryLimitBytes?: number; - memoryPct?: number; // 0-1 fraction of the memory limit - restartCount?: number; - startedAt?: string; // ISO date - ports?: DockerContainerPort[]; - mounts?: DockerContainerMount[]; -} - -export const DockerPortProtocols = ["tcp", "udp", "sctp"] as const; -export type DockerPortProtocol = (typeof DockerPortProtocols)[number]; - -export interface DockerContainerPort { - privatePort: number; - protocol: DockerPortProtocol; - publicPort?: number; - hostIp?: string; -} - -export interface DockerContainerMount { - type: string; // open set: bind, volume, tmpfs, image, npipe, cluster, … - name?: string; - source: string; - destination: string; - mode: string; - rw: boolean; -} export interface DockerStatusPayload { containers: DockerContainerInfo[];