From c2fe1eed0135e3c31da929c39afde938023c298f Mon Sep 17 00:00:00 2001 From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com> Date: Sun, 15 Dec 2024 19:18:41 -0600 Subject: [PATCH] fix: remote server search add long buffering --- .../dashboard/docker/logs/docker-logs-id.tsx | 19 ++++++++++++------- .../server/wss/docker-container-logs.ts | 15 +++++++++++++-- 2 files changed, 25 insertions(+), 9 deletions(-) diff --git a/apps/dokploy/components/dashboard/docker/logs/docker-logs-id.tsx b/apps/dokploy/components/dashboard/docker/logs/docker-logs-id.tsx index 60f567d7..d05b481e 100644 --- a/apps/dokploy/components/dashboard/docker/logs/docker-logs-id.tsx +++ b/apps/dokploy/components/dashboard/docker/logs/docker-logs-id.tsx @@ -59,8 +59,6 @@ export const DockerLogsId: React.FC = ({ containerId, serverId }) => { }; const handleSearch = (e: React.ChangeEvent) => { - setRawLogs(""); - setFilteredLogs([]); setSearch(e.target.value || ""); }; @@ -81,13 +79,12 @@ export const DockerLogsId: React.FC = ({ containerId, serverId }) => { }; useEffect(() => { + if (!containerId) return; + + let isCurrentConnection = true; + setIsLoading(true); setRawLogs(""); setFilteredLogs([]); - }, [containerId]); - - useEffect(() => { - if (!containerId) return; - setIsLoading(true); const protocol = window.location.protocol === "https:" ? "wss:" : "ws:"; const params = new globalThis.URLSearchParams({ @@ -108,25 +105,33 @@ export const DockerLogsId: React.FC = ({ containerId, serverId }) => { const ws = new WebSocket(wsUrl); ws.onopen = () => { + if (!isCurrentConnection) { + ws.close(); + return; + } console.log("WebSocket connected"); }; ws.onmessage = (e) => { + if (!isCurrentConnection) return; setRawLogs((prev) => prev + e.data); setIsLoading(false); }; ws.onerror = (error) => { + if (!isCurrentConnection) return; console.error("WebSocket error:", error); setIsLoading(false); }; ws.onclose = (e) => { + if (!isCurrentConnection) return; console.log("WebSocket closed:", e.reason); setIsLoading(false); }; return () => { + isCurrentConnection = false; if (ws.readyState === WebSocket.OPEN) { ws.close(); } diff --git a/apps/dokploy/server/wss/docker-container-logs.ts b/apps/dokploy/server/wss/docker-container-logs.ts index 1b28c11b..3df09ce0 100644 --- a/apps/dokploy/server/wss/docker-container-logs.ts +++ b/apps/dokploy/server/wss/docker-container-logs.ts @@ -56,9 +56,11 @@ export const setupDockerContainerLogsWebSocketServer = ( const baseCommand = `docker container logs --timestamps --tail ${tail} ${ since === "all" ? "" : `--since ${since}` } --follow ${containerId}`; + const escapedSearch = search ? search.replace(/'/g, "'\\''") : ""; const command = search - ? `${baseCommand} 2>&1 | grep -iF '${search}'` + ? `${baseCommand} 2>&1 | grep --line-buffered -iF "${escapedSearch}"` : baseCommand; + console.log("Executing SSH command:", command); client.exec(command, (err, stream) => { if (err) { console.error("Execution error:", err); @@ -66,15 +68,24 @@ export const setupDockerContainerLogsWebSocketServer = ( client.end(); return; } + + let dataReceived = false; + stream .on("close", () => { + console.log("Stream closed, dataReceived:", dataReceived); + if (!dataReceived) { + ws.send("No matching logs found"); + } client.end(); ws.close(); }) .on("data", (data: string) => { + dataReceived = true; ws.send(data.toString()); }) .stderr.on("data", (data) => { + console.error("Stream stderr:", data.toString()); ws.send(data.toString()); }); }); @@ -100,7 +111,7 @@ export const setupDockerContainerLogsWebSocketServer = ( since === "all" ? "" : `--since ${since}` } --follow ${containerId}`; const command = search - ? `${baseCommand} 2>&1 | grep -iF '${search}'` + ? `${baseCommand} 2>&1 | grep --line-buffered -iF '${search}'` : baseCommand; const ptyProcess = spawn(shell, ["-c", command], { name: "xterm-256color",