diff --git a/apps/dokploy/__test__/compose/network/network-root.test.ts b/apps/dokploy/__test__/compose/network/network-root.test.ts index b4a0929c..297f358f 100644 --- a/apps/dokploy/__test__/compose/network/network-root.test.ts +++ b/apps/dokploy/__test__/compose/network/network-root.test.ts @@ -279,3 +279,55 @@ test("Add prefix to networks with static prefix", () => { ) as ComposeSpecification; expect(networks).toStrictEqual(expectedComposeData.networks); }); + +const composeFile7 = ` +version: "3.8" + +services: + web: + image: nginx:latest + networks: + - dokploy-network + +networks: + dokploy-network: +`; + +const expectedComposeFile7 = ` +version: "3.8" + +services: + web: + image: nginx:latest + networks: + - dokploy-network + +networks: + dokploy-network: + driver: bridge + driver_opts: + com.docker.network.driver.mtu: 1200 + + backend: + driver: bridge + attachable: true + + external_network: + external: true + name: dokploy-network +`; +test("It shoudn't add prefix to dokploy-network", () => { + const composeData = load(composeFile7) as ComposeSpecification; + + const prefix = generateRandomHash(); + + if (!composeData?.networks) { + return; + } + const networks = addPrefixToNetworksRoot(composeData.networks, prefix); + + expect(networks).toBeDefined(); + for (const networkKey of Object.keys(networks)) { + expect(networkKey).toContain("dokploy-network"); + } +}); diff --git a/apps/dokploy/__test__/compose/network/network-service.test.ts b/apps/dokploy/__test__/compose/network/network-service.test.ts index d592811b..6f96c11d 100644 --- a/apps/dokploy/__test__/compose/network/network-service.test.ts +++ b/apps/dokploy/__test__/compose/network/network-service.test.ts @@ -182,3 +182,92 @@ test("Add prefix to networks in services (combined case)", () => { expect(redisNetworks).toHaveProperty(`backend-${prefix}`); expect(redisNetworks).not.toHaveProperty("backend"); }); + +const composeFile7 = ` +version: "3.8" + +services: + web: + image: nginx:latest + networks: + - dokploy-network +`; + +test("It shoudn't add prefix to dokploy-network in services", () => { + const composeData = load(composeFile7) as ComposeSpecification; + + const prefix = generateRandomHash(); + + if (!composeData?.services) { + return; + } + const networks = addPrefixToServiceNetworks(composeData.services, prefix); + const service = networks.web; + + expect(service).toBeDefined(); + expect(service?.networks).toContain("dokploy-network"); +}); + +const composeFile8 = ` +version: "3.8" + +services: + web: + image: nginx:latest + networks: + - frontend + - backend + - dokploy-network + + + api: + image: myapi:latest + networks: + frontend: + aliases: + - api + dokploy-network: + aliases: + - api + redis: + image: redis:alpine + networks: + dokploy-network: + db: + image: myapi:latest + networks: + dokploy-network: + aliases: + - apid + +`; + +test("It shoudn't add prefix to dokploy-network in services multiples cases", () => { + const composeData = load(composeFile8) as ComposeSpecification; + + const prefix = generateRandomHash(); + + if (!composeData?.services) { + return; + } + const networks = addPrefixToServiceNetworks(composeData.services, prefix); + const service = networks.web; + const api = networks.api; + const redis = networks.redis; + const db = networks.db; + + const dbNetworks = db?.networks as { + [key: string]: unknown; + }; + + const apiNetworks = api?.networks as { + [key: string]: unknown; + }; + + expect(service).toBeDefined(); + expect(service?.networks).toContain("dokploy-network"); + + expect(redis?.networks).toHaveProperty("dokploy-network"); + expect(dbNetworks["dokploy-network"]).toBeDefined(); + expect(apiNetworks["dokploy-network"]).toBeDefined(); +}); diff --git a/apps/dokploy/__test__/compose/network/network.test.ts b/apps/dokploy/__test__/compose/network/network.test.ts index f86cabfd..354fd650 100644 --- a/apps/dokploy/__test__/compose/network/network.test.ts +++ b/apps/dokploy/__test__/compose/network/network.test.ts @@ -254,3 +254,82 @@ test("Add prefix to networks in compose file with multiple services and complex expect(updatedComposeData).toEqual(expectedComposeFile3); }); + +const composeFile4 = ` +version: "3.8" + +services: + app: + image: myapp:latest + networks: + frontend: + aliases: + - app + backend: + dokploy-network: + + worker: + image: worker:latest + networks: + - backend + - dokploy-network + +networks: + frontend: + driver: bridge + attachable: true + + backend: + driver: bridge + driver_opts: + com.docker.network.bridge.enable_icc: "true" + + dokploy-network: + driver: bridge + +`; + +const expectedComposeFile4 = load(` +version: "3.8" + +services: + app: + image: myapp:latest + networks: + frontend-testhash: + aliases: + - app + backend-testhash: + dokploy-network: + + worker: + image: worker:latest + networks: + - backend-testhash + - dokploy-network + +networks: + frontend-testhash: + driver: bridge + attachable: true + + backend-testhash: + driver: bridge + driver_opts: + com.docker.network.bridge.enable_icc: "true" + + dokploy-network: + driver: bridge + + + +`); + +test("Expect don't add prefix to dokploy-network in compose file with multiple services and complex network configurations", () => { + const composeData = load(composeFile4) as ComposeSpecification; + + const prefix = "testhash"; + const updatedComposeData = addPrefixToAllNetworks(composeData, prefix); + console.log(updatedComposeData); + expect(updatedComposeData).toEqual(expectedComposeFile4); +}); diff --git a/apps/dokploy/server/utils/docker/compose/network.ts b/apps/dokploy/server/utils/docker/compose/network.ts index 39e9564f..c52f1368 100644 --- a/apps/dokploy/server/utils/docker/compose/network.ts +++ b/apps/dokploy/server/utils/docker/compose/network.ts @@ -9,7 +9,12 @@ export const addPrefixToNetworksRoot = ( networks: { [key: string]: DefinitionsNetwork }, prefix: string, ): { [key: string]: DefinitionsNetwork } => { - return _.mapKeys(networks, (_value, key) => `${key}-${prefix}`); + return _.mapKeys(networks, (_value, key) => { + if (key === "dokploy-network") { + return "dokploy-network"; + } + return `${key}-${prefix}`; + }); }; export const addPrefixToServiceNetworks = ( @@ -20,15 +25,20 @@ export const addPrefixToServiceNetworks = ( if (service.networks) { // 1 Case the most common if (Array.isArray(service.networks)) { - service.networks = service.networks.map( - (network: string) => `${network}-${prefix}`, - ); + service.networks = service.networks.map((network: string) => { + if (network === "dokploy-network") { + return "dokploy-network"; + } + return `${network}-${prefix}`; + }); } else { // 2 Case - service.networks = _.mapKeys( - service.networks, - (_value, key) => `${key}-${prefix}`, - ); + service.networks = _.mapKeys(service.networks, (_value, key) => { + if (key === "dokploy-network") { + return "dokploy-network"; + } + return `${key}-${prefix}`; + }); // 3 Case service.networks = _.mapValues(service.networks, (value) => { @@ -40,6 +50,7 @@ export const addPrefixToServiceNetworks = ( return `${innerKey}-${prefix}`; }); } + return value; }); }