feat: add controller update trigger + version checker (v0.1.8)
Hub now tracks controller_url from reports, periodically checks the Gitea registry for the latest controller image version, and shows a "Trigger Update" button on the customer detail page that proxies to the controller's self-update API endpoint using the shared API key. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
+29
-2
@@ -42,6 +42,12 @@ type Config struct {
|
||||
Alerting struct {
|
||||
StaleThreshold string `yaml:"stale_threshold"`
|
||||
} `yaml:"alerting"`
|
||||
Registry struct {
|
||||
Image string `yaml:"image"`
|
||||
Username string `yaml:"username"`
|
||||
Token string `yaml:"token"`
|
||||
CheckInterval string `yaml:"check_interval"`
|
||||
} `yaml:"registry"`
|
||||
Server struct {
|
||||
Listen string `yaml:"listen"`
|
||||
DataDir string `yaml:"data_dir"`
|
||||
@@ -84,7 +90,7 @@ func main() {
|
||||
|
||||
// Initialize handlers
|
||||
apiHandler := api.New(dataStore, cfg.API.ReportAPIKey, cfg.Notifications.ResendAPIKey, cfg.Notifications.FromEmail, logger)
|
||||
webServer := web.New(dataStore, cfg.Auth.PasswordHash, staleThreshold, logger)
|
||||
webServer := web.New(dataStore, cfg.Auth.PasswordHash, cfg.API.ReportAPIKey, staleThreshold, logger)
|
||||
|
||||
// Build HTTP mux
|
||||
mux := http.NewServeMux()
|
||||
@@ -114,10 +120,25 @@ func main() {
|
||||
IdleTimeout: 120 * time.Second,
|
||||
}
|
||||
|
||||
// Background: daily prune
|
||||
// Background: daily prune + version checker
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
|
||||
// Initialize version checker for controller image registry
|
||||
var versionChecker *web.VersionChecker
|
||||
if cfg.Registry.Username != "" && cfg.Registry.Token != "" {
|
||||
checkInterval, err := time.ParseDuration(cfg.Registry.CheckInterval)
|
||||
if err != nil {
|
||||
checkInterval = 6 * time.Hour
|
||||
}
|
||||
versionChecker = web.NewVersionChecker(cfg.Registry.Image, cfg.Registry.Username, cfg.Registry.Token, checkInterval, logger)
|
||||
go versionChecker.Run(ctx)
|
||||
logger.Printf("[INFO] Registry version checker started (every %s)", cfg.Registry.CheckInterval)
|
||||
} else {
|
||||
logger.Printf("[INFO] Registry version checker disabled (no credentials configured)")
|
||||
}
|
||||
webServer.SetVersionChecker(versionChecker)
|
||||
|
||||
if cfg.Retention.MaxDays > 0 {
|
||||
go pruneLoop(ctx, dataStore, cfg.Retention.MaxDays, logger)
|
||||
}
|
||||
@@ -184,6 +205,12 @@ func loadConfig(path string, logger *log.Logger) *Config {
|
||||
if cfg.Notifications.FromEmail == "" {
|
||||
cfg.Notifications.FromEmail = "monitoring@felhom.eu"
|
||||
}
|
||||
if cfg.Registry.Image == "" {
|
||||
cfg.Registry.Image = "gitea.dooplex.hu/admin/felhom-controller"
|
||||
}
|
||||
if cfg.Registry.CheckInterval == "" {
|
||||
cfg.Registry.CheckInterval = "6h"
|
||||
}
|
||||
|
||||
return cfg
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user