-
-
-
- {template.links.website && (
+ {template?.links?.github && (
+
+
+ )}
+ {template?.links?.website && (
+
)}
- {template.links.docs && (
+ {template?.links?.docs && (
@@ -419,7 +421,7 @@ export const AddTemplate = ({ projectId, baseUrl }: Props) => {
This will create an application from the{" "}
- {template.name} template and add it to your
+ {template?.name} template and add it to your
project.
diff --git a/apps/dokploy/package.json b/apps/dokploy/package.json
index 028ad20d..34ca86fa 100644
--- a/apps/dokploy/package.json
+++ b/apps/dokploy/package.json
@@ -1,6 +1,6 @@
{
"name": "dokploy",
- "version": "v0.21.2",
+ "version": "v0.21.3",
"private": true,
"license": "Apache-2.0",
"type": "module",
diff --git a/packages/server/src/templates/processors.ts b/packages/server/src/templates/processors.ts
index 86d3cdf7..31e7861a 100644
--- a/packages/server/src/templates/processors.ts
+++ b/packages/server/src/templates/processors.ts
@@ -1,3 +1,4 @@
+import { faker } from "@faker-js/faker";
import type { Schema } from "./index";
import {
generateBase64,
@@ -70,7 +71,7 @@ function processValue(
schema: Schema,
): string {
// First replace utility functions
- let processedValue = value.replace(/\${([^}]+)}/g, (match, varName) => {
+ let processedValue = value?.replace(/\${([^}]+)}/g, (match, varName) => {
// Handle utility functions
if (varName === "domain") {
return generateRandomDomain(schema);
@@ -117,6 +118,14 @@ function processValue(
return generateJwt(length);
}
+ if (varName === "username") {
+ return faker.internet.userName().toLowerCase();
+ }
+
+ if (varName === "email") {
+ return faker.internet.email().toLowerCase();
+ }
+
// If not a utility function, try to get from variables
return variables[varName] || match;
});
@@ -177,7 +186,14 @@ export function processDomains(
variables: Record
,
schema: Schema,
): Template["domains"] {
- if (!template?.config?.domains) return [];
+ if (
+ !template?.config?.domains ||
+ template.config.domains.length === 0 ||
+ template.config.domains.every((domain) => !domain.serviceName)
+ ) {
+ return [];
+ }
+
return template?.config?.domains?.map((domain: DomainConfig) => ({
...domain,
host: domain.host
@@ -194,7 +210,9 @@ export function processEnvVars(
variables: Record,
schema: Schema,
): Template["envs"] {
- if (!template?.config?.env) return [];
+ if (!template?.config?.env || Object.keys(template.config.env).length === 0) {
+ return [];
+ }
// Handle array of env vars
if (Array.isArray(template.config.env)) {
@@ -233,7 +251,13 @@ export function processMounts(
variables: Record,
schema: Schema,
): Template["mounts"] {
- if (!template?.config?.mounts) return [];
+ if (
+ !template?.config?.mounts ||
+ template.config.mounts.length === 0 ||
+ template.config.mounts.every((mount) => !mount.filePath && !mount.content)
+ ) {
+ return [];
+ }
return template?.config?.mounts?.map((mount: MountConfig) => ({
filePath: processValue(mount.filePath, variables, schema),