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 e9459849..7c0edf05 100644 --- a/apps/dokploy/components/dashboard/docker/logs/docker-logs-id.tsx +++ b/apps/dokploy/components/dashboard/docker/logs/docker-logs-id.tsx @@ -76,11 +76,18 @@ export const DockerLogsId: React.FC = ({ containerId, serverId }) => { if (!containerId) return; const protocol = window.location.protocol === "https:" ? "wss:" : "ws:"; - const wsUrl = `${protocol}//${ - window.location.host - }/docker-container-logs?containerId=${containerId}&tail=${lines}&since=${since}&search=${search}${ - serverId ? `&serverId=${serverId}` : "" - }`; + const params = new globalThis.URLSearchParams({ + containerId, + tail: lines.toString(), + since, + search + }); + + if (serverId) { + params.append('serverId', serverId); + } + + const wsUrl = `${protocol}//${window.location.host}/docker-container-logs?${params.toString()}`; console.log("Connecting to WebSocket:", wsUrl); const ws = new WebSocket(wsUrl); @@ -101,8 +108,7 @@ export const DockerLogsId: React.FC = ({ containerId, serverId }) => { console.log("WebSocket closed:", e.reason); setRawLogs( (prev) => - prev + - `Connection closed!\nReason: ${ + `${prev}Connection closed!\nReason: ${ e.reason || "WebSocket was closed try to refresh" }\n` ); @@ -177,7 +183,7 @@ export const DockerLogsId: React.FC = ({ containerId, serverId }) => { className="inline-flex h-9 text-sm text-white placeholder-gray-400 w-full sm:w-auto" /> { if (!term) return text; - const parts = text.split(new RegExp(`(${term})`, "gi")); + const parts = text.split(new RegExp(`(${escapeRegExp(term)})`, "gi")); return parts.map((part, index) => part.toLowerCase() === term.toLowerCase() ? ( diff --git a/apps/dokploy/server/wss/docker-container-logs.ts b/apps/dokploy/server/wss/docker-container-logs.ts index 882b2b4e..1b28c11b 100644 --- a/apps/dokploy/server/wss/docker-container-logs.ts +++ b/apps/dokploy/server/wss/docker-container-logs.ts @@ -32,7 +32,7 @@ export const setupDockerContainerLogsWebSocketServer = ( const containerId = url.searchParams.get("containerId"); const tail = url.searchParams.get("tail"); const search = url.searchParams.get("search"); - const since = url.searchParams.get("since") + const since = url.searchParams.get("since"); const serverId = url.searchParams.get("serverId"); const { user, session } = await validateWebSocketRequest(req); @@ -53,9 +53,12 @@ export const setupDockerContainerLogsWebSocketServer = ( const client = new Client(); client .once("ready", () => { - const command = ` - bash -c "docker container logs --timestamps --tail ${tail} ${since === "all" ? "" : `--since ${since}`} --follow ${containerId} | grep -i '${search}'" - `; + const baseCommand = `docker container logs --timestamps --tail ${tail} ${ + since === "all" ? "" : `--since ${since}` + } --follow ${containerId}`; + const command = search + ? `${baseCommand} 2>&1 | grep -iF '${search}'` + : baseCommand; client.exec(command, (err, stream) => { if (err) { console.error("Execution error:", err); @@ -93,21 +96,20 @@ export const setupDockerContainerLogsWebSocketServer = ( }); } else { const shell = getShell(); - const ptyProcess = spawn( - shell, - [ - "-c", - `docker container logs --timestamps --tail ${tail} ${since === "all" ? "" : `--since ${since}`} --follow ${containerId} | grep -i '${search}'`, - ], - { - name: "xterm-256color", - cwd: process.env.HOME, - env: process.env, - encoding: "utf8", - cols: 80, - rows: 30, - }, - ); + const baseCommand = `docker container logs --timestamps --tail ${tail} ${ + since === "all" ? "" : `--since ${since}` + } --follow ${containerId}`; + const command = search + ? `${baseCommand} 2>&1 | grep -iF '${search}'` + : baseCommand; + const ptyProcess = spawn(shell, ["-c", command], { + name: "xterm-256color", + cwd: process.env.HOME, + env: process.env, + encoding: "utf8", + cols: 80, + rows: 30, + }); ptyProcess.onData((data) => { ws.send(data); diff --git a/packages/server/src/wss/docker-container-logs.ts b/packages/server/src/wss/docker-container-logs.ts index ab3234b7..7cfdb8d6 100644 --- a/packages/server/src/wss/docker-container-logs.ts +++ b/packages/server/src/wss/docker-container-logs.ts @@ -55,9 +55,12 @@ export const setupDockerContainerLogsWebSocketServer = ( new Promise((resolve, reject) => { client .once("ready", () => { - const command = ` - bash -c "docker container logs --timestamps --tail ${tail} ${since === "all" ? "" : `--since ${since}`} --follow ${containerId} | grep -i '${search}'" - `; + const baseCommand = `docker container logs --timestamps --tail ${tail} ${ + since === "all" ? "" : `--since ${since}` + } --follow ${containerId}`; + const command = search + ? `${baseCommand} 2>&1 | grep -iF '${search}'` + : baseCommand; client.exec(command, (err, stream) => { if (err) { console.error("Execution error:", err); @@ -87,21 +90,20 @@ export const setupDockerContainerLogsWebSocketServer = ( }); } else { const shell = getShell(); - const ptyProcess = spawn( - shell, - [ - "-c", - `docker container logs --timestamps --tail ${tail} ${since === "all" ? "" : `--since ${since}`} --follow ${containerId} | grep -i '${search}'`, - ], - { - name: "xterm-256color", - cwd: process.env.HOME, - env: process.env, - encoding: "utf8", - cols: 80, - rows: 30, - }, - ); + const baseCommand = `docker container logs --timestamps --tail ${tail} ${ + since === "all" ? "" : `--since ${since}` + } --follow ${containerId}`; + const command = search + ? `${baseCommand} 2>&1 | grep -iF '${search}'` + : baseCommand; + const ptyProcess = spawn(shell, ["-c", command], { + name: "xterm-256color", + cwd: process.env.HOME, + env: process.env, + encoding: "utf8", + cols: 80, + rows: 30, + }); ptyProcess.onData((data) => { ws.send(data);