diff --git a/Dockerfile b/Dockerfile
index 3e6de756..a4c9a6cf 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -14,7 +14,7 @@ RUN apk add --no-cache libc6-compat \
RUN --mount=type=cache,id=pnpm-store,target=/root/.local/share/pnpm/store pnpm fetch | grep -v "cross-device link not permitted\|Falling back to copying packages from store"
-RUN --mount=type=cache,id=pnpm-store,target=/root/.local/share/pnpm/store pnpm install -r --offline
+RUN --mount=type=cache,id=pnpm-store,target=/root/.local/share/pnpm/store pnpm install -r
# Rebuild the source code only when needed
FROM docker.io/node:18-alpine AS builder
diff --git a/package.json b/package.json
index 3d2e6100..13bbf204 100644
--- a/package.json
+++ b/package.json
@@ -37,6 +37,7 @@
"rrule": "^2.8.1",
"swr": "^1.3.0",
"systeminformation": "^5.23.2",
+ "tcp-ping": "^0.1.1",
"tough-cookie": "^4.1.3",
"urbackup-server-api": "^0.52.0",
"winston": "^3.11.0",
diff --git a/public/locales/en/common.json b/public/locales/en/common.json
index e54a0a77..f3f5bc9d 100644
--- a/public/locales/en/common.json
+++ b/public/locales/en/common.json
@@ -97,6 +97,15 @@
"up": "Up",
"not_available": "Not Available"
},
+ "tcpHandshake": {
+ "tcp_status": "TCP-Handshake status",
+ "error": "Error",
+ "response": "Response",
+ "down": "Down",
+ "up": "Up",
+ "not_available": "Not Available"
+ },
+
"emby": {
"playing": "Playing",
"transcoding": "Transcoding",
diff --git a/src/components/services/item.jsx b/src/components/services/item.jsx
index a38dfaa3..bbf5721a 100644
--- a/src/components/services/item.jsx
+++ b/src/components/services/item.jsx
@@ -5,6 +5,7 @@ import Status from "./status";
import Widget from "./widget";
import Ping from "./ping";
import SiteMonitor from "./site-monitor";
+import TcpHandshake from "./tcp-handshake";
import KubernetesStatus from "./kubernetes-status";
import Docker from "widgets/docker/component";
@@ -101,6 +102,14 @@ export default function Item({ service, group, useEqualHeights }) {
Site monitor status
)}
+
+ {service.tcpHandshake && (
+
+
+ TCP-Handshake status
+
+ )}
+
{service.container && (