feat: added env support for dokploy

This commit is contained in:
xenonwellz
2024-11-01 15:27:00 +01:00
parent 95e53169b1
commit 94786c738b
2 changed files with 49 additions and 9 deletions

View File

@@ -185,18 +185,12 @@ const Service = (
<div className="flex flex-row items-center justify-between w-full gap-4">
<TabsList
className={cn(
"md:grid md:w-fit max-md:overflow-y-scroll justify-start",
"md:grid md:w-fit max-md:overflow-y-scroll justify-start md:grid-cols-6",
data?.serverId ? "md:grid-cols-6" : "md:grid-cols-7",
data?.composeType === "docker-compose" ? "" : "md:grid-cols-6",
data?.serverId && data?.composeType === "stack"
? "md:grid-cols-5"
: "",
)}
>
<TabsTrigger value="general">General</TabsTrigger>
{data?.composeType === "docker-compose" && (
<TabsTrigger value="environment">Environment</TabsTrigger>
)}
<TabsTrigger value="environment">Environment</TabsTrigger>
{!data?.serverId && (
<TabsTrigger value="monitoring">Monitoring</TabsTrigger>
)}

View File

@@ -2,12 +2,14 @@ import {
createWriteStream,
existsSync,
mkdirSync,
readFileSync,
writeFileSync,
} from "node:fs";
import { dirname, join } from "node:path";
import { paths } from "@dokploy/server/constants";
import type { InferResultType } from "@dokploy/server/types/with";
import boxen from "boxen";
import dotenv from "dotenv";
import {
writeDomainsToCompose,
writeDomainsToComposeRemote,
@@ -28,6 +30,7 @@ export const buildCompose = async (compose: ComposeNested, logPath: string) => {
const command = createCommand(compose);
await writeDomainsToCompose(compose, domains);
createEnvFile(compose);
processComposeFile(compose);
const logContent = `
App Name: ${appName}
@@ -84,6 +87,7 @@ export const getBuildComposeCommand = async (
const command = createCommand(compose);
const envCommand = getCreateEnvFileCommand(compose);
const projectPath = join(COMPOSE_PATH, compose.appName, "code");
const processComposeFileCommand = getProcessComposeFileCommand(compose);
const newCompose = await writeDomainsToComposeRemote(
compose,
@@ -119,6 +123,8 @@ Compose Type: ${composeType} ✅`;
cd "${projectPath}";
${processComposeFileCommand}
docker ${command.split(" ").join(" ")} >> "${logPath}" 2>&1 || { echo "Error: ❌ Docker command failed" >> "${logPath}"; exit 1; }
echo "Docker Compose Deployed: ✅" >> "${logPath}"
@@ -145,7 +151,7 @@ export const createCommand = (compose: ComposeNested) => {
const { composeType, appName, sourceType } = compose;
const path =
sourceType === "raw" ? "docker-compose.yml" : compose.composePath;
sourceType === "raw" ? "docker-compose.processed.yml" : compose.composePath;
let command = "";
if (composeType === "docker-compose") {
@@ -188,6 +194,46 @@ const createEnvFile = (compose: ComposeNested) => {
writeFileSync(envFilePath, envFileContent);
};
export const processComposeFile = (compose: ComposeNested) => {
const { COMPOSE_PATH } = paths();
const { env, appName, sourceType, composeType } = compose;
if (composeType === "stack") {
const inputPath =
sourceType === "raw" ? "docker-compose.yml" : compose.composePath;
const composeInputFilePath =
join(COMPOSE_PATH, appName, "code", inputPath) ||
join(COMPOSE_PATH, appName, "code", "docker-compose.yml");
const outputPath = "docker-compose.processed.yml";
const composeOutputFilePath =
join(COMPOSE_PATH, appName, "code", outputPath) ||
join(COMPOSE_PATH, appName, "code", "docker-compose.processed.yml");
const envContent = prepareEnvironmentVariables(env || "").join("\n");
const envVariables = dotenv.parse(envContent);
let templateContent = readFileSync(composeInputFilePath, "utf8");
templateContent = templateContent.replace(
/\$\{([^}]+)\}/g,
(_, varName) => {
return envVariables[varName] || "";
},
);
writeFileSync(composeOutputFilePath, templateContent);
}
};
export const getProcessComposeFileCommand = (compose: ComposeNested) => {
const { composeType } = compose;
if (composeType === "stack") {
return "set -a; source .env; set +a; envsubst < docker-compose.yml > docker-compose.processed.yml";
}
return "cp docker-compose.yml docker-compose.processed.yml";
};
export const getCreateEnvFileCommand = (compose: ComposeNested) => {
const { COMPOSE_PATH } = paths(true);
const { env, composePath, appName } = compose;