Files
scheduler-backend/pkg/config/config.go
2026-05-28 13:29:24 +08:00

130 lines
2.6 KiB
Go

package config
import (
"bufio"
"fmt"
"os"
"path/filepath"
"strconv"
"strings"
)
type Config struct {
HTTPPort int
WorkerHTTPPort int
MongoHost string
MongoPort int
MongoUsername string
MongoPassword string
MongoAuthSource string
BusinessMongoDatabase string
SchedulerMongoDatabase string
RedisAddr string
RedisUsername string
RedisPassword string
}
func Load() Config {
loadEnvFiles()
return Config{
HTTPPort: getenvInt("HTTP_PORT", 10090),
WorkerHTTPPort: getenvInt("WORKER_HTTP_PORT", 10091),
MongoHost: getenv("MONGO_HOST", "127.0.0.1"),
MongoPort: getenvInt("MONGO_PORT", 27017),
MongoUsername: getenv("MONGO_USERNAME", ""),
MongoPassword: getenv("MONGO_PASSWORD", ""),
MongoAuthSource: getenv("MONGO_AUTHSOURCE", "admin"),
BusinessMongoDatabase: getenv("MONGO_DATABASE", "openim_v3"),
SchedulerMongoDatabase: getenv("SCHEDULER_MONGO_DATABASE", "scheduler_center"),
RedisAddr: getenv("REDIS_ADDR", ""),
RedisUsername: getenv("REDIS_USERNAME", ""),
RedisPassword: getenv("REDIS_PASSWORD", ""),
}
}
func loadEnvFiles() {
loadEnvFile(".env")
if envName := currentEnvName(); envName != "" {
loadEnvFile(".env." + envName)
}
loadEnvFile(".env.local")
}
func currentEnvName() string {
for _, key := range []string{"APP_ENV", "GO_ENV", "ENV"} {
if value := strings.TrimSpace(os.Getenv(key)); value != "" {
return value
}
}
return ""
}
func loadEnvFile(name string) {
file, err := os.Open(filepath.Clean(name))
if err != nil {
return
}
defer file.Close()
scanner := bufio.NewScanner(file)
for scanner.Scan() {
line := strings.TrimSpace(scanner.Text())
if line == "" || strings.HasPrefix(line, "#") {
continue
}
key, value, ok := strings.Cut(line, "=")
if !ok {
continue
}
key = strings.TrimSpace(key)
value = strings.TrimSpace(value)
if key == "" {
continue
}
if _, exists := os.LookupEnv(key); exists {
continue
}
_ = os.Setenv(key, value)
}
}
func (c Config) MongoURI() string {
return fmt.Sprintf(
"mongodb://%s:%s@%s:%d/?authSource=%s",
c.MongoUsername,
c.MongoPassword,
c.MongoHost,
c.MongoPort,
c.MongoAuthSource,
)
}
func getenv(key, fallback string) string {
if value := os.Getenv(key); value != "" {
return value
}
return fallback
}
func getenvInt(key string, fallback int) int {
raw := getenv(key, "")
if raw == "" {
return fallback
}
value, err := strconv.Atoi(raw)
if err != nil {
return fallback
}
return value
}