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:
parent
b7269b135f
commit
6c3707e987
2 changed files with 49 additions and 24 deletions
19
.env.example
19
.env.example
|
|
@ -6,6 +6,25 @@ TELESRV_ADVERTISE_IP=127.0.0.1
|
||||||
TELESRV_DC=2
|
TELESRV_DC=2
|
||||||
TELESRV_DEV_AUTH_CODE=12345
|
TELESRV_DEV_AUTH_CODE=12345
|
||||||
|
|
||||||
|
# Admin API / Admin UI 配置
|
||||||
|
#
|
||||||
|
# TELESRV_ADMIN_API_TOKEN 是主服务 (cmd/telesrv) 暴露 Admin REST API 的鉴权 token,
|
||||||
|
# 也是 Admin UI (cmd/telesrv-admin) 调用 Admin API 时使用的凭证。
|
||||||
|
# 重要:主服务与 Admin UI 必须使用完全相同的 TELESRV_ADMIN_API_TOKEN,否则管理后台无法执行写操作。
|
||||||
|
TELESRV_ADMIN_API_TOKEN=change-me-to-a-strong-random-token
|
||||||
|
|
||||||
|
# TELESRV_ADMIN_UI_PASSWORD 是登录管理后台的密码;
|
||||||
|
# 也可改用 TELESRV_ADMIN_UI_TOKEN,二者至少填一个。
|
||||||
|
TELESRV_ADMIN_UI_PASSWORD=abc123456
|
||||||
|
|
||||||
|
# TELESRV_ADMIN_SESSION_KEY 用于加密 Admin UI 的登录 session cookie。
|
||||||
|
# 生产环境请使用至少 32 字节的强随机字符串,修改后会导致已登录会话失效。
|
||||||
|
TELESRV_ADMIN_SESSION_KEY=change-me-to-a-strong-random-key-at-least-32-chars
|
||||||
|
|
||||||
|
# 以下两项为可选,默认值通常无需修改:
|
||||||
|
# TELESRV_ADMIN_API_ADDR=127.0.0.1:2399 # 主服务 Admin API 监听地址
|
||||||
|
# TELESRV_ADMIN_UI_ADDR=127.0.0.1:2400 # Admin UI 监听地址
|
||||||
|
|
||||||
TELESRV_POSTGRES_DSN=postgres://telesrv:telesrv@127.0.0.1:5432/telesrv?sslmode=disable
|
TELESRV_POSTGRES_DSN=postgres://telesrv:telesrv@127.0.0.1:5432/telesrv?sslmode=disable
|
||||||
TELESRV_REDIS_ADDR=127.0.0.1:6399
|
TELESRV_REDIS_ADDR=127.0.0.1:6399
|
||||||
TELESRV_REDIS_PASSWORD=
|
TELESRV_REDIS_PASSWORD=
|
||||||
|
|
|
||||||
|
|
@ -15,6 +15,8 @@ import (
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/jackc/pgx/v5/pgxpool"
|
"github.com/jackc/pgx/v5/pgxpool"
|
||||||
|
|
||||||
|
"telesrv/internal/config"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
|
|
@ -69,28 +71,39 @@ type uiConfig struct {
|
||||||
SessionKey []byte
|
SessionKey []byte
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// loadConfig 通过 internal/config.Load() 加载 .env 配置文件与环境变量,
|
||||||
|
// 并转换为 telesrv-admin 需要的 uiConfig。环境变量优先级高于 .env 文件。
|
||||||
func loadConfig() (uiConfig, error) {
|
func loadConfig() (uiConfig, error) {
|
||||||
cfg := uiConfig{
|
appCfg, err := config.Load()
|
||||||
Addr: envOr("TELESRV_ADMIN_UI_ADDR", "127.0.0.1:2400"),
|
if err != nil {
|
||||||
PostgresDSN: envOr("TELESRV_POSTGRES_DSN", "postgres://telesrv:telesrv@127.0.0.1:5432/telesrv?sslmode=disable"),
|
return uiConfig{}, fmt.Errorf("load config: %w", err)
|
||||||
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"),
|
|
||||||
}
|
}
|
||||||
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 strings.TrimSpace(appCfg.AdminAPIToken) == "" {
|
||||||
if rawKey == "" {
|
return uiConfig{}, fmt.Errorf("TELESRV_ADMIN_API_TOKEN is required for admin write actions")
|
||||||
return cfg, fmt.Errorf("TELESRV_ADMIN_SESSION_KEY is required")
|
|
||||||
}
|
}
|
||||||
sum := sha256.Sum256([]byte(rawKey))
|
if appCfg.AdminSessionKey == "" {
|
||||||
cfg.SessionKey = sum[:]
|
return uiConfig{}, fmt.Errorf("TELESRV_ADMIN_SESSION_KEY is required")
|
||||||
return cfg, nil
|
}
|
||||||
|
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 {
|
func adminAPIURL(addr string) string {
|
||||||
|
|
@ -104,13 +117,6 @@ func adminAPIURL(addr string) string {
|
||||||
return "http://" + addr
|
return "http://" + addr
|
||||||
}
|
}
|
||||||
|
|
||||||
func envOr(key, def string) string {
|
|
||||||
if v := os.Getenv(key); v != "" {
|
|
||||||
return v
|
|
||||||
}
|
|
||||||
return def
|
|
||||||
}
|
|
||||||
|
|
||||||
func newCommandID(prefix string) string {
|
func newCommandID(prefix string) string {
|
||||||
var b [6]byte
|
var b [6]byte
|
||||||
_, _ = rand.Read(b[:])
|
_, _ = rand.Read(b[:])
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue