feat: implement server self-upgrade functionality

- Added update service to fetch the latest server release from GitHub.
- Implemented server upgrade scheduling and execution logic.
- Created platform-specific restart mechanisms for Unix and Windows.
- Introduced API endpoints for fetching the latest release and triggering upgrades.
- Developed UI components for version upgrade modal, including loading and error states.
- Updated documentation to reflect new upgrade features and instructions.
- Refactored settings types to streamline interface definitions.
This commit is contained in:
ryan
2026-03-11 22:05:42 +08:00
parent c0ec718563
commit 6140ed1718
22 changed files with 3332 additions and 2392 deletions
+1
View File
@@ -59,6 +59,7 @@ func SetApiRouter(router *gin.Engine) {
updateRoute.Use(middleware.RootAuth(), middleware.NoTokenAuth())
{
updateRoute.GET("/latest-release", controller.GetLatestRelease)
updateRoute.POST("/upgrade", controller.UpgradeServer)
}
fileRoute := apiRouter.Group("/file")
fileRoute.Use(middleware.AdminAuth())
+7 -4
View File
@@ -2,8 +2,8 @@ package router_test
import (
"atsflare/common"
"atsflare/controller"
"atsflare/router"
"atsflare/service"
"bytes"
"encoding/json"
"io"
@@ -28,8 +28,8 @@ func TestLatestReleaseProxy(t *testing.T) {
common.RedisEnabled = false
setupTestDB(t)
originalClient := controller.UpdateHTTPClientForTest()
controller.SetUpdateHTTPClientForTest(&http.Client{
originalClient := service.UpdateHTTPClientForTest()
service.SetUpdateHTTPClientForTest(&http.Client{
Transport: roundTripFunc(func(req *http.Request) (*http.Response, error) {
if req.URL.String() != "https://api.github.com/repos/Rain-kl/ATSFlare/releases/latest" {
t.Fatalf("unexpected request url: %s", req.URL.String())
@@ -53,7 +53,7 @@ func TestLatestReleaseProxy(t *testing.T) {
}),
})
t.Cleanup(func() {
controller.SetUpdateHTTPClientForTest(originalClient)
service.SetUpdateHTTPClientForTest(originalClient)
})
engine := gin.New()
@@ -101,4 +101,7 @@ func TestLatestReleaseProxy(t *testing.T) {
if data["tag_name"] != "v1.2.3" {
t.Fatalf("unexpected tag_name: %#v", data["tag_name"])
}
if data["current_version"] != common.Version {
t.Fatalf("unexpected current_version: %#v", data["current_version"])
}
}