feat(controller): Hub asset syncer for logos and screenshots
Add internal/assets package that downloads and caches app assets from Hub API with SHA-256 change detection. Assets resolve from synced cache first, falling back to baked-in directory. Daily sync schedule + on-demand POST /api/assets/sync endpoint. Config: assets.sync_enabled + assets.sync_schedule (default 05:00) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -16,6 +16,7 @@ import (
|
||||
"strings"
|
||||
|
||||
"gitea.dooplex.hu/admin/felhom-controller/internal/api"
|
||||
"gitea.dooplex.hu/admin/felhom-controller/internal/assets"
|
||||
"gitea.dooplex.hu/admin/felhom-controller/internal/backup"
|
||||
"gitea.dooplex.hu/admin/felhom-controller/internal/config"
|
||||
"gitea.dooplex.hu/admin/felhom-controller/internal/metrics"
|
||||
@@ -425,6 +426,23 @@ func main() {
|
||||
return storageWatchdog.Check(ctx)
|
||||
})
|
||||
|
||||
// --- Asset syncer (download from Hub) ---
|
||||
var assetsSyncer *assets.Syncer
|
||||
if cfg.Hub.Enabled && cfg.Assets.SyncEnabled && cfg.Hub.URL != "" && cfg.Hub.APIKey != "" {
|
||||
assetsDir := filepath.Join(cfg.Paths.DataDir, "assets")
|
||||
assetsSyncer = assets.New(cfg.Hub.URL, cfg.Hub.APIKey, assetsDir, "/usr/share/felhom/assets", logger)
|
||||
go func() {
|
||||
time.Sleep(10 * time.Second)
|
||||
if err := assetsSyncer.Sync(ctx); err != nil {
|
||||
logger.Printf("[WARN] Initial asset sync failed: %v", err)
|
||||
}
|
||||
}()
|
||||
sched.Daily("asset-sync", cfg.Assets.SyncSchedule, func(ctx context.Context) error {
|
||||
return assetsSyncer.Sync(ctx)
|
||||
})
|
||||
logger.Printf("[INFO] Asset sync enabled (daily at %s from Hub)", cfg.Assets.SyncSchedule)
|
||||
}
|
||||
|
||||
sched.Start(ctx)
|
||||
defer sched.Stop()
|
||||
|
||||
@@ -552,10 +570,16 @@ func main() {
|
||||
pushInfraBackup(cfg, sett, stackProv, hubPusher, logger)
|
||||
}
|
||||
}
|
||||
if assetsSyncer != nil {
|
||||
apiRouter.SetAssetsSyncer(assetsSyncer)
|
||||
}
|
||||
|
||||
// --- Initialize web server ---
|
||||
webServer := web.NewServer(cfg, stackMgr, cpuCollector, backupMgr, crossDriveRunner, sched, sett, alertMgr, notifier, updater, logger, Version)
|
||||
webServer.SetStorageWatchdog(storageWatchdog)
|
||||
if assetsSyncer != nil {
|
||||
webServer.SetAssetsSyncer(assetsSyncer)
|
||||
}
|
||||
if hubPusher != nil {
|
||||
webServer.SetHubPushStatus(func() web.HubPushStatusData {
|
||||
s := hubPusher.GetStatus()
|
||||
|
||||
Reference in New Issue
Block a user