03cbe283df
Rework the VHS demo so the README screenshots actually entice a download. Demo data / tooling: - seed.yaml: real, reachable service URLs (detail now shows nextcloud.com, not example.com); Auth Portal -> non-resolving home.arpa host so it reads as a believable, reliably-DOWN monitor - backfill: transient outages for Nextcloud/Jellyfin/Immich aligned with their state changes (uptime % now matches); log timestamps derived from now so the Logs view reads chronologically; real SSL warning; three probe nodes across regions; seeded alert send health - demo.tape: shorter warm-up, added Nodes + theme captures, ordered so every shot stays inside the 60s node-freshness window (consistent probe count) - vhs/crop: new tool to trim the empty terminal border around each screenshot - setup.sh: build backfill up front for deterministic timing; UPTOP_DEMO=1 Supporting code: - persist alert send health (new alert_health table, load on startup, best-effort save on send) so health/last-sent survive restarts - latency Min/Avg/Max ignore failed checks (no more "Min 0ms") - correct "probe"/"probes" pluralization - stable status dot instead of an animated spinner under UPTOP_DEMO
111 lines
2.2 KiB
Go
111 lines
2.2 KiB
Go
package models
|
|
|
|
import "time"
|
|
|
|
type Site struct {
|
|
ID int
|
|
Name string
|
|
URL string
|
|
Type string // "http", "push", "ping", "port", "dns", "group"
|
|
Token string
|
|
Interval int
|
|
AlertID int
|
|
CheckSSL bool
|
|
ExpiryThreshold int
|
|
MaxRetries int
|
|
|
|
Hostname string
|
|
Port int
|
|
Timeout int
|
|
Method string
|
|
Description string
|
|
ParentID int
|
|
AcceptedCodes string
|
|
DNSResolveType string
|
|
DNSServer string
|
|
IgnoreTLS bool
|
|
Paused bool
|
|
Regions string
|
|
|
|
FailureCount int
|
|
Status string
|
|
StatusCode int
|
|
Latency time.Duration
|
|
CertExpiry time.Time
|
|
HasSSL bool
|
|
LastCheck time.Time
|
|
SentSSLWarning bool
|
|
LastError string
|
|
StatusChangedAt time.Time
|
|
LastSuccessAt time.Time
|
|
}
|
|
|
|
type StateChange struct {
|
|
ID int
|
|
SiteID int
|
|
FromStatus string
|
|
ToStatus string
|
|
ErrorReason string
|
|
ChangedAt time.Time
|
|
}
|
|
|
|
type AlertConfig struct {
|
|
ID int
|
|
Name string
|
|
Type string
|
|
Settings map[string]string
|
|
}
|
|
|
|
type User struct {
|
|
ID int
|
|
Username string
|
|
PublicKey string
|
|
Role string
|
|
}
|
|
|
|
type CheckRecord struct {
|
|
SiteID int
|
|
NodeID string
|
|
LatencyNs int64
|
|
IsUp bool
|
|
CheckedAt time.Time
|
|
}
|
|
|
|
type ProbeNode struct {
|
|
ID string
|
|
Name string
|
|
Region string
|
|
LastSeen time.Time
|
|
Version string
|
|
}
|
|
|
|
// AlertHealthRecord is the persisted send health of an alert channel. It lets the
|
|
// "last sent" / health indicators survive restarts instead of resetting to "never".
|
|
type AlertHealthRecord struct {
|
|
AlertID int
|
|
LastSendAt time.Time
|
|
LastSendOK bool
|
|
LastError string
|
|
SendCount int
|
|
FailCount int
|
|
}
|
|
|
|
type MaintenanceWindow struct {
|
|
ID int
|
|
MonitorID int
|
|
Title string
|
|
Description string
|
|
Type string // "maintenance" or "incident"
|
|
StartTime time.Time
|
|
EndTime time.Time // zero = ongoing
|
|
CreatedBy string
|
|
CreatedAt time.Time
|
|
}
|
|
|
|
type Backup struct {
|
|
Sites []Site `json:"sites"`
|
|
Alerts []AlertConfig `json:"alerts"`
|
|
Users []User `json:"users"`
|
|
MaintenanceWindows []MaintenanceWindow `json:"maintenance_windows,omitempty"`
|
|
}
|