Refactor admin config to use centralized config package

- Import and use internal/config.Load() in telesrv-admin instead of manual env parsing
- Remove envOr() helper function (now consolidated in config package)
- Add comprehensive .env.example documentation for Admin API/UI settings including:
  - TELESRV_ADMIN_API_TOKEN
  - TELESRV_ADMIN_UI_PASSWORD and TELESRV_ADMIN_UI_TOKEN
  - TELESRV_ADMIN_SESSION_KEY with security guidance
  - Optional address configuration parameters
- Improve config validation error handling
This commit is contained in:
梦渊 2026-07-04 13:05:37 +08:00
parent b7269b135f
commit 6c3707e987
2 changed files with 49 additions and 24 deletions

View file

@ -15,6 +15,8 @@ import (
"time"
"github.com/jackc/pgx/v5/pgxpool"
"telesrv/internal/config"
)
func main() {
@ -69,28 +71,39 @@ type uiConfig struct {
SessionKey []byte
}
// loadConfig 通过 internal/config.Load() 加载 .env 配置文件与环境变量,
// 并转换为 telesrv-admin 需要的 uiConfig。环境变量优先级高于 .env 文件。
func loadConfig() (uiConfig, error) {
cfg := uiConfig{
Addr: envOr("TELESRV_ADMIN_UI_ADDR", "127.0.0.1:2400"),
PostgresDSN: envOr("TELESRV_POSTGRES_DSN", "postgres://telesrv:telesrv@127.0.0.1:5432/telesrv?sslmode=disable"),
AdminAPIURL: adminAPIURL(envOr("TELESRV_ADMIN_API_ADDR", "127.0.0.1:2399")),
AdminAPIToken: os.Getenv("TELESRV_ADMIN_API_TOKEN"),
Password: os.Getenv("TELESRV_ADMIN_UI_PASSWORD"),
Token: os.Getenv("TELESRV_ADMIN_UI_TOKEN"),
appCfg, err := config.Load()
if err != nil {
return uiConfig{}, fmt.Errorf("load config: %w", err)
}
if cfg.Password == "" && cfg.Token == "" {
return cfg, fmt.Errorf("TELESRV_ADMIN_UI_PASSWORD or TELESRV_ADMIN_UI_TOKEN is required")
adminAPIAddr := appCfg.AdminAPIAddr
if strings.TrimSpace(adminAPIAddr) == "" {
adminAPIAddr = "127.0.0.1:2399"
}
if strings.TrimSpace(cfg.AdminAPIToken) == "" {
return cfg, fmt.Errorf("TELESRV_ADMIN_API_TOKEN is required for admin write actions")
if appCfg.AdminUIPassword == "" && appCfg.AdminUIToken == "" {
return uiConfig{}, fmt.Errorf("TELESRV_ADMIN_UI_PASSWORD or TELESRV_ADMIN_UI_TOKEN is required")
}
rawKey := os.Getenv("TELESRV_ADMIN_SESSION_KEY")
if rawKey == "" {
return cfg, fmt.Errorf("TELESRV_ADMIN_SESSION_KEY is required")
if strings.TrimSpace(appCfg.AdminAPIToken) == "" {
return uiConfig{}, fmt.Errorf("TELESRV_ADMIN_API_TOKEN is required for admin write actions")
}
sum := sha256.Sum256([]byte(rawKey))
cfg.SessionKey = sum[:]
return cfg, nil
if appCfg.AdminSessionKey == "" {
return uiConfig{}, fmt.Errorf("TELESRV_ADMIN_SESSION_KEY is required")
}
sum := sha256.Sum256([]byte(appCfg.AdminSessionKey))
return uiConfig{
Addr: appCfg.AdminUIAddr,
PostgresDSN: appCfg.PostgresDSN,
AdminAPIURL: adminAPIURL(adminAPIAddr),
AdminAPIToken: appCfg.AdminAPIToken,
Password: appCfg.AdminUIPassword,
Token: appCfg.AdminUIToken,
SessionKey: sum[:],
}, nil
}
func adminAPIURL(addr string) string {
@ -104,13 +117,6 @@ func adminAPIURL(addr string) string {
return "http://" + addr
}
func envOr(key, def string) string {
if v := os.Getenv(key); v != "" {
return v
}
return def
}
func newCommandID(prefix string) string {
var b [6]byte
_, _ = rand.Read(b[:])