Skip to content

Commit 801d941

Browse files
committed
refactor: 重构服务器启动、路由加载的初始化
1 parent f8b4e90 commit 801d941

File tree

18 files changed

+166
-100
lines changed

18 files changed

+166
-100
lines changed

cmd/root.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package cmd
22

33
import (
44
"fmt"
5+
"log"
56
"os"
67

78
"github.com/gookit/event"
@@ -43,8 +44,11 @@ Made by Akizon77 with love.`,
4344
}
4445

4546
func Execute() {
46-
event.Trigger(eventType.ProcessStart, nil)
47-
defer event.Trigger(eventType.ProcessExit, nil)
47+
err, _ := event.Trigger(eventType.ProcessStart, event.M{})
48+
if err != nil {
49+
log.Fatalf("Something went wrong during process start: %v", err)
50+
os.Exit(1)
51+
}
4852
if err := RootCmd.Execute(); err != nil {
4953
fmt.Fprintln(os.Stderr, err)
5054
os.Exit(1)

cmd/server.go

Lines changed: 20 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import (
77
"net/http"
88
"os"
99
"os/signal"
10-
"strings"
1110
"syscall"
1211
"time"
1312

@@ -20,15 +19,11 @@ import (
2019
"github.com/komari-monitor/komari/internal/database/auditlog"
2120
"github.com/komari-monitor/komari/internal/database/dbcore"
2221
"github.com/komari-monitor/komari/internal/database/models"
23-
d_notification "github.com/komari-monitor/komari/internal/database/notification"
2422
"github.com/komari-monitor/komari/internal/database/records"
2523
"github.com/komari-monitor/komari/internal/database/tasks"
2624
"github.com/komari-monitor/komari/internal/eventType"
2725
logutil "github.com/komari-monitor/komari/internal/log"
28-
"github.com/komari-monitor/komari/internal/messageSender"
2926
"github.com/komari-monitor/komari/internal/patch"
30-
"github.com/komari-monitor/komari/internal/restore"
31-
"github.com/komari-monitor/komari/pkg/cloudflared"
3227
"github.com/komari-monitor/komari/server"
3328
"github.com/spf13/cobra"
3429
)
@@ -55,54 +50,44 @@ func RunServer() {
5550
if err := os.MkdirAll("./data/theme", os.ModePerm); err != nil {
5651
log.Fatalf("Failed to create theme directory: %v", err)
5752
}
58-
// 进行备份恢复
59-
if restore.NeedBackupRestore() {
60-
restore.RestoreBackup()
61-
}
62-
conf.Load()
63-
InitDatabase()
64-
patch.ApplyPatch()
6553

6654
if conf.Version != conf.Version_Development {
6755
gin.SetMode(gin.ReleaseMode)
6856
}
6957

70-
config, err := conf.GetWithV1Format()
71-
if err != nil {
72-
log.Fatal(err)
73-
}
74-
7558
r := gin.New()
7659
r.Use(logutil.GinLogger())
7760
r.Use(logutil.GinRecovery())
7861

79-
event.Trigger(eventType.ServerInitializeStart, event.M{"config": config, "engine": r})
62+
InitDatabase()
63+
patch.Apply()
64+
err, _ := event.Trigger(eventType.ServerInitializeStart, event.M{"engine": r})
65+
if err != nil {
66+
log.Fatalf("Something went wrong during ServerInitializeStart event: %v", err)
67+
os.Exit(1)
68+
}
8069

70+
config, err := conf.GetWithV1Format()
71+
if err != nil {
72+
log.Fatal(err)
73+
}
8174
go DoScheduledWork()
82-
go messageSender.Initialize()
8375

8476
server.StartNezhaGRPCServer(config.NezhaCompatListen)
8577

86-
// 初始化 cloudflared
87-
if strings.ToLower(GetEnv("KOMARI_ENABLE_CLOUDFLARED", "false")) == "true" {
88-
err := cloudflared.RunCloudflared() // 阻塞,确保cloudflared跑起来
89-
if err != nil {
90-
log.Fatalf("Failed to run cloudflared: %v", err)
91-
}
92-
}
93-
9478
server.Init(r)
9579

9680
srv := &http.Server{
9781
Addr: flags.Listen,
9882
Handler: r,
9983
}
100-
101-
event.Trigger(eventType.ServerInitializeDone, event.M{"config": config})
102-
10384
log.Printf("Starting server on %s ...", flags.Listen)
85+
event.Trigger(eventType.ServerInitializeDone, event.M{})
86+
ScheduledEventTasksInit()
87+
10488
if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
10589
OnFatal(err)
90+
event.Trigger(eventType.ProcessExit, event.M{})
10691
log.Fatalf("listen: %s\n", err)
10792
}
10893
quit := make(chan os.Signal, 1)
@@ -119,18 +104,6 @@ func RunServer() {
119104
}
120105

121106
func InitDatabase() {
122-
// // 打印数据库类型和连接信息
123-
// if flags.DatabaseType == "mysql" {
124-
// log.Printf("使用 MySQL 数据库连接: %s@%s:%s/%s",
125-
// flags.DatabaseUser, flags.DatabaseHost, flags.DatabasePort, flags.DatabaseName)
126-
// log.Printf("环境变量配置: [KOMARI_DB_TYPE=%s] [KOMARI_DB_HOST=%s] [KOMARI_DB_PORT=%s] [KOMARI_DB_USER=%s] [KOMARI_DB_NAME=%s]",
127-
// os.Getenv("KOMARI_DB_TYPE"), os.Getenv("KOMARI_DB_HOST"), os.Getenv("KOMARI_DB_PORT"),
128-
// os.Getenv("KOMARI_DB_USER"), os.Getenv("KOMARI_DB_NAME"))
129-
// } else {
130-
// log.Printf("使用 SQLite 数据库文件: %s", flags.DatabaseFile)
131-
// log.Printf("环境变量配置: [KOMARI_DB_TYPE=%s] [KOMARI_DB_FILE=%s]",
132-
// os.Getenv("KOMARI_DB_TYPE"), os.Getenv("KOMARI_DB_FILE"))
133-
// }
134107
var count int64 = 0
135108
if dbcore.GetDBInstance().Model(&models.User{}).Count(&count); count == 0 {
136109
user, passwd, err := accounts.CreateDefaultAdminAccount()
@@ -144,12 +117,10 @@ func InitDatabase() {
144117
// #region 定时任务
145118
func DoScheduledWork() {
146119
tasks.ReloadPingSchedule()
147-
d_notification.ReloadLoadNotificationSchedule()
148120

149121
//records.DeleteRecordBefore(time.Now().Add(-time.Hour * 24 * 30))
150122

151123
records.CompactRecord()
152-
ScheduledEventTasksInit()
153124

154125
event.On(eventType.SchedulerEvery30Minutes, event.ListenerFunc(func(e event.Event) error {
155126
cfg, err := conf.GetWithV1Format()
@@ -183,12 +154,10 @@ func DoScheduledWork() {
183154

184155
func OnShutdown() {
185156
auditlog.Log("", "", "server is shutting down", "info")
186-
cloudflared.Kill()
187157
}
188158

189159
func OnFatal(err error) {
190160
auditlog.Log("", "", "server encountered a fatal error: "+err.Error(), "error")
191-
cloudflared.Kill()
192161
}
193162

194163
func ScheduledEventTasksInit() {
@@ -198,22 +167,17 @@ func ScheduledEventTasksInit() {
198167
every1h := time.NewTicker(1 * time.Hour)
199168
every1d := time.NewTicker(24 * time.Hour)
200169
for {
201-
var err error = nil
202-
var e event.Event
203170
select {
204171
case <-every1m.C:
205-
err, e = event.Trigger(eventType.SchedulerEveryMinute, event.M{"interval": "1m"})
172+
event.Async(eventType.SchedulerEveryMinute, event.M{"interval": "1m"})
206173
case <-every5m.C:
207-
err, e = event.Trigger(eventType.SchedulerEvery5Minutes, event.M{"interval": "5m"})
174+
event.Async(eventType.SchedulerEvery5Minutes, event.M{"interval": "5m"})
208175
case <-every30m.C:
209-
err, e = event.Trigger(eventType.SchedulerEvery30Minutes, event.M{"interval": "30m"})
176+
event.Async(eventType.SchedulerEvery30Minutes, event.M{"interval": "30m"})
210177
case <-every1h.C:
211-
err, e = event.Trigger(eventType.SchedulerEveryHour, event.M{"interval": "1h"})
178+
event.Async(eventType.SchedulerEveryHour, event.M{"interval": "1h"})
212179
case <-every1d.C:
213-
err, e = event.Trigger(eventType.SchedulerEveryDay, event.M{"interval": "1d"})
214-
}
215-
if err != nil {
216-
slog.Warn("Scheduled task error:", "error", err, "event", e)
180+
event.Async(eventType.SchedulerEveryDay, event.M{"interval": "1d"})
217181
}
218182
}
219183
}

internal/all.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
// Import all internal packages to ensure their init() functions are executed
55
_ "github.com/komari-monitor/komari/internal/api_rpc"
66
_ "github.com/komari-monitor/komari/internal/client"
7+
_ "github.com/komari-monitor/komari/internal/cloudflared"
78
_ "github.com/komari-monitor/komari/internal/common"
89
_ "github.com/komari-monitor/komari/internal/conf"
910
_ "github.com/komari-monitor/komari/internal/database"
File renamed without changes.

pkg/cloudflared/cloudflared_test.go renamed to internal/cloudflared/cloudflared_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import (
55
"testing"
66
"time"
77

8-
"github.com/komari-monitor/komari/pkg/cloudflared"
8+
"github.com/komari-monitor/komari/internal/cloudflared"
99
)
1010

1111
func TestRunCloudflared(t *testing.T) {

internal/cloudflared/init.go

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package cloudflared
2+
3+
import (
4+
"fmt"
5+
"os"
6+
"strings"
7+
8+
"github.com/gookit/event"
9+
"github.com/komari-monitor/komari/internal/eventType"
10+
)
11+
12+
func init() {
13+
event.On(eventType.ServerInitializeStart, event.ListenerFunc(func(e event.Event) error {
14+
if strings.ToLower(strings.ToLower(os.Getenv("KOMARI_ENABLE_CLOUDFLARED"))) == "true" {
15+
err := RunCloudflared()
16+
if err != nil {
17+
// Error in ServerInitializeStart will cause the process to exit
18+
return fmt.Errorf("failed to run cloudflared: %v", err)
19+
}
20+
}
21+
return nil
22+
}))
23+
24+
event.On(eventType.ProcessExit, event.ListenerFunc(func(e event.Event) error {
25+
Kill()
26+
return nil
27+
}))
28+
}

internal/conf/config.go

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -97,19 +97,6 @@ func SaveFull(cst Config) error {
9797
return Override(cst)
9898
}
9999

100-
func Load() (*Config, error) {
101-
b, err := os.ReadFile(flags.ConfigFile)
102-
if err != nil {
103-
return nil, err
104-
}
105-
cst := &Config{}
106-
if err := json.Unmarshal(b, cst); err != nil {
107-
return nil, err
108-
}
109-
Conf = cst
110-
return cst, nil
111-
}
112-
113100
// GetWithV1Format 以 v1 API 格式获取配置对象,使用 Conf 直接获取对象引用
114101
func GetWithV1Format() (V1Struct, error) {
115102
return Conf.ToV1Format(), nil

internal/conf/init.go

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package conf
2+
3+
import (
4+
"encoding/json"
5+
"os"
6+
7+
"github.com/gookit/event"
8+
"github.com/komari-monitor/komari/cmd/flags"
9+
"github.com/komari-monitor/komari/internal/eventType"
10+
)
11+
12+
func Init() {
13+
14+
b, err := os.ReadFile(flags.ConfigFile)
15+
if err != nil {
16+
panic(err)
17+
}
18+
cst := &Config{}
19+
if err := json.Unmarshal(b, cst); err != nil {
20+
panic(err)
21+
}
22+
Conf = cst
23+
event.Trigger(eventType.ConfigUpdated, event.M{
24+
"old": Config{},
25+
"new": *Conf,
26+
})
27+
}
28+
29+
func init() {
30+
Conf = &Config{}
31+
event.On(eventType.ProcessStart, event.ListenerFunc(func(e event.Event) error {
32+
Init()
33+
return nil
34+
}))
35+
}

internal/database/dbcore/dbcore.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,10 @@ import (
55
"log"
66
"sync"
77

8+
"github.com/gookit/event"
89
"github.com/komari-monitor/komari/cmd/flags"
910
"github.com/komari-monitor/komari/internal/database/models"
11+
"github.com/komari-monitor/komari/internal/eventType"
1012
logutil "github.com/komari-monitor/komari/internal/log"
1113
"gorm.io/driver/mysql"
1214
"gorm.io/driver/sqlite"
@@ -106,3 +108,10 @@ func GetDBInstance() *gorm.DB {
106108
})
107109
return instance
108110
}
111+
112+
func init() {
113+
event.On(eventType.SchedulerEvery5Minutes, event.ListenerFunc(func(e event.Event) error {
114+
instance.Exec("PRAGMA wal_checkpoint(TRUNCATE);")
115+
return nil
116+
}))
117+
}

internal/database/tasks/ping.go

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -84,13 +84,9 @@ func DeleteAllPingRecords() error {
8484
}
8585
return result.Error
8686
}
87+
8788
func ReloadPingSchedule() error {
88-
db := dbcore.GetDBInstance()
89-
var pingTasks []models.PingTask
90-
if err := db.Find(&pingTasks).Error; err != nil {
91-
return err
92-
}
93-
return pingSchedule.ReloadPingSchedule(pingTasks)
89+
return pingSchedule.ReloadPingSchedule()
9490
}
9591

9692
func GetPingRecords(uuid string, taskId int, start, end time.Time) ([]models.PingRecord, error) {

0 commit comments

Comments
 (0)