diff --git a/apps/dokploy/package.json b/apps/dokploy/package.json
index 9f2229937f..e52968b158 100644
--- a/apps/dokploy/package.json
+++ b/apps/dokploy/package.json
@@ -1,6 +1,6 @@
{
"name": "dokploy",
- "version": "v0.25.9",
+ "version": "v0.25.10",
"private": true,
"license": "Apache-2.0",
"type": "module",
diff --git a/packages/server/src/emails/emails/build-success.tsx b/packages/server/src/emails/emails/build-success.tsx
index d9e500ab90..e5e1d1bb4b 100644
--- a/packages/server/src/emails/emails/build-success.tsx
+++ b/packages/server/src/emails/emails/build-success.tsx
@@ -19,6 +19,7 @@ export type TemplateProps = {
applicationType: string;
buildLink: string;
date: string;
+ environmentName: string;
};
export const BuildSuccessEmail = ({
@@ -27,6 +28,7 @@ export const BuildSuccessEmail = ({
applicationType = "application",
buildLink = "https://dokploy.com/projects/dokploy-test/applications/dokploy-test",
date = "2023-05-01T00:00:00.000Z",
+ environmentName = "production",
}: TemplateProps) => {
const previewText = `Build success for ${applicationName}`;
return (
@@ -74,6 +76,9 @@ export const BuildSuccessEmail = ({
Application Name: {applicationName}
+
+ Environment: {environmentName}
+
Application Type: {applicationType}
diff --git a/packages/server/src/services/application.ts b/packages/server/src/services/application.ts
index c10babe566..31f015c0c2 100644
--- a/packages/server/src/services/application.ts
+++ b/packages/server/src/services/application.ts
@@ -225,6 +225,7 @@ export const deployApplication = async ({
buildLink,
organizationId: application.environment.project.organizationId,
domains: application.domains,
+ environmentName: application.environment.name,
});
} catch (error) {
const command = `echo "Error occurred ❌, check the logs for details." >> ${deployment.logPath};`;
@@ -273,6 +274,7 @@ export const rebuildApplication = async ({
descriptionLog: string;
}) => {
const application = await findApplicationById(applicationId);
+ const buildLink = `${await getDokployUrl()}/dashboard/project/${application.environment.projectId}/environment/${application.environmentId}/services/application/${application.applicationId}?tab=deployments`;
const deployment = await createDeployment({
applicationId: applicationId,
@@ -293,6 +295,27 @@ export const rebuildApplication = async ({
await mechanizeDockerContainer(application);
await updateDeploymentStatus(deployment.deploymentId, "done");
await updateApplicationStatus(applicationId, "done");
+
+ if (application.rollbackActive) {
+ const tagImage =
+ application.sourceType === "docker"
+ ? application.dockerImage
+ : application.appName;
+ await createRollback({
+ appName: tagImage || "",
+ deploymentId: deployment.deploymentId,
+ });
+ }
+
+ await sendBuildSuccessNotifications({
+ projectName: application.environment.project.name,
+ applicationName: application.name,
+ applicationType: "application",
+ buildLink,
+ organizationId: application.environment.project.organizationId,
+ domains: application.domains,
+ environmentName: application.environment.name,
+ });
} catch (error) {
await updateDeploymentStatus(deployment.deploymentId, "error");
await updateApplicationStatus(applicationId, "error");
diff --git a/packages/server/src/services/compose.ts b/packages/server/src/services/compose.ts
index 3a2afb64d9..1d4a7e5c9c 100644
--- a/packages/server/src/services/compose.ts
+++ b/packages/server/src/services/compose.ts
@@ -267,6 +267,7 @@ export const deployCompose = async ({
buildLink,
organizationId: compose.environment.project.organizationId,
domains: compose.domains,
+ environmentName: compose.environment.name,
});
} catch (error) {
await updateDeploymentStatus(deployment.deploymentId, "error");
diff --git a/packages/server/src/utils/builders/compose.ts b/packages/server/src/utils/builders/compose.ts
index d196cef043..fe5417ea57 100644
--- a/packages/server/src/utils/builders/compose.ts
+++ b/packages/server/src/utils/builders/compose.ts
@@ -53,9 +53,8 @@ Compose Type: ${composeType} ✅`;
cd "${projectPath}";
- ${exportEnvCommand}
${compose.isolatedDeployment ? `docker network inspect ${compose.appName} >/dev/null 2>&1 || docker network create --attachable ${compose.appName}` : ""}
- env -i PATH="$PATH" docker ${command.split(" ").join(" ")} 2>&1 || { echo "Error: ❌ Docker command failed"; exit 1; }
+ env -i PATH="$PATH" ${exportEnvCommand} docker ${command.split(" ").join(" ")} 2>&1 || { echo "Error: ❌ Docker command failed"; exit 1; }
${compose.isolatedDeployment ? `docker network connect ${compose.appName} $(docker ps --filter "name=dokploy-traefik" -q) >/dev/null 2>&1` : ""}
echo "Docker Compose Deployed: ✅";
@@ -66,7 +65,6 @@ Compose Type: ${composeType} ✅`;
`;
return bashCommand;
- // return await execAsyncRemote(compose.serverId, bashCommand);
};
const sanitizeCommand = (command: string) => {
@@ -138,8 +136,8 @@ const getExportEnvCommand = (compose: ComposeNested) => {
compose.environment.project.env,
);
const exports = Object.entries(envVars)
- .map(([key, value]) => `export ${key}=${quote([value])}`)
- .join("\n");
+ .map(([key, value]) => `${key}=${quote([value])}`)
+ .join(" ");
- return exports ? `\n# Export environment variables\n${exports}\n` : "";
+ return exports ? `${exports}` : "";
};
diff --git a/packages/server/src/utils/notifications/build-success.ts b/packages/server/src/utils/notifications/build-success.ts
index a93b3d547f..5b5d6f518a 100644
--- a/packages/server/src/utils/notifications/build-success.ts
+++ b/packages/server/src/utils/notifications/build-success.ts
@@ -22,6 +22,7 @@ interface Props {
buildLink: string;
organizationId: string;
domains: Domain[];
+ environmentName: string;
}
export const sendBuildSuccessNotifications = async ({
@@ -31,6 +32,7 @@ export const sendBuildSuccessNotifications = async ({
buildLink,
organizationId,
domains,
+ environmentName,
}: Props) => {
const date = new Date();
const unixDate = ~~(Number(date) / 1000);
@@ -62,6 +64,7 @@ export const sendBuildSuccessNotifications = async ({
applicationType,
buildLink,
date: date.toLocaleString(),
+ environmentName,
}),
).catch();
await sendEmailNotification(email, "Build success for dokploy", template);
@@ -72,7 +75,7 @@ export const sendBuildSuccessNotifications = async ({
`${discord.decoration ? decoration : ""} ${text}`.trim();
await sendDiscordNotification(discord, {
- title: decorate(">", "`✅` Build Success"),
+ title: decorate(">", "`✅` Build Successes"),
color: 0x57f287,
fields: [
{
@@ -85,6 +88,11 @@ export const sendBuildSuccessNotifications = async ({
value: applicationName,
inline: true,
},
+ {
+ name: decorate("`🌍`", "Environment"),
+ value: environmentName,
+ inline: true,
+ },
{
name: decorate("`❔`", "Type"),
value: applicationType,
@@ -125,6 +133,7 @@ export const sendBuildSuccessNotifications = async ({
decorate("✅", "Build Success"),
`${decorate("🛠️", `Project: ${projectName}`)}` +
`${decorate("⚙️", `Application: ${applicationName}`)}` +
+ `${decorate("🌍", `Environment: ${environmentName}`)}` +
`${decorate("❔", `Type: ${applicationType}`)}` +
`${decorate("🕒", `Date: ${date.toLocaleString()}`)}` +
`${decorate("🔗", `Build details:\n${buildLink}`)}`,
@@ -139,6 +148,7 @@ export const sendBuildSuccessNotifications = async ({
`view, Build details, ${buildLink}, clear=true;`,
`🛠Project: ${projectName}\n` +
`⚙️Application: ${applicationName}\n` +
+ `🌍Environment: ${environmentName}\n` +
`❔Type: ${applicationType}\n` +
`🕒Date: ${date.toLocaleString()}`,
);
@@ -167,7 +177,7 @@ export const sendBuildSuccessNotifications = async ({
await sendTelegramNotification(
telegram,
- `✅ Build Success\n\nProject: ${projectName}\nApplication: ${applicationName}\nType: ${applicationType}\nDate: ${format(date, "PP")}\nTime: ${format(date, "pp")}`,
+ `✅ Build Success\n\nProject: ${projectName}\nApplication: ${applicationName}\nEnvironment: ${environmentName}\nType: ${applicationType}\nDate: ${format(date, "PP")}\nTime: ${format(date, "pp")}`,
inlineButton,
);
}
@@ -191,6 +201,11 @@ export const sendBuildSuccessNotifications = async ({
value: applicationName,
short: true,
},
+ {
+ title: "Environment",
+ value: environmentName,
+ short: true,
+ },
{
title: "Type",
value: applicationType,
@@ -260,6 +275,12 @@ export const sendBuildSuccessNotifications = async ({
text_align: "left",
text_size: "normal_v2",
},
+ {
+ tag: "markdown",
+ content: `**Environment:**\n${environmentName}`,
+ text_align: "left",
+ text_size: "normal_v2",
+ },
{
tag: "markdown",
content: `**Type:**\n${applicationType}`,