55 lines
1.3 KiB
Go
55 lines
1.3 KiB
Go
|
|
package config
|
||
|
|
|
||
|
|
import (
|
||
|
|
"log"
|
||
|
|
"os"
|
||
|
|
"strconv"
|
||
|
|
|
||
|
|
"github.com/joho/godotenv"
|
||
|
|
)
|
||
|
|
|
||
|
|
type Config struct {
|
||
|
|
ServerPort string
|
||
|
|
JWTSecret string
|
||
|
|
JWTExpiryHrs int
|
||
|
|
DatabaseURL string
|
||
|
|
ArtefactDir string
|
||
|
|
MaxConcurrent int
|
||
|
|
BandwidthBPS int
|
||
|
|
RateLimitRPS int
|
||
|
|
}
|
||
|
|
|
||
|
|
func Load() *Config {
|
||
|
|
// Load .env file if present (silently ignore if not found)
|
||
|
|
if err := godotenv.Load(); err != nil {
|
||
|
|
log.Println("[config] No .env file found, using system environment variables")
|
||
|
|
}
|
||
|
|
|
||
|
|
return &Config{
|
||
|
|
ServerPort: envOrDefault("SERVER_PORT", "8080"),
|
||
|
|
JWTSecret: envOrDefault("JWT_SECRET", "change-me-in-production"),
|
||
|
|
JWTExpiryHrs: envOrDefaultInt("JWT_EXPIRY_HRS", 24),
|
||
|
|
DatabaseURL: envOrDefault("DATABASE_URL", "postgres://postgres:postgres@localhost:5432/manifest?sslmode=disable"),
|
||
|
|
ArtefactDir: envOrDefault("ARTEFACT_DIR", "/var/ota/artefacts"),
|
||
|
|
MaxConcurrent: envOrDefaultInt("MAX_CONCURRENT_DOWNLOADS", 50),
|
||
|
|
BandwidthBPS: envOrDefaultInt("BANDWIDTH_BPS", 10*1024*1024/50),
|
||
|
|
RateLimitRPS: envOrDefaultInt("RATE_LIMIT_RPS", 100),
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func envOrDefault(key, def string) string {
|
||
|
|
if v := os.Getenv(key); v != "" {
|
||
|
|
return v
|
||
|
|
}
|
||
|
|
return def
|
||
|
|
}
|
||
|
|
|
||
|
|
func envOrDefaultInt(key string, def int) int {
|
||
|
|
if v := os.Getenv(key); v != "" {
|
||
|
|
if n, err := strconv.Atoi(v); err == nil {
|
||
|
|
return n
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return def
|
||
|
|
}
|