diff --git a/apps/dokploy/server/utils/docker.ts b/apps/dokploy/server/utils/docker.ts new file mode 100644 index 00000000..7577c844 --- /dev/null +++ b/apps/dokploy/server/utils/docker.ts @@ -0,0 +1,40 @@ +import { execAsync } from "@dokploy/server"; + +/** Returns if the current operating system is Windows Subsystem for Linux (WSL). */ +export const isWSL = async () => { + try { + const { stdout } = await execAsync("uname -r"); + const isWSL = stdout.includes("microsoft"); + return isWSL; + } catch (error) { + return false; + } +}; + +/** Returns the Docker host IP address. */ +export const getDockerHost = async (): Promise => { + if (process.env.NODE_ENV === "production") { + if (process.platform === "linux" && !isWSL()) { + try { + // Try to get the Docker bridge IP first + const { stdout } = await execAsync( + "ip route | awk '/default/ {print $3}'", + ); + + const hostIp = stdout.trim(); + if (!hostIp) { + throw new Error("Failed to get Docker host IP"); + } + + return hostIp; + } catch (error) { + console.error("Failed to get Docker host IP:", error); + return "172.17.0.1"; // Default Docker bridge network IP + } + } + + return "host.docker.internal"; + } + + return "localhost"; +};