From 4337fb780999ecd7f26eb36263dc5f4eb8dfa709 Mon Sep 17 00:00:00 2001 From: h44z Date: Wed, 2 Sep 2026 22:28:51 +0200 Subject: [PATCH] feat(config): add `startup_timeout` option with context propagation (#739) (#750) --- cmd/wg-portal/main.go | 2 +- docs/documentation/configuration/overview.md | 7 +++++++ internal/app/app.go | 3 ++- internal/config/config.go | 2 ++ 4 files changed, 12 insertions(+), 2 deletions(-) diff --git a/cmd/wg-portal/main.go b/cmd/wg-portal/main.go index 9d50a1e..96d9dd8 100644 --- a/cmd/wg-portal/main.go +++ b/cmd/wg-portal/main.go @@ -113,7 +113,7 @@ func main() { internal.AssertNoError(err) webhookManager.StartBackgroundJobs(ctx) - err = app.Initialize(cfg, wireGuardManager, userManager) + err = app.Initialize(ctx, cfg, wireGuardManager, userManager) internal.AssertNoError(err) validatorManager := validator.New() diff --git a/docs/documentation/configuration/overview.md b/docs/documentation/configuration/overview.md index 5699e7d..2e3d5c9 100644 --- a/docs/documentation/configuration/overview.md +++ b/docs/documentation/configuration/overview.md @@ -45,6 +45,7 @@ advanced: route_table_offset: 20000 api_admin_only: true limit_additional_user_peers: 0 + startup_timeout: 5m database: debug: false @@ -363,6 +364,12 @@ Additional or more specialized configuration options for logging and interface c - **Environment Variable:** `WG_PORTAL_ADVANCED_LIMIT_ADDITIONAL_USER_PEERS` - **Description:** Limit additional peers a normal user can create. `0` means unlimited. +### `startup_timeout` +- **Default:** `5m` +- **Environment Variable:** `WG_PORTAL_ADVANCED_STARTUP_TIMEOUT` +- **Description:** Timeout for the application startup process. + Increase this value if you are using a MikroTik backend with many clients. + --- ## Database diff --git a/internal/app/app.go b/internal/app/app.go index c990dc4..5f6a965 100644 --- a/internal/app/app.go +++ b/internal/app/app.go @@ -35,6 +35,7 @@ type App struct { // Initialize creates a new App instance and initializes it. func Initialize( + ctx context.Context, cfg *config.Config, wg WireGuardManager, users UserManager, @@ -46,7 +47,7 @@ func Initialize( users: users, } - startupContext, cancel := context.WithTimeout(context.Background(), 5*time.Minute) + startupContext, cancel := context.WithTimeout(ctx, cfg.Advanced.StartupTimeout) defer cancel() // Switch to admin user context diff --git a/internal/config/config.go b/internal/config/config.go index fa3f1fc..ed7916a 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -48,6 +48,7 @@ type Config struct { RouteTableOffset int `yaml:"route_table_offset"` ApiAdminOnly bool `yaml:"api_admin_only"` // if true, only admin users can access the API LimitAdditionalUserPeers int `yaml:"limit_additional_user_peers"` + StartupTimeout time.Duration `yaml:"startup_timeout"` } `yaml:"advanced"` Backend Backend `yaml:"backend"` @@ -190,6 +191,7 @@ func defaultConfig() *Config { cfg.Advanced.RouteTableOffset = getEnvInt("WG_PORTAL_ADVANCED_ROUTE_TABLE_OFFSET", 20000) cfg.Advanced.ApiAdminOnly = getEnvBool("WG_PORTAL_ADVANCED_API_ADMIN_ONLY", true) cfg.Advanced.LimitAdditionalUserPeers = getEnvInt("WG_PORTAL_ADVANCED_LIMIT_ADDITIONAL_USER_PEERS", 0) + cfg.Advanced.StartupTimeout = getEnvDuration("WG_PORTAL_ADVANCED_STARTUP_TIMEOUT", 5*time.Minute) cfg.Statistics.UsePingChecks = getEnvBool("WG_PORTAL_STATISTICS_USE_PING_CHECKS", true) cfg.Statistics.PingCheckWorkers = getEnvInt("WG_PORTAL_STATISTICS_PING_CHECK_WORKERS", 10)