mirror of
https://github.com/Dokploy/dokploy.git
synced 2026-07-09 07:55:25 +02:00
Compare commits
13 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d9398b9558 | ||
|
|
788dbe4050 | ||
|
|
6934f44778 | ||
|
|
457a6db00f | ||
|
|
81f89a0796 | ||
|
|
d8a98f3936 | ||
|
|
ec11325165 | ||
|
|
abcbd2d599 | ||
|
|
1664ae9b92 | ||
|
|
24729f35ec | ||
|
|
3eaeaa1db4 | ||
|
|
de4a00f1e9 | ||
|
|
2f5cd620c5 |
@@ -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"
|
||||||
|
|||||||
@@ -97,11 +97,7 @@ export const ShowTraefikActions = ({ serverId }: Props) => {
|
|||||||
);
|
);
|
||||||
refetchDashboard();
|
refetchDashboard();
|
||||||
})
|
})
|
||||||
.catch(() => {
|
.catch(() => {});
|
||||||
toast.error(
|
|
||||||
`${haveTraefikDashboardPortEnabled ? "Disabled" : "Enabled"} Dashboard`,
|
|
||||||
);
|
|
||||||
});
|
|
||||||
}}
|
}}
|
||||||
className="w-full cursor-pointer space-x-3"
|
className="w-full cursor-pointer space-x-3"
|
||||||
>
|
>
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "dokploy",
|
"name": "dokploy",
|
||||||
"version": "v0.25.0",
|
"version": "v0.25.2",
|
||||||
"private": true,
|
"private": true,
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
|
|||||||
@@ -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);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -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,
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -342,6 +342,8 @@ export const readPorts = async (
|
|||||||
command = `docker service inspect ${resourceName} --format '{{json .Spec.EndpointSpec.Ports}}'`;
|
command = `docker service inspect ${resourceName} --format '{{json .Spec.EndpointSpec.Ports}}'`;
|
||||||
} else if (resourceType === "standalone") {
|
} else if (resourceType === "standalone") {
|
||||||
command = `docker container inspect ${resourceName} --format '{{json .NetworkSettings.Ports}}'`;
|
command = `docker container inspect ${resourceName} --format '{{json .NetworkSettings.Ports}}'`;
|
||||||
|
} else {
|
||||||
|
throw new Error("Resource type not found");
|
||||||
}
|
}
|
||||||
let result = "";
|
let result = "";
|
||||||
if (serverId) {
|
if (serverId) {
|
||||||
@@ -397,17 +399,20 @@ export const writeTraefikSetup = async (input: TraefikOptions) => {
|
|||||||
"dokploy-traefik",
|
"dokploy-traefik",
|
||||||
input.serverId,
|
input.serverId,
|
||||||
);
|
);
|
||||||
|
|
||||||
if (resourceType === "service") {
|
if (resourceType === "service") {
|
||||||
await initializeTraefikService({
|
await initializeTraefikService({
|
||||||
env: input.env,
|
env: input.env,
|
||||||
additionalPorts: input.additionalPorts,
|
additionalPorts: input.additionalPorts,
|
||||||
serverId: input.serverId,
|
serverId: input.serverId,
|
||||||
});
|
});
|
||||||
} else {
|
} else if (resourceType === "standalone") {
|
||||||
await initializeStandaloneTraefik({
|
await initializeStandaloneTraefik({
|
||||||
env: input.env,
|
env: input.env,
|
||||||
additionalPorts: input.additionalPorts,
|
additionalPorts: input.additionalPorts,
|
||||||
serverId: input.serverId,
|
serverId: input.serverId,
|
||||||
});
|
});
|
||||||
|
} else {
|
||||||
|
throw new Error("Traefik resource type not found");
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -87,16 +87,27 @@ export const initializeStandaloneTraefik = async ({
|
|||||||
};
|
};
|
||||||
|
|
||||||
const docker = await getRemoteDocker(serverId);
|
const docker = await getRemoteDocker(serverId);
|
||||||
|
try {
|
||||||
|
await docker.pull(imageName);
|
||||||
|
await new Promise((resolve) => setTimeout(resolve, 3000));
|
||||||
|
console.log("Traefik Image Pulled ✅");
|
||||||
|
} catch (error) {
|
||||||
|
console.log("Traefik Image Not Found: Pulling ", error);
|
||||||
|
}
|
||||||
try {
|
try {
|
||||||
const container = docker.getContainer(containerName);
|
const container = docker.getContainer(containerName);
|
||||||
await container.remove({ force: true });
|
await container.remove({ force: true });
|
||||||
await new Promise((resolve) => setTimeout(resolve, 5000));
|
await new Promise((resolve) => setTimeout(resolve, 5000));
|
||||||
} catch {}
|
} catch {}
|
||||||
|
|
||||||
await docker.createContainer(settings);
|
try {
|
||||||
const newContainer = docker.getContainer(containerName);
|
await docker.createContainer(settings);
|
||||||
await newContainer.start();
|
const newContainer = docker.getContainer(containerName);
|
||||||
console.log("Traefik Started ✅");
|
await newContainer.start();
|
||||||
|
console.log("Traefik Started ✅");
|
||||||
|
} catch (error) {
|
||||||
|
console.log("Traefik Not Found: Starting ", error);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
export const initializeTraefikService = async ({
|
export const initializeTraefikService = async ({
|
||||||
|
|||||||
@@ -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");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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",
|
||||||
|
|||||||
Reference in New Issue
Block a user