Compare commits

...

9 Commits

Author SHA1 Message Date
Mauricio Siu
d9398b9558 feat(workers): add third worker and increase concurrency for existing workers 2025-09-15 23:43:27 -06:00
Mauricio Siu
788dbe4050 chore(package): bump version from v0.25.1 to v0.25.2 2025-09-15 23:23:03 -06:00
Mauricio Siu
6934f44778 Merge pull request #2573 from Harikrishnan1367709/Duplicating-a-service-does-not-refresh-the-list-afterwards-#2565-Harikrishnan
feat: Auto-refresh services list when duplicating to same environment
2025-09-15 23:18:40 -06:00
Mauricio Siu
457a6db00f Merge pull request #2562 from sundakai/canary
fix:traefik 3.5.0 error
2025-09-15 22:59:11 -06:00
Mauricio Siu
81f89a0796 Merge pull request #2597 from demondayza/canary
fix: fix typo for Github clone
2025-09-15 22:27:00 -06:00
Andrew Margetts
d8a98f3936 fix: fix typo for Github clone 2025-09-12 15:27:10 +02:00
autofix-ci[bot]
ec11325165 [autofix.ci] apply automated fixes 2025-09-09 16:40:00 +00:00
HarikrishnanD
abcbd2d599 feat: auto-refresh services list when duplicating to same environment - Add cache invalidation for environment.one and environment.byProjectId queries - Fix issue where duplicated services weren't visible until hard refresh - Ensure proper invalidation when duplicating to current environment - Resolves #2565 2025-09-09 22:07:40 +05:30
永恒
1664ae9b92 fix traefik 3.5.0 error
fix traefik error:"both Docker and Swarm labels are defined"
2025-09-08 12:26:36 +08:00
6 changed files with 52 additions and 12 deletions

View File

@@ -80,6 +80,29 @@ export const DuplicateProject = ({
api.project.duplicate.useMutation({ api.project.duplicate.useMutation({
onSuccess: async (newProject) => { onSuccess: async (newProject) => {
await utils.project.all.invalidate(); await utils.project.all.invalidate();
// If duplicating to same project+environment, invalidate the environment query
// to refresh the services list
if (duplicateType === "existing-environment") {
await utils.environment.one.invalidate({
environmentId: selectedTargetEnvironment,
});
await utils.environment.byProjectId.invalidate({
projectId: selectedTargetProject,
});
// If duplicating to the same environment we're currently viewing,
// also invalidate the current environment to refresh the services list
if (selectedTargetEnvironment === environmentId) {
await utils.environment.one.invalidate({ environmentId });
// Also invalidate the project query to refresh the project data
const projectId = router.query.projectId as string;
if (projectId) {
await utils.project.one.invalidate({ projectId });
}
}
}
toast.success( toast.success(
duplicateType === "new-project" duplicateType === "new-project"
? "Project duplicated successfully" ? "Project duplicated successfully"

View File

@@ -1,6 +1,6 @@
{ {
"name": "dokploy", "name": "dokploy",
"version": "v0.25.1", "version": "v0.25.2",
"private": true, "private": true,
"license": "Apache-2.0", "license": "Apache-2.0",
"type": "module", "type": "module",

View File

@@ -11,7 +11,7 @@ import {
} from "./queue.js"; } from "./queue.js";
import { jobQueueSchema } from "./schema.js"; import { jobQueueSchema } from "./schema.js";
import { initializeJobs } from "./utils.js"; import { initializeJobs } from "./utils.js";
import { firstWorker, secondWorker } from "./workers.js"; import { firstWorker, secondWorker, thirdWorker } from "./workers.js";
const app = new Hono(); const app = new Hono();
@@ -91,6 +91,7 @@ export const gracefulShutdown = async (signal: string) => {
logger.warn(`Received ${signal}, closing server...`); logger.warn(`Received ${signal}, closing server...`);
await firstWorker.close(); await firstWorker.close();
await secondWorker.close(); await secondWorker.close();
await thirdWorker.close();
process.exit(0); process.exit(0);
}; };

View File

@@ -7,22 +7,34 @@ import { runJobs } from "./utils.js";
export const firstWorker = new Worker( export const firstWorker = new Worker(
"backupQueue", "backupQueue",
async (job: Job<QueueJob>) => { async (job: Job<QueueJob>) => {
logger.info({ data: job.data }, "Running job"); logger.info({ data: job.data }, "Running job first worker");
await runJobs(job.data); await runJobs(job.data);
}, },
{ {
concurrency: 50, concurrency: 100,
connection, connection,
}, },
); );
export const secondWorker = new Worker( export const secondWorker = new Worker(
"backupQueue", "backupQueue",
async (job: Job<QueueJob>) => { async (job: Job<QueueJob>) => {
logger.info({ data: job.data }, "Running job"); logger.info({ data: job.data }, "Running job second worker");
await runJobs(job.data); await runJobs(job.data);
}, },
{ {
concurrency: 50, concurrency: 100,
connection,
},
);
export const thirdWorker = new Worker(
"backupQueue",
async (job: Job<QueueJob>) => {
logger.info({ data: job.data }, "Running job third worker");
await runJobs(job.data);
},
{
concurrency: 100,
connection, connection,
}, },
); );

View File

@@ -251,11 +251,15 @@ export const addDomainToCompose = async (
} }
labels.unshift(...httpLabels); labels.unshift(...httpLabels);
if (!compose.isolatedDeployment) { if (!compose.isolatedDeployment) {
if (!labels.includes("traefik.docker.network=dokploy-network")) { if (compose.composeType === "docker-compose") {
labels.unshift("traefik.docker.network=dokploy-network"); if (!labels.includes("traefik.docker.network=dokploy-network")) {
} labels.unshift("traefik.docker.network=dokploy-network");
if (!labels.includes("traefik.swarm.network=dokploy-network")) { }
labels.unshift("traefik.swarm.network=dokploy-network"); } else {
// Stack Case
if (!labels.includes("traefik.swarm.network=dokploy-network")) {
labels.unshift("traefik.swarm.network=dokploy-network");
}
} }
} }
} }

View File

@@ -171,7 +171,7 @@ export const cloneGithubRepository = async ({
const cloneUrl = `https://oauth2:${token}@${repoclone}`; const cloneUrl = `https://oauth2:${token}@${repoclone}`;
try { try {
writeStream.write(`\nClonning Repo ${repoclone} to ${outputPath}: ✅\n`); writeStream.write(`\nCloning Repo ${repoclone} to ${outputPath}: ✅\n`);
const cloneArgs = [ const cloneArgs = [
"clone", "clone",
"--branch", "--branch",