diff --git a/apps/dokploy/components/dashboard/swarm/monitoring-card.tsx b/apps/dokploy/components/dashboard/swarm/monitoring-card.tsx
new file mode 100644
index 00000000..88c96c24
--- /dev/null
+++ b/apps/dokploy/components/dashboard/swarm/monitoring-card.tsx
@@ -0,0 +1,198 @@
+import { Badge } from "@/components/ui/badge";
+import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
+import {
+ Tooltip,
+ TooltipContent,
+ TooltipProvider,
+ TooltipTrigger,
+} from "@/components/ui/tooltip";
+import { api } from "@/utils/api";
+import {
+ Activity,
+ AlertCircle,
+ CheckCircle,
+ HelpCircle,
+ Loader2,
+ Server,
+} from "lucide-react";
+import { NodeCard } from "./show/deatils-card";
+
+export interface SwarmList {
+ ID: string;
+ Hostname: string;
+ Availability: string;
+ EngineVersion: string;
+ Status: string;
+ ManagerStatus: string;
+ TLSStatus: string;
+}
+
+interface SwarmMonitorCardProps {
+ nodes: SwarmList[];
+}
+
+export default function SwarmMonitorCard() {
+ const { data: nodes, isLoading } = api.swarm.getNodes.useQuery();
+
+ if (isLoading) {
+ return (
+
+
+
+
+
+ Docker Swarm Monitor
+
+
+
+
+
+
+
+
+
+ );
+ }
+
+ if (!nodes) {
+ return (
+
+
+
+
+ Docker Swarm Monitor
+
+
+
+
+ Failed to load data
+
+
+
+ );
+ }
+
+ console.log(nodes);
+ const totalNodes = nodes.length;
+ const activeNodesCount = nodes.filter(
+ (node) => node.Status === "Ready",
+ ).length;
+ const managerNodesCount = nodes.filter(
+ (node) =>
+ node.ManagerStatus === "Leader" || node.ManagerStatus === "Reachable",
+ ).length;
+
+ const activeNodes = nodes.filter((node) => node.Status === "Ready");
+ const managerNodes = nodes.filter(
+ (node) =>
+ node.ManagerStatus === "Leader" || node.ManagerStatus === "Reachable",
+ );
+
+ const getStatusIcon = (status: string) => {
+ switch (status) {
+ case "Ready":
+ return ;
+ case "Down":
+ return ;
+ default:
+ return ;
+ }
+ };
+
+ return (
+
+
+
+
+
+ Docker Swarm Monitor
+
+
+
+
+
+ Total Nodes:
+ {totalNodes}
+
+
+
Active Nodes:
+
+
+
+
+ {activeNodesCount} / {totalNodes}
+
+
+
+ {activeNodes.map((node) => (
+
+ {getStatusIcon(node.Status)}
+ {node.Hostname}
+
+ ))}
+
+
+
+ {/*
+ {activeNodesCount} / {totalNodes}
+ */}
+
+
+
Manager Nodes:
+
+
+
+
+ {managerNodesCount} / {totalNodes}
+
+
+
+ {managerNodes.map((node) => (
+
+ {getStatusIcon(node.Status)}
+ {node.Hostname}
+
+ ))}
+
+
+
+ {/*
+ {managerNodes} / {totalNodes}
+ */}
+
+
+
Node Status:
+
+ {nodes.map((node) => (
+ -
+
+ {getStatusIcon(node.Status)}
+ {node.Hostname}
+
+
+ {node.ManagerStatus || "Worker"}
+
+
+ ))}
+
+
+
+
+
+
+ {nodes.map((node) => (
+
+ ))}
+
+
+ );
+}