From 35bcb1753897e280e9391c86b6936d8fecb4e439 Mon Sep 17 00:00:00 2001 From: UnwishingMoon <11472973+UnwishingMoon@users.noreply.github.com> Date: Sat, 27 Dec 2025 15:23:12 +0100 Subject: [PATCH] Add socket path to database config, to database setup and language file --- server/database.js | 6 ++++-- server/setup-database.js | 37 ++++++++++++++++++++++++++++++------- src/lang/en.json | 3 ++- src/pages/SetupDatabase.vue | 6 ++++++ 4 files changed, 42 insertions(+), 10 deletions(-) diff --git a/server/database.js b/server/database.js index a65a7fdcc..74f64dca0 100644 --- a/server/database.js +++ b/server/database.js @@ -166,7 +166,7 @@ class Database { * Read the database config * @throws {Error} If the config is invalid * @typedef {string|undefined} envString - * @returns {{type: "sqlite"} | {type:envString, hostname:envString, port:envString, database:envString, username:envString, password:envString}} Database config + * @returns {{type: "sqlite"} | {type:envString, hostname:envString, port:envString, database:envString, username:envString, password:envString, socketPath:envString}} Database config */ static readDBConfig() { let dbConfig; @@ -186,7 +186,7 @@ class Database { /** * @typedef {string|undefined} envString - * @param {{type: "sqlite"} | {type:envString, hostname:envString, port:envString, database:envString, username:envString, password:envString}} dbConfig the database configuration that should be written + * @param {{type: "sqlite"} | {type:envString, hostname:envString, port:envString, database:envString, username:envString, password:envString, socketPath:envString}} dbConfig the database configuration that should be written * @returns {void} */ static writeDBConfig(dbConfig) { @@ -277,6 +277,7 @@ class Database { port: dbConfig.port, user: dbConfig.username, password: dbConfig.password, + socketPath: dbConfig.socketPath, }); // Set to true, so for example "uptime.kuma", becomes `uptime.kuma`, not `uptime`.`kuma` @@ -294,6 +295,7 @@ class Database { user: dbConfig.username, password: dbConfig.password, database: dbConfig.dbName, + socketPath: dbConfig.socketPath, timezone: "Z", typeCast: function (field, next) { if (field.type === "DATETIME") { diff --git a/server/setup-database.js b/server/setup-database.js index 248208662..b73de94fa 100644 --- a/server/setup-database.js +++ b/server/setup-database.js @@ -77,6 +77,7 @@ class SetupDatabase { dbConfig.dbName = process.env.UPTIME_KUMA_DB_NAME; dbConfig.username = process.env.UPTIME_KUMA_DB_USERNAME; dbConfig.password = process.env.UPTIME_KUMA_DB_PASSWORD; + dbConfig.socketPath = process.env.UPTIME_KUMA_DB_SOCKET; Database.writeDBConfig(dbConfig); } @@ -176,14 +177,35 @@ class SetupDatabase { // External MariaDB if (dbConfig.type === "mariadb") { - if (!dbConfig.hostname) { - response.status(400).json("Hostname is required"); - this.runningSetup = false; - return; - } - if (!dbConfig.port) { - response.status(400).json("Port is required"); + // If socketPath is not provided, hostname and port are required + if(dbConfig.socketPath === undefined || dbConfig.socketPath.length === 0) { + if (!dbConfig.hostname) { + response.status(400).json("Hostname is required"); + this.runningSetup = false; + return; + } + + if (!dbConfig.port) { + response.status(400).json("Port is required"); + this.runningSetup = false; + return; + } + } else if (dbConfig.socketPath && dbConfig.socketPath.length > 0) { // Socket path is provided + // Checking if the path exists and is a socket + if (!fs.existsSync(dbConfig.socketPath)) { + response.status(400).json("The path to the Socket does not exist"); + this.runningSetup = false; + return; + } + + if (!fs.lstatSync(dbConfig.socketPath).isSocket()) { + response.status(400).json("The path provided is not a Socket"); + this.runningSetup = false; + return; + } + } else { + response.status(400).json("Either a path to the Socket or Hostname and Port are required"); this.runningSetup = false; return; } @@ -215,6 +237,7 @@ class SetupDatabase { user: dbConfig.username, password: dbConfig.password, database: dbConfig.dbName, + socketPath: dbConfig.socketPath, }); await connection.execute("SELECT 1"); connection.end(); diff --git a/src/lang/en.json b/src/lang/en.json index c8d69973a..cb8910bf0 100644 --- a/src/lang/en.json +++ b/src/lang/en.json @@ -1233,5 +1233,6 @@ "Unable to get permission to notify": "Unable to get permission to notify (request either denied or ignored).", "Webpush Helptext": "Web push only works with SSL (HTTPS) connections. For iOS devices, webpage must be added to homescreen beforehand.", "minimumIntervalWarning": "Intervals below 20 seconds may result in poor performance.", - "lowIntervalWarning": "Are you sure want to set the interval value below 20 seconds? Performance may be degraded, particularly if there are a large number of monitors." + "lowIntervalWarning": "Are you sure want to set the interval value below 20 seconds? Performance may be degraded, particularly if there are a large number of monitors.", + "socketPath": "Path to socket" } diff --git a/src/pages/SetupDatabase.vue b/src/pages/SetupDatabase.vue index 81738a98b..4b3a99545 100644 --- a/src/pages/SetupDatabase.vue +++ b/src/pages/SetupDatabase.vue @@ -76,6 +76,11 @@ +