fix(compose): regenerate mapping domain labels

This commit is contained in:
Vyacheslav Scherbinin 2026-08-11 12:29:49 +07:00
parent 92b628c8fc
commit 5ceb88bebe
2 changed files with 73 additions and 22 deletions

View File

@ -237,6 +237,59 @@ describe("addDomainToCompose enabled filtering", () => {
},
);
it.each([
[
"docker-compose",
`services:
frigate:
image: frigate
labels:
traefik.enable: "true"
traefik.http.routers.test-app-1-web.rule: Host(\`old.example.com\`)
traefik.http.services.test-app-1-web.loadbalancer.server.port: 8971
custom.label: preserved
`,
"traefik.docker.network",
],
[
"stack",
`services:
frigate:
image: frigate
deploy:
labels:
traefik.enable: "true"
traefik.http.routers.test-app-1-web.rule: Host(\`old.example.com\`)
traefik.http.services.test-app-1-web.loadbalancer.server.port: 8971
custom.label: preserved
`,
"traefik.swarm.network",
],
] as const)(
"regenerates routing in mapping labels for an enabled domain in %s",
async (composeType, mappingComposeYaml, networkLabel) => {
composeYaml = mappingComposeYaml;
const result = await addDomainToCompose({ ...baseCompose, composeType }, [
{ ...baseDomain, enabled: true },
]);
const service = result?.services?.frigate;
const labels =
composeType === "docker-compose"
? service?.labels
: service?.deploy?.labels;
expect(labels).toMatchObject({
"custom.label": "preserved",
"traefik.enable": "true",
[networkLabel]: "dokploy-network",
"traefik.http.routers.test-app-1-web.rule":
"Host(`frigate.example.com`)",
"traefik.http.services.test-app-1-web.loadbalancer.server.port": "8971",
});
},
);
it("emits labels only for the enabled domain when both are present", async () => {
const result = await addDomainToCompose(baseCompose, [
{ ...baseDomain, host: "enabled.example.com", enabled: true },

View File

@ -282,33 +282,31 @@ export const addDomainToCompose = async (
labels = result.services[serviceName].deploy.labels;
}
const networkLabel =
compose.composeType === "docker-compose"
? "traefik.docker.network"
: "traefik.swarm.network";
const networkName = compose.isolatedDeployment
? compose.suffix || compose.appName
: "dokploy-network";
if (Array.isArray(labels)) {
if (!labels.includes("traefik.enable=true")) {
labels.unshift("traefik.enable=true");
}
labels.unshift(...httpLabels);
if (!compose.isolatedDeployment) {
if (compose.composeType === "docker-compose") {
if (!labels.includes("traefik.docker.network=dokploy-network")) {
labels.unshift("traefik.docker.network=dokploy-network");
}
} else {
// Stack Case
if (!labels.includes("traefik.swarm.network=dokploy-network")) {
labels.unshift("traefik.swarm.network=dokploy-network");
}
}
} else {
const isolatedNetwork = compose.suffix || compose.appName;
if (compose.composeType === "docker-compose") {
if (!labels.includes(`traefik.docker.network=${isolatedNetwork}`)) {
labels.unshift(`traefik.docker.network=${isolatedNetwork}`);
}
} else {
if (!labels.includes(`traefik.swarm.network=${isolatedNetwork}`)) {
labels.unshift(`traefik.swarm.network=${isolatedNetwork}`);
}
}
const networkLabelEntry = `${networkLabel}=${networkName}`;
if (!labels.includes(networkLabelEntry)) {
labels.unshift(networkLabelEntry);
}
} else if (labels) {
labels["traefik.enable"] = "true";
labels[networkLabel] = networkName;
for (const label of httpLabels) {
const separatorIndex = label.indexOf("=");
labels[label.slice(0, separatorIndex)] = label.slice(
separatorIndex + 1,
);
}
}