Add homelab service and system health monitoring

This commit is contained in:
Maxim
2026-08-01 12:02:09 +03:00
parent ad8972320d
commit 980f69cf8f
11 changed files with 674 additions and 33 deletions

View File

@@ -111,6 +111,55 @@ func sendAlertEmail(settings EmailSettings, alerts []Alert, test bool) error {
return client.Quit()
}
func sendRecoveryEmail(settings EmailSettings, items []RecoveryEvent) error {
alerts := make([]Alert, 0, len(items))
for _, v := range items {
alerts = append(alerts, Alert{ID: v.ID, Severity: "info", Source: v.Source, Title: "Восстановлено: " + v.Title, Message: "Проблема больше не наблюдается."})
}
return sendAlertEmail(settings, alerts, false)
}
func runImmediateNotifier(collect func() (dashboardMetrics, error), store *Store) {
ticker := time.NewTicker(5 * time.Second)
defer ticker.Stop()
for range ticker.C {
settings := store.EmailSettings(true)
if !settings.Enabled {
continue
}
if _, err := collect(); err != nil {
continue
}
urgent, err := store.PendingImmediateAlerts()
if err == nil && len(urgent) > 0 {
urgent = filterEmailAlerts(urgent, settings)
if len(urgent) > 0 && sendAlertEmail(settings, urgent, false) == nil {
_ = store.MarkAlertsEmailed(urgent)
}
}
recoveries, err := store.PendingRecoveries()
if err == nil && len(recoveries) > 0 {
var filtered []RecoveryEvent
for _, v := range recoveries {
if contains(settings.Sources, v.Source) {
filtered = append(filtered, v)
}
}
if len(filtered) > 0 && sendRecoveryEmail(settings, filtered) == nil {
_ = store.MarkRecoveriesEmailed(filtered)
}
}
}
}
func contains(items []string, want string) bool {
for _, v := range items {
if v == want {
return true
}
}
return false
}
func runEmailNotifier(collect func() (dashboardMetrics, error), store *Store) {
ticker := time.NewTicker(time.Minute)
defer ticker.Stop()