From d7e830114841a452a87bdd15cb673a7f3fc3d5a0 Mon Sep 17 00:00:00 2001
From: Copilot <198982749+Copilot@users.noreply.github.com>
Date: Tue, 3 Feb 2026 00:45:52 +0800
Subject: [PATCH 1/2] feat: add server restart option to home page restart
button (#1324)
* Initial plan
* feat: add server restart functionality to home page restart button
Co-authored-by: devhaozi <115467771+devhaozi@users.noreply.github.com>
* refactor: remove unreachable success callback for server restart
Co-authored-by: devhaozi <115467771+devhaozi@users.noreply.github.com>
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: devhaozi <115467771+devhaozi@users.noreply.github.com>
---
internal/route/http.go | 1 +
internal/service/home.go | 10 +++++++
pkg/tools/tools.go | 5 ++++
web/src/api/panel/home/index.ts | 4 ++-
web/src/locales/en.po | 16 ++++++++++
web/src/locales/zh_CN.po | 16 ++++++++++
web/src/locales/zh_TW.po | 16 ++++++++++
web/src/views/home/IndexView.vue | 50 +++++++++++++++++++++++++++-----
8 files changed, 110 insertions(+), 8 deletions(-)
diff --git a/internal/route/http.go b/internal/route/http.go
index d6cc9078..c02252a9 100644
--- a/internal/route/http.go
+++ b/internal/route/http.go
@@ -200,6 +200,7 @@ func (route *Http) Register(r *chi.Mux) {
r.Get("/update_info", route.home.UpdateInfo)
r.Post("/update", route.home.Update)
r.Post("/restart", route.home.Restart)
+ r.Post("/restart_server", route.home.RestartServer)
})
r.Route("/task", func(r chi.Router) {
diff --git a/internal/service/home.go b/internal/service/home.go
index 78c0eaec..08494511 100644
--- a/internal/service/home.go
+++ b/internal/service/home.go
@@ -400,3 +400,13 @@ func (s *HomeService) Restart(w http.ResponseWriter, r *http.Request) {
tools.RestartPanel()
Success(w, nil)
}
+
+func (s *HomeService) RestartServer(w http.ResponseWriter, r *http.Request) {
+ if s.taskRepo.HasRunningTask() {
+ Error(w, http.StatusInternalServerError, s.t.Get("background task is running, restart is prohibited, please try again later"))
+ return
+ }
+
+ tools.RestartServer()
+ Success(w, nil)
+}
diff --git a/pkg/tools/tools.go b/pkg/tools/tools.go
index bad91f6c..11e02665 100644
--- a/pkg/tools/tools.go
+++ b/pkg/tools/tools.go
@@ -88,6 +88,11 @@ func RestartPanel() {
_ = shell.ExecfAsync("sleep 1 && systemctl restart acepanel")
}
+// RestartServer 重启服务器
+func RestartServer() {
+ _ = shell.ExecfAsync("sleep 1 && reboot")
+}
+
// IsChina 是否中国大陆
func IsChina() bool {
client := resty.New()
diff --git a/web/src/api/panel/home/index.ts b/web/src/api/panel/home/index.ts
index 3b1a4038..8d25b09b 100644
--- a/web/src/api/panel/home/index.ts
+++ b/web/src/api/panel/home/index.ts
@@ -21,5 +21,7 @@ export default {
// 更新面板
update: (): any => http.Post('/home/update'),
// 重启面板
- restart: (): any => http.Post('/home/restart')
+ restart: (): any => http.Post('/home/restart'),
+ // 重启服务器
+ restartServer: (): any => http.Post('/home/restart_server')
}
diff --git a/web/src/locales/en.po b/web/src/locales/en.po
index e66d38a2..e8f0381b 100644
--- a/web/src/locales/en.po
+++ b/web/src/locales/en.po
@@ -5082,6 +5082,22 @@ msgstr "Panel restarting..."
msgid "Panel restarted successfully"
msgstr "Panel restarted successfully"
+#: src/views/home/IndexView.vue:338
+msgid "Server restarting..."
+msgstr "Server restarting..."
+
+#: src/views/home/IndexView.vue:344
+msgid "Restart Panel"
+msgstr "Restart Panel"
+
+#: src/views/home/IndexView.vue:348
+msgid "Restart Server"
+msgstr "Restart Server"
+
+#: src/views/home/IndexView.vue:362
+msgid "Are you sure you want to restart the server? This will disconnect all connections."
+msgstr "Are you sure you want to restart the server? This will disconnect all connections."
+
#: src/views/home/IndexView.vue:344
msgid "Current version is the latest"
msgstr "Current version is the latest"
diff --git a/web/src/locales/zh_CN.po b/web/src/locales/zh_CN.po
index 7b7e0b0c..f0b04286 100644
--- a/web/src/locales/zh_CN.po
+++ b/web/src/locales/zh_CN.po
@@ -4845,6 +4845,22 @@ msgstr "面板重启中……"
msgid "Panel restarted successfully"
msgstr "面板重启成功"
+#: src/views/home/IndexView.vue:338
+msgid "Server restarting..."
+msgstr "服务器重启中……"
+
+#: src/views/home/IndexView.vue:344
+msgid "Restart Panel"
+msgstr "重启面板"
+
+#: src/views/home/IndexView.vue:348
+msgid "Restart Server"
+msgstr "重启服务器"
+
+#: src/views/home/IndexView.vue:362
+msgid "Are you sure you want to restart the server? This will disconnect all connections."
+msgstr "您确定要重启服务器吗?这将断开所有连接。"
+
#: src/views/home/IndexView.vue:344
msgid "Current version is the latest"
msgstr "当前版本是最新版本"
diff --git a/web/src/locales/zh_TW.po b/web/src/locales/zh_TW.po
index 1312d287..fdfa821a 100644
--- a/web/src/locales/zh_TW.po
+++ b/web/src/locales/zh_TW.po
@@ -4846,6 +4846,22 @@ msgstr "面板重啟中……"
msgid "Panel restarted successfully"
msgstr "面板重啟成功"
+#: src/views/home/IndexView.vue:338
+msgid "Server restarting..."
+msgstr "伺服器重啟中……"
+
+#: src/views/home/IndexView.vue:344
+msgid "Restart Panel"
+msgstr "重啟面板"
+
+#: src/views/home/IndexView.vue:348
+msgid "Restart Server"
+msgstr "重啟伺服器"
+
+#: src/views/home/IndexView.vue:362
+msgid "Are you sure you want to restart the server? This will disconnect all connections."
+msgstr "您確定要重啟伺服器嗎?這將斷開所有連線。"
+
#: src/views/home/IndexView.vue:344
msgid "Current version is the latest"
msgstr "當前版本是最新版本"
diff --git a/web/src/views/home/IndexView.vue b/web/src/views/home/IndexView.vue
index 9e017822..ec802da0 100644
--- a/web/src/views/home/IndexView.vue
+++ b/web/src/views/home/IndexView.vue
@@ -13,7 +13,7 @@ import {
} from 'echarts/components'
import { use } from 'echarts/core'
import { CanvasRenderer } from 'echarts/renderers'
-import { NButton, NPopconfirm, useThemeVars } from 'naive-ui'
+import { NButton, NDropdown, useThemeVars } from 'naive-ui'
import { useGettext } from 'vue3-gettext'
import draggable from 'vuedraggable'
@@ -336,6 +336,33 @@ const handleRestartPanel = () => {
})
}
+const showRestartServerConfirm = ref(false)
+
+const handleRestartServer = () => {
+ clearInterval(homeInterval)
+ window.$message.loading($gettext('Server restarting...'))
+ useRequest(home.restartServer())
+}
+
+const restartOptions = computed(() => [
+ {
+ label: $gettext('Restart Panel'),
+ key: 'panel'
+ },
+ {
+ label: $gettext('Restart Server'),
+ key: 'server'
+ }
+])
+
+const handleRestartSelect = (key: string) => {
+ if (key === 'panel') {
+ handleRestartPanel()
+ } else if (key === 'server') {
+ showRestartServerConfirm.value = true
+ }
+}
+
const handleUpdate = () => {
useRequest(home.checkUpdate()).onSuccess(({ data }) => {
if (data.update) {
@@ -470,12 +497,9 @@ if (import.meta.hot) {
{{ $gettext('Sponsor Support') }}
-
-
- {{ $gettext('Restart') }}
-
- {{ $gettext('Are you sure you want to restart the panel?') }}
-
+
+ {{ $gettext('Restart') }}
+
{{ $gettext('Update') }}
@@ -895,6 +919,18 @@ if (import.meta.hot) {
+
+
+