initial commit
Some checks failed
CI / Go — node-agent tests (push) Has been cancelled
CI / Go — edge-gateway build (push) Has been cancelled
CI / Node — lint, typecheck, test, build (push) Has been cancelled

This commit is contained in:
smueller
2026-06-26 10:45:08 +02:00
commit e37ea87b35
118 changed files with 7726 additions and 0 deletions

View File

@@ -0,0 +1,88 @@
package config
import (
"fmt"
"os"
"strconv"
"time"
)
// Config holds runtime configuration loaded from environment variables.
type Config struct {
AppName string
NodeID string
ControlPlaneURL string
NodeToken string
HealthListenAddr string
HeartbeatInterval time.Duration
ReconnectBackoff time.Duration
DataDir string
DockerSocket string
LogLevel string
TLSCertFile string
TLSKeyFile string
TLSCAFile string
TLSSkipVerify bool
ShutdownGracePeriod time.Duration
}
// Load reads configuration from environment variables with sensible defaults for development.
func Load() (*Config, error) {
cfg := &Config{
AppName: envOrDefault("APP_NAME", "HexaHost GameCloud"),
NodeID: os.Getenv("NODE_ID"),
ControlPlaneURL: os.Getenv("NODE_AGENT_PUBLIC_URL"),
NodeToken: os.Getenv("NODE_TOKEN"),
HealthListenAddr: envOrDefault("NODE_AGENT_HEALTH_ADDR", ":9100"),
HeartbeatInterval: durationFromEnv("NODE_HEARTBEAT_INTERVAL", 10*time.Second),
ReconnectBackoff: durationFromEnv("NODE_RECONNECT_BACKOFF", 5*time.Second),
DataDir: envOrDefault("NODE_DATA_DIR", "/var/lib/hexahost-gamecloud"),
DockerSocket: envOrDefault("DOCKER_HOST", "unix:///var/run/docker.sock"),
LogLevel: envOrDefault("LOG_LEVEL", "info"),
TLSCertFile: os.Getenv("NODE_TLS_CERT"),
TLSKeyFile: os.Getenv("NODE_TLS_KEY"),
TLSCAFile: os.Getenv("NODE_CA_CERT"),
TLSSkipVerify: boolFromEnv("NODE_TLS_SKIP_VERIFY", false),
ShutdownGracePeriod: durationFromEnv("NODE_SHUTDOWN_GRACE", 30*time.Second),
}
if cfg.NodeID == "" {
return nil, fmt.Errorf("NODE_ID is required")
}
if cfg.ControlPlaneURL == "" {
return nil, fmt.Errorf("NODE_AGENT_PUBLIC_URL is required")
}
return cfg, nil
}
func envOrDefault(key, fallback string) string {
if v := os.Getenv(key); v != "" {
return v
}
return fallback
}
func durationFromEnv(key string, fallback time.Duration) time.Duration {
raw := os.Getenv(key)
if raw == "" {
return fallback
}
d, err := time.ParseDuration(raw)
if err != nil {
return fallback
}
return d
}
func boolFromEnv(key string, fallback bool) bool {
raw := os.Getenv(key)
if raw == "" {
return fallback
}
v, err := strconv.ParseBool(raw)
if err != nil {
return fallback
}
return v
}