From c7f44f65bc0eea8fbc9c3d54450a58fb9bafaddb Mon Sep 17 00:00:00 2001 From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com> Date: Sat, 8 Mar 2025 19:06:14 -0600 Subject: [PATCH] feat(applications): add support for Docker build secrets - Implement build secrets functionality for Dockerfile builds - Add new `buildSecrets` field to application schema - Update UI and backend to handle build-time secrets - Modify Docker build process to support secret injection during build --- .../application/environment/show.tsx | 79 +- apps/dokploy/drizzle/0072_milky_lyja.sql | 2 + apps/dokploy/drizzle/meta/0072_snapshot.json | 5131 +++++++++++++++++ apps/dokploy/drizzle/meta/_journal.json | 7 + .../dokploy/server/api/routers/application.ts | 1 + packages/server/src/db/schema/application.ts | 13 +- packages/server/src/db/schema/schema.dbml | 1 + .../server/src/utils/builders/docker-file.ts | 51 +- 8 files changed, 5257 insertions(+), 28 deletions(-) create mode 100644 apps/dokploy/drizzle/0072_milky_lyja.sql create mode 100644 apps/dokploy/drizzle/meta/0072_snapshot.json diff --git a/apps/dokploy/components/dashboard/application/environment/show.tsx b/apps/dokploy/components/dashboard/application/environment/show.tsx index d97c39e2..b449f12e 100644 --- a/apps/dokploy/components/dashboard/application/environment/show.tsx +++ b/apps/dokploy/components/dashboard/application/environment/show.tsx @@ -11,6 +11,7 @@ import { z } from "zod"; const addEnvironmentSchema = z.object({ env: z.string(), buildArgs: z.string(), + buildSecrets: z.record(z.string(), z.string()), }); type EnvironmentSchema = z.infer; @@ -36,6 +37,7 @@ export const ShowEnvironment = ({ applicationId }: Props) => { defaultValues: { env: data?.env || "", buildArgs: data?.buildArgs || "", + buildSecrets: data?.buildSecrets || {}, }, resolver: zodResolver(addEnvironmentSchema), }); @@ -44,6 +46,7 @@ export const ShowEnvironment = ({ applicationId }: Props) => { mutateAsync({ env: data.env, buildArgs: data.buildArgs, + buildSecrets: data.buildSecrets, applicationId, }) .then(async () => { @@ -69,25 +72,63 @@ export const ShowEnvironment = ({ applicationId }: Props) => { placeholder={["NODE_ENV=production", "PORT=3000"].join("\n")} /> {data?.buildType === "dockerfile" && ( - - Available only at build-time. See documentation  - - here - - . - - } - placeholder="NPM_TOKEN=xyz" - /> + <> + + Available only at build-time. See documentation  + + here + + . + + } + placeholder="NPM_TOKEN=xyz" + /> + + Secrets available only during build-time and not in the + final image. See documentation  + + here + + . + + } + placeholder="API_TOKEN=xyz" + transformValue={(value) => { + // Convert the string format to object + const lines = value.split("\n").filter((line) => line.trim()); + return Object.fromEntries( + lines.map((line) => { + const [key, ...valueParts] = line.split("="); + return [key.trim(), valueParts.join("=").trim()]; + }), + ); + }} + formatValue={(value) => { + // Convert the object back to string format + return Object.entries(value as Record) + .map(([key, val]) => `${key}=${val}`) + .join("\n"); + }} + /> + )}