功能: - 前台导航: 分类Tab切换、实时搜索、健康状态指示、响应式适配 - 后台管理: 服务/分类CRUD、系统设置、登录认证(bcrypt) - 健康检查: 定时检测(5min)、独立检查URL、三态指示(在线/离线/未检测) - 云端备份: WebDAV上传/下载/恢复/删除、定时自动备份、本地备份管理 技术栈: Go + Gin + GORM + SQLite
63 lines
1.3 KiB
Go
63 lines
1.3 KiB
Go
package handlers
|
||
|
||
import (
|
||
"fmt"
|
||
"log"
|
||
"net/http"
|
||
"time"
|
||
"tonav-go/database"
|
||
"tonav-go/models"
|
||
)
|
||
|
||
// StartHealthCheck 启动异步健康检查(Goroutine)
|
||
func StartHealthCheck() {
|
||
go checkAllServices()
|
||
|
||
ticker := time.NewTicker(5 * time.Minute)
|
||
go func() {
|
||
for range ticker.C {
|
||
checkAllServices()
|
||
}
|
||
}()
|
||
}
|
||
|
||
func checkAllServices() {
|
||
var services []models.Service
|
||
database.DB.Find(&services)
|
||
|
||
client := http.Client{
|
||
Timeout: 10 * time.Second,
|
||
}
|
||
|
||
checked := 0
|
||
for _, s := range services {
|
||
// 未开启健康检查的,状态设为 unknown
|
||
if !s.HealthCheckEnabled {
|
||
if s.Status != "unknown" {
|
||
database.DB.Model(&s).Update("status", "unknown")
|
||
}
|
||
continue
|
||
}
|
||
|
||
// 开启了健康检查的,执行检测
|
||
checkURL := s.URL
|
||
if s.HealthCheckURL != "" {
|
||
checkURL = s.HealthCheckURL
|
||
}
|
||
|
||
resp, err := client.Get(checkURL)
|
||
status := "offline"
|
||
if err == nil && resp.StatusCode >= 200 && resp.StatusCode < 400 {
|
||
status = "online"
|
||
}
|
||
if resp != nil {
|
||
resp.Body.Close()
|
||
}
|
||
|
||
database.DB.Model(&s).Update("status", status)
|
||
checked++
|
||
}
|
||
log.Printf("[%s] 健康检查完成,共 %d 个服务,实际检测 %d 个", time.Now().Format("2006-01-02 15:04:05"), len(services), checked)
|
||
fmt.Printf("[%s] 健康检查完成\n", time.Now().Format("2006-01-02 15:04:05"))
|
||
}
|