From afd0ae6428ab6627cd14d751df00d5f0c6e63518 Mon Sep 17 00:00:00 2001
From: Nathan Neulinger <nneul@neulinger.org>
Date: Fri, 27 Dec 2024 14:21:18 -0600
Subject: [PATCH 1/4] Initial support for setting a server identifier

---
 server/client.js                       |  1 +
 server/notification-providers/slack.js |  4 ++++
 server/notification-providers/smtp.js  |  5 +++++
 src/components/settings/General.vue    | 21 +++++++++++++++++++++
 src/layouts/Layout.vue                 | 18 +++++++++++++++---
 src/mixins/public.js                   | 12 ++++++++++++
 src/pages/Setup.vue                    |  2 +-
 src/pages/SetupDatabase.vue            |  2 +-
 8 files changed, 60 insertions(+), 5 deletions(-)

diff --git a/server/client.js b/server/client.js
index 72f0a4e8e..421f89441 100644
--- a/server/client.js
+++ b/server/client.js
@@ -160,6 +160,7 @@ async function sendInfo(socket, hideVersion = false) {
         isContainer,
         dbType,
         primaryBaseURL: await setting("primaryBaseURL"),
+        serverIdentifier: await setting("serverIdentifier"),
         serverTimezone: await server.getTimezone(),
         serverTimezoneOffset: server.getTimezoneOffset(),
     });
diff --git a/server/notification-providers/slack.js b/server/notification-providers/slack.js
index 5e25a1fbc..202aef12b 100644
--- a/server/notification-providers/slack.js
+++ b/server/notification-providers/slack.js
@@ -142,8 +142,12 @@ class Slack extends NotificationProvider {
             }
 
             const baseURL = await setting("primaryBaseURL");
+            const serverIdentifier = await setting("serverIdentifier");
 
             const title = "Uptime Kuma Alert";
+            if (serverIdentifier) {
+                title = title + " (" + serverIdentifier + ")"
+            }
             let data = {
                 "channel": notification.slackchannel,
                 "username": notification.slackusername,
diff --git a/server/notification-providers/smtp.js b/server/notification-providers/smtp.js
index 9f3defa5e..4e614fa06 100644
--- a/server/notification-providers/smtp.js
+++ b/server/notification-providers/smtp.js
@@ -46,6 +46,11 @@ class SMTP extends NotificationProvider {
         let body = msg;
         if (heartbeatJSON) {
             body = `${msg}\nTime (${heartbeatJSON["timezone"]}): ${heartbeatJSON["localDateTime"]}`;
+
+            const serverIdentifier = await setting("serverIdentifier");
+            if (serverIdentifier) {
+                body = body + `\nServer Identifier: ${serverIdentifier}`
+            }
         }
         // subject and body are templated
         if ((monitorJSON && heartbeatJSON) || msg.endsWith("Testing")) {
diff --git a/src/components/settings/General.vue b/src/components/settings/General.vue
index 487c3ba3a..82df5e958 100644
--- a/src/components/settings/General.vue
+++ b/src/components/settings/General.vue
@@ -132,6 +132,27 @@
                 <div class="form-text"></div>
             </div>
 
+            <!-- Server Identifier -->
+            <div class="mb-4">
+                <label class="form-label" for="serverIdentifier">
+                    {{ $t("Server Identifier") }}
+                </label>
+
+                <div class="input-group mb-3">
+                    <input
+                        id="serverIdentifier"
+                        v-model="settings.serverIdentifier"
+                        class="form-control"
+                        name="serverIdentifier"
+                        placeholder=""
+                        pattern=".+"
+                        autocomplete="new-password"
+                    />
+                </div>
+
+                <div class="form-text"></div>
+            </div>
+
             <!-- Steam API Key -->
             <div class="mb-4">
                 <label class="form-label" for="steamAPIKey">
diff --git a/src/layouts/Layout.vue b/src/layouts/Layout.vue
index 9faedf589..2fe7d4020 100644
--- a/src/layouts/Layout.vue
+++ b/src/layouts/Layout.vue
@@ -13,7 +13,7 @@
         <header v-if="! $root.isMobile" class="d-flex flex-wrap justify-content-center py-3 mb-3 border-bottom">
             <router-link to="/dashboard" class="d-flex align-items-center mb-3 mb-md-0 me-md-auto text-dark text-decoration-none">
                 <object class="bi me-2 ms-4" width="40" height="40" data="/icon.svg" />
-                <span class="fs-4 title">{{ $t("Uptime Kuma") }}</span>
+                <span class="fs-4 title">{{ $t("Uptime Kuma") }}{{ $root.serverIdentifierSuffix }}</span>
             </router-link>
 
             <a v-if="hasNewVersion" target="_blank" href="https://github.com/louislam/uptime-kuma/releases" class="btn btn-info me-3">
@@ -85,7 +85,7 @@
         <header v-else class="d-flex flex-wrap justify-content-center pt-2 pb-2 mb-3">
             <router-link to="/dashboard" class="d-flex align-items-center text-dark text-decoration-none">
                 <object class="bi" width="40" height="40" data="/icon.svg" />
-                <span class="fs-4 title ms-2">Uptime Kuma</span>
+                <span class="fs-4 title ms-2">{{ $t("Uptime Kuma") }}{{ $root.serverIdentifierSuffix }}</span>
             </router-link>
         </header>
 
@@ -170,7 +170,11 @@ export default {
     },
 
     watch: {
-
+        $route(to) {
+            if (this.serverIdentifierSuffix) {
+                this.updateTitle("Uptime Kuma" + this.$root.serverIdentifierSuffix);
+            }
+        }
     },
 
     mounted() {
@@ -188,6 +192,10 @@ export default {
         if (this.toastContainer != null) {
             this.toastContainerObserver.observe(this.toastContainer, { childList: true });
         }
+
+        if (this.$root.serverIdentifierSuffix) {
+            this.updateTitle("Uptime Kuma" + this.$root.serverIdentifierSuffix);
+        }
     },
 
     beforeUnmount() {
@@ -201,6 +209,10 @@ export default {
          */
         clearToasts() {
             toast.clear();
+        },
+
+        updateTitle(title) {
+            document.title = title;
         }
     },
 
diff --git a/src/mixins/public.js b/src/mixins/public.js
index c87bfb358..f809a09c1 100644
--- a/src/mixins/public.js
+++ b/src/mixins/public.js
@@ -51,5 +51,17 @@ export default {
                 return location.protocol + "//" + location.host;
             }
         },
+
+        serverIdentifierSuffix() {
+            if (this.$root.info.serverIdentifier) {
+                return " (" + this.$root.info.serverIdentifier + ")";
+            }
+
+            if (env === "development" || localStorage.dev === "dev") {
+                return " (dev)";
+            } else {
+                return "";
+            }
+        },
     }
 };
diff --git a/src/pages/Setup.vue b/src/pages/Setup.vue
index f681b7a82..f88758ce7 100644
--- a/src/pages/Setup.vue
+++ b/src/pages/Setup.vue
@@ -5,7 +5,7 @@
                 <div>
                     <object width="64" height="64" data="/icon.svg" />
                     <div style="font-size: 28px; font-weight: bold; margin-top: 5px;">
-                        Uptime Kuma
+                        {{ $t("Uptime Kuma") }}
                     </div>
                 </div>
 
diff --git a/src/pages/SetupDatabase.vue b/src/pages/SetupDatabase.vue
index 81738a98b..f4e6963b7 100644
--- a/src/pages/SetupDatabase.vue
+++ b/src/pages/SetupDatabase.vue
@@ -4,7 +4,7 @@
             <div>
                 <object width="64" height="64" data="/icon.svg" />
                 <div style="font-size: 28px; font-weight: bold; margin-top: 5px;">
-                    Uptime Kuma
+                    {{ $t("Uptime Kuma") }}
                 </div>
             </div>
 

From 61629cd963f5c2522d92202b85c5854f8b6d5c74 Mon Sep 17 00:00:00 2001
From: Nathan Neulinger <nneul@neulinger.org>
Date: Fri, 27 Dec 2024 14:34:18 -0600
Subject: [PATCH 2/4] Add description

---
 package-lock.json                   | 5 ++---
 src/components/settings/General.vue | 4 +++-
 src/lang/en.json                    | 2 ++
 3 files changed, 7 insertions(+), 4 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 8d3f58b4d..ac8d7961d 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
 {
     "name": "uptime-kuma",
-    "version": "2.0.0-beta.0",
+    "version": "2.0.0-beta.1",
     "lockfileVersion": 3,
     "requires": true,
     "packages": {
         "": {
             "name": "uptime-kuma",
-            "version": "2.0.0-beta.0",
+            "version": "2.0.0-beta.1",
             "license": "MIT",
             "dependencies": {
                 "@grpc/grpc-js": "~1.8.22",
@@ -8332,7 +8332,6 @@
             "integrity": "sha512-3/CE4aJX7LNEiE3i6FeodHmI/38GZtWCsAtsymScmzYapx8q1nVVb+eLcLSzATmCPXw5pT4TqVs1E0OmxAd9tw==",
             "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.",
             "dev": true,
-            "license": "MIT",
             "dependencies": {
                 "@eslint/eslintrc": "^1.2.2",
                 "@humanwhocodes/config-array": "^0.9.2",
diff --git a/src/components/settings/General.vue b/src/components/settings/General.vue
index 82df5e958..3dbd8e950 100644
--- a/src/components/settings/General.vue
+++ b/src/components/settings/General.vue
@@ -150,7 +150,9 @@
                     />
                 </div>
 
-                <div class="form-text"></div>
+                <div class="form-text">
+                    {{ $t("serverIdentifierDescription") }}
+                </div>
             </div>
 
             <!-- Steam API Key -->
diff --git a/src/lang/en.json b/src/lang/en.json
index e215f1031..22babe20e 100644
--- a/src/lang/en.json
+++ b/src/lang/en.json
@@ -16,6 +16,8 @@
     "General": "General",
     "Game": "Game",
     "Primary Base URL": "Primary Base URL",
+    "serverIdentifier": "Server Identifier",
+    "serverIdentifierDescription": "If provided, this will be appended in parentheses after Uptime Kuma in UI and notifications",
     "Version": "Version",
     "Check Update On GitHub": "Check Update On GitHub",
     "List": "List",

From 0492276601e1bca47e04f10680d55bebd5d8ced7 Mon Sep 17 00:00:00 2001
From: Nathan Neulinger <nneul@neulinger.org>
Date: Fri, 27 Dec 2024 14:46:41 -0600
Subject: [PATCH 3/4] clean up lint complaints

---
 server/notification-providers/slack.js | 4 ++--
 server/notification-providers/smtp.js  | 3 ++-
 2 files changed, 4 insertions(+), 3 deletions(-)

diff --git a/server/notification-providers/slack.js b/server/notification-providers/slack.js
index 202aef12b..3566fb7ef 100644
--- a/server/notification-providers/slack.js
+++ b/server/notification-providers/slack.js
@@ -144,9 +144,9 @@ class Slack extends NotificationProvider {
             const baseURL = await setting("primaryBaseURL");
             const serverIdentifier = await setting("serverIdentifier");
 
-            const title = "Uptime Kuma Alert";
+            let title = "Uptime Kuma Alert";
             if (serverIdentifier) {
-                title = title + " (" + serverIdentifier + ")"
+                title = title + " (" + serverIdentifier + ")";
             }
             let data = {
                 "channel": notification.slackchannel,
diff --git a/server/notification-providers/smtp.js b/server/notification-providers/smtp.js
index 4e614fa06..a62973bd7 100644
--- a/server/notification-providers/smtp.js
+++ b/server/notification-providers/smtp.js
@@ -1,5 +1,6 @@
 const nodemailer = require("nodemailer");
 const NotificationProvider = require("./notification-provider");
+const { setSettings, setting } = require("../util-server");
 const { DOWN } = require("../../src/util");
 const { Liquid } = require("liquidjs");
 
@@ -49,7 +50,7 @@ class SMTP extends NotificationProvider {
 
             const serverIdentifier = await setting("serverIdentifier");
             if (serverIdentifier) {
-                body = body + `\nServer Identifier: ${serverIdentifier}`
+                body = body + `\nServer Identifier: ${serverIdentifier}`;
             }
         }
         // subject and body are templated

From a8a8dcf1343925c2aa12a0cca11d7106c9c81342 Mon Sep 17 00:00:00 2001
From: Nathan Neulinger <nneul@neulinger.org>
Date: Fri, 27 Dec 2024 14:49:25 -0600
Subject: [PATCH 4/4] remove unused

---
 server/notification-providers/smtp.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/server/notification-providers/smtp.js b/server/notification-providers/smtp.js
index a62973bd7..2e2815024 100644
--- a/server/notification-providers/smtp.js
+++ b/server/notification-providers/smtp.js
@@ -1,6 +1,6 @@
 const nodemailer = require("nodemailer");
 const NotificationProvider = require("./notification-provider");
-const { setSettings, setting } = require("../util-server");
+const { setting } = require("../util-server");
 const { DOWN } = require("../../src/util");
 const { Liquid } = require("liquidjs");