feat: add resilient updates and access controls
Container-Image veröffentlichen / container (push) Has been cancelled

This commit is contained in:
admin committed 2026-08-28 14:02:07 +02:00
1 parent a000152423
commit f02ec9977c
41 files changed
+3277 -151

No files matched your search

+27 -1
View File
@@ -11,6 +11,7 @@ import (
"syscall"
"time"
"github.com/root-kdw12/hetzner-api-dyndns-records-webinterface/internal/appupdate"
"github.com/root-kdw12/hetzner-api-dyndns-records-webinterface/internal/config"
"github.com/root-kdw12/hetzner-api-dyndns-records-webinterface/internal/hetzner"
"github.com/root-kdw12/hetzner-api-dyndns-records-webinterface/internal/ipresolve"
@@ -53,6 +54,10 @@ func run(logger *slog.Logger) error {
}
provider := hetzner.New(cfg.HCloudBaseURL)
updater := scheduler.New(database, provider, ipresolve.New(), cipher, logger)
softwareUpdates, err := appupdate.New(database, cipher, cfg.UpdateAPIURL, cfg.UpdateAgentSock, cfg.UpdateInterval, logger)
if err != nil {
return err
}
settings, err := database.GetSettings(ctx)
if err != nil {
return err
@@ -65,7 +70,7 @@ func run(logger *slog.Logger) error {
logger.Info("removed AAAA records for disabled IPv6", "count", deleted)
}
}
serverUI, err := web.New(cfg, database, cipher, updater, logger)
serverUI, err := web.New(cfg, database, cipher, updater, softwareUpdates, logger)
if err != nil {
return err
}
@@ -73,6 +78,8 @@ func run(logger *slog.Logger) error {
appCtx, stop := signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGTERM)
defer stop()
updater.Start(appCtx)
softwareUpdates.Start(appCtx)
go pruneStore(appCtx, database, logger)
httpServer := &http.Server{
Addr: cfg.Address,
Handler: serverUI.Handler(),
@@ -80,6 +87,7 @@ func run(logger *slog.Logger) error {
ReadTimeout: 15 * time.Second,
WriteTimeout: 30 * time.Second,
IdleTimeout: 60 * time.Second,
MaxHeaderBytes: 16 << 10,
}
serverErrors := make(chan error, 1)
go func() {
@@ -100,6 +108,24 @@ func run(logger *slog.Logger) error {
}
}
func pruneStore(ctx context.Context, database *store.Store, logger *slog.Logger) {
ticker := time.NewTicker(24 * time.Hour)
defer ticker.Stop()
for {
select {
case <-ctx.Done():
return
case <-ticker.C:
pruneCtx, cancel := context.WithTimeout(ctx, 30*time.Second)
err := database.Prune(pruneCtx)
cancel()
if err != nil && !errors.Is(err, context.Canceled) {
logger.Warn("prune old local data", "error", err)
}
}
}
}
func healthcheck() int {
url := strings.TrimSpace(os.Getenv("APP_HEALTHCHECK_URL"))
if url == "" {