fix(compose): add migration for serviceScales and strengthen command escaping (#2579)

This commit is contained in:
mini0n-ai 2026-09-11 18:45:46 +03:00
parent 193e8e2682
commit 30368d5297
6 changed files with 9204 additions and 5 deletions

View File

@ -0,0 +1 @@
ALTER TABLE "compose" ADD COLUMN "serviceScales" jsonb DEFAULT '[]'::jsonb;

File diff suppressed because it is too large Load Diff

View File

@ -1380,6 +1380,13 @@
"when": 1788995453103,
"tag": "0196_worthless_ravenous",
"breakpoints": true
},
{
"idx": 197,
"version": "7",
"when": 1789141420032,
"tag": "0197_breezy_mentallo",
"breakpoints": true
}
]
}

View File

@ -219,7 +219,10 @@ const createSchema = createInsertSchema(compose, {
serviceScales: z
.array(
z.object({
serviceName: z.string(),
serviceName: z
.string()
.min(1)
.regex(/^[a-zA-Z0-9._-]+$/, "Invalid service name"),
replicas: z.number().int().min(0),
}),
)
@ -304,7 +307,10 @@ export const apiRandomizeCompose = createSchema
export const apiScaleComposeService = z.object({
composeId: z.string().min(1),
serviceName: z.string().min(1),
serviceName: z
.string()
.min(1)
.regex(/^[a-zA-Z0-9._-]+$/, "Invalid service name"),
replicas: z.number().int().min(0),
});

View File

@ -1,4 +1,4 @@
import { join } from "node:path";
import { dirname, join } from "node:path";
import { paths } from "@dokploy/server/constants";
import { db } from "@dokploy/server/db";
import {
@ -603,7 +603,15 @@ export const scaleComposeService = async (
if (compose.composeType === "docker-compose") {
const { COMPOSE_PATH } = paths(!!compose.serverId);
const projectPath = join(COMPOSE_PATH, compose.appName, "code");
const scaleCommand = `cd ${quote([projectPath])} && env -i PATH="$PATH" HOME="$HOME" docker compose -p ${quote([compose.appName])} up -d --no-build --scale ${quote([`${serviceName}=${replicas}`])} ${quote([serviceName])}`;
const path =
compose.sourceType === "raw"
? "docker-compose.yml"
: compose.composePath || "docker-compose.yml";
const projectDirectoryFlag = `--project-directory ${quote([projectPath])} `;
const envFileFlag = compose.createEnvFile
? `--env-file ${quote([join(dirname(compose.composePath || "docker-compose.yml"), ".env")])} `
: "";
const scaleCommand = `cd ${quote([projectPath])} && env -i PATH="$PATH" HOME="$HOME" docker compose -p ${quote([compose.appName])} ${projectDirectoryFlag}${envFileFlag}-f ${quote([path])} up -d --no-build --scale ${quote([`${serviceName}=${replicas}`])} ${quote([serviceName])}`;
if (compose.serverId) {
await execAsyncRemote(compose.serverId, scaleCommand);
} else {

View File

@ -72,7 +72,7 @@ Compose Type: ${composeType} ✅`;
.sort((a, b) => a.serviceName.localeCompare(b.serviceName))
.map(
(s) =>
`docker service scale ${compose.appName}_${s.serviceName}=${s.replicas} >/dev/null 2>&1 || true;`,
`docker service scale ${compose.appName}_${s.serviceName}=${s.replicas};`,
)
.join("\n\t\t")
: ""