From cb81c6976f8511562d9a17e7d296f83260780bcc Mon Sep 17 00:00:00 2001 From: nfebe Date: Sun, 29 Mar 2026 15:40:37 +0200 Subject: [PATCH 1/2] fix(ui): Send credentials for existing database deployments When using an existing database, the modal now sends a databases array entry with user-provided credentials instead of only the container name. Also fixes preview defaults to match backend naming convention ({name}_primary_db / {name}_primary_user) and adds password preview. Multi-database entries now include password for existing/external modes. Signed-off-by: nfebe --- src/components/NewDeploymentModal.vue | 39 ++++++++++++++++++++++----- 1 file changed, 33 insertions(+), 6 deletions(-) diff --git a/src/components/NewDeploymentModal.vue b/src/components/NewDeploymentModal.vue index d2c3f68..cdc8294 100644 --- a/src/components/NewDeploymentModal.vue +++ b/src/components/NewDeploymentModal.vue @@ -838,12 +838,22 @@
Database {{ - form.database.dbName || (form.name ? form.name.replace(/-/g, "_") : "app_db") + form.database.dbName || + (form.name ? form.name.replace(/-/g, "_") + "_primary_db" : "app_primary_db") }}
User - {{ form.database.dbUser || "app" }} + {{ + form.database.dbUser || + (form.name ? form.name.replace(/-/g, "_") + "_primary_user" : "app_primary_user") + }} +
+
+ Password + {{ + form.database.dbPassword ? "••••••••" : "(auto-generated)" + }}
@@ -2367,8 +2377,23 @@ const handleCreate = async () => { } } + const databases: Record[] = []; + + if (form.database.mode === "existing" && form.database.existingContainer && form.database.type !== "none") { + databases.push({ + alias: "primary", + type: form.database.type, + mode: "existing", + existing_container: form.database.existingContainer, + database_name: form.database.dbName || undefined, + username: form.database.dbUser || undefined, + password: form.database.dbPassword || undefined, + external_port: form.database.externalPort ? parseInt(form.database.externalPort) : undefined, + }); + } + if (advancedOptions.multiDatabase && additionalDatabases.value.length > 0) { - const databases = additionalDatabases.value + const extraDbs = additionalDatabases.value .filter((db) => db.type !== "none") .map((db) => ({ alias: db.alias, @@ -2380,12 +2405,14 @@ const handleCreate = async () => { external_port: db.mode === "external" && db.externalPort ? parseInt(db.externalPort) : undefined, database_name: db.dbName || undefined, username: db.dbUser || undefined, + password: db.mode === "existing" || db.mode === "external" ? db.dbPassword || undefined : undefined, env_prefix: db.envPrefix || db.alias, })); + databases.push(...extraDbs); + } - if (databases.length > 0) { - payload.databases = databases; - } + if (databases.length > 0) { + payload.databases = databases; } if (finalDomain) { From ba3451e0ef8da902adfdebbb84542ae8d2ea1772 Mon Sep 17 00:00:00 2001 From: nfebe Date: Sun, 29 Mar 2026 16:12:34 +0200 Subject: [PATCH 2/2] fix(ui): Require credentials for existing database mode Database name, username, and password are now required fields when using an existing database. Step validation blocks progress until all three are filled. Preview shows actual values instead of generated defaults. Signed-off-by: nfebe --- src/components/NewDeploymentModal.vue | 99 +++++++++++++++------------ 1 file changed, 57 insertions(+), 42 deletions(-) diff --git a/src/components/NewDeploymentModal.vue b/src/components/NewDeploymentModal.vue index cdc8294..f3cba3c 100644 --- a/src/components/NewDeploymentModal.vue +++ b/src/components/NewDeploymentModal.vue @@ -734,7 +734,10 @@
- +
- +
Database - {{ - form.database.dbName || - (form.name ? form.name.replace(/-/g, "_") + "_primary_db" : "app_primary_db") - }} + {{ form.database.dbName || "—" }}
User - {{ - form.database.dbUser || - (form.name ? form.name.replace(/-/g, "_") + "_primary_user" : "app_primary_user") - }} + {{ form.database.dbUser || "—" }}
Password - {{ - form.database.dbPassword ? "••••••••" : "(auto-generated)" - }} + {{ form.database.dbPassword ? "••••••••" : "—" }}
@@ -1662,8 +1664,15 @@ const canProceed = computed(() => { if (deploymentMode.value === "easy") { if (currentStep.value === 2) { if (form.database.type !== "none") { - if (form.database.mode === "existing" && !form.database.existingContainer) { - return false; + if (form.database.mode === "existing") { + if ( + !form.database.existingContainer || + !form.database.dbName.trim() || + !form.database.dbUser.trim() || + !form.database.dbPassword.trim() + ) { + return false; + } } if (form.database.mode === "external") { if (!form.database.externalHost.trim() || !form.database.externalPort.trim()) { @@ -2377,38 +2386,44 @@ const handleCreate = async () => { } } + const mapDbToPayload = (db: DatabaseFormConfig) => ({ + alias: db.alias, + type: db.type, + mode: db.mode, + service: db.service || undefined, + existing_container: db.mode === "existing" ? db.existingContainer : undefined, + external_host: db.mode === "external" ? db.externalHost : undefined, + external_port: + (db.mode === "existing" || db.mode === "external") && db.externalPort ? parseInt(db.externalPort) : undefined, + database_name: db.dbName || undefined, + username: db.dbUser || undefined, + password: db.mode === "existing" || db.mode === "external" ? db.dbPassword || undefined : undefined, + env_prefix: db.envPrefix || db.alias, + }); + const databases: Record[] = []; if (form.database.mode === "existing" && form.database.existingContainer && form.database.type !== "none") { - databases.push({ - alias: "primary", - type: form.database.type, - mode: "existing", - existing_container: form.database.existingContainer, - database_name: form.database.dbName || undefined, - username: form.database.dbUser || undefined, - password: form.database.dbPassword || undefined, - external_port: form.database.externalPort ? parseInt(form.database.externalPort) : undefined, - }); + databases.push( + mapDbToPayload({ + id: "primary", + alias: "primary", + type: form.database.type, + mode: "existing", + service: "", + existingContainer: form.database.existingContainer, + externalHost: "", + externalPort: form.database.externalPort, + dbName: form.database.dbName, + dbUser: form.database.dbUser, + dbPassword: form.database.dbPassword, + envPrefix: "", + }), + ); } if (advancedOptions.multiDatabase && additionalDatabases.value.length > 0) { - const extraDbs = additionalDatabases.value - .filter((db) => db.type !== "none") - .map((db) => ({ - alias: db.alias, - type: db.type, - mode: db.mode, - service: db.service || undefined, - existing_container: db.mode === "existing" ? db.existingContainer : undefined, - external_host: db.mode === "external" ? db.externalHost : undefined, - external_port: db.mode === "external" && db.externalPort ? parseInt(db.externalPort) : undefined, - database_name: db.dbName || undefined, - username: db.dbUser || undefined, - password: db.mode === "existing" || db.mode === "external" ? db.dbPassword || undefined : undefined, - env_prefix: db.envPrefix || db.alias, - })); - databases.push(...extraDbs); + additionalDatabases.value.filter((db) => db.type !== "none").forEach((db) => databases.push(mapDbToPayload(db))); } if (databases.length > 0) {