feat(config): 减少配置文件必填项, 配置文件改为从环境变量读取

This commit is contained in:
yokowu
2025-07-11 17:59:12 +08:00
parent feaa7e46f3
commit 0490ef58a4
6 changed files with 46 additions and 41 deletions

View File

@@ -19,7 +19,7 @@ import (
// @version 1.0
// @description MonkeyCode API
func main() {
s, err := newServer("/app/config")
s, err := newServer()
if err != nil {
panic(err)
}
@@ -58,7 +58,7 @@ func (s *Server) Name() string {
// Start implements service.Servicer.
func (s *Server) Start() error {
return s.web.Run(s.config.Server.Http.Host)
return s.web.Run(s.config.Server.Addr)
}
// Stop implements service.Servicer.

View File

@@ -33,7 +33,7 @@ type Server struct {
billingV1 *billingv1.BillingHandler
}
func newServer(dir string) (*Server, error) {
func newServer() (*Server, error) {
wire.Build(
wire.Struct(new(Server), "*"),
appSet,

View File

@@ -41,8 +41,8 @@ import (
// Injectors from wire.go:
func newServer(dir string) (*Server, error) {
configConfig, err := config.Init(dir)
func newServer() (*Server, error) {
configConfig, err := config.Init()
if err != nil {
return nil, err
}

View File

@@ -2,10 +2,10 @@ package config
import (
_ "embed"
"strings"
"github.com/spf13/viper"
"github.com/chaitin/MonkeyCode/backend/pkg/cvt"
"github.com/chaitin/MonkeyCode/backend/pkg/logger"
)
@@ -20,9 +20,7 @@ type Config struct {
BaseUrl string `mapstructure:"base_url"`
Server struct {
Http struct {
Host string `mapstructure:"host"`
} `mapstructure:"http"`
Addr string `mapstructure:"addr"`
} `mapstructure:"server"`
Admin struct {
@@ -58,9 +56,9 @@ type Config struct {
} `mapstructure:"llm_proxy"`
InitModel struct {
ModelName string `mapstructure:"model_name"`
ModelKey string `mapstructure:"model_key"`
ModelURL string `mapstructure:"model_url"`
Name string `mapstructure:"name"`
Key string `mapstructure:"key"`
URL string `mapstructure:"url"`
} `mapstructure:"init_model"`
Extension struct {
@@ -68,35 +66,42 @@ type Config struct {
} `mapstructure:"extension"`
}
func Init(dir string) (*Config, error) {
viper.SetConfigName("config")
viper.SetConfigType("yaml")
viper.AddConfigPath(dir)
if err := viper.ReadInConfig(); err != nil {
return nil, err
}
func Init() (*Config, error) {
v := viper.New()
v.AutomaticEnv()
v.SetEnvPrefix("MONKEYCODE")
v.SetEnvKeyReplacer(strings.NewReplacer(".", "_"))
v.SetDefault("debug", false)
v.SetDefault("logger.level", "info")
v.SetDefault("base_url", "")
v.SetDefault("server.addr", ":8888")
v.SetDefault("admin.user", "admin")
v.SetDefault("admin.password", "")
v.SetDefault("session.expire_day", 30)
v.SetDefault("database.master", "")
v.SetDefault("database.slave", "")
v.SetDefault("database.max_open_conns", 50)
v.SetDefault("database.max_idle_conns", 10)
v.SetDefault("database.conn_max_lifetime", 30)
v.SetDefault("redis.host", "monkeycode-redis")
v.SetDefault("redis.port", "6379")
v.SetDefault("redis.pass", "")
v.SetDefault("redis.db", 0)
v.SetDefault("redis.idle_conn", 20)
v.SetDefault("llm_proxy.timeout", "30s")
v.SetDefault("llm_proxy.keep_alive", "60s")
v.SetDefault("llm_proxy.client_pool_size", 100)
v.SetDefault("llm_proxy.request_log_path", "/app/request/logs")
v.SetDefault("init_model.name", "qwen2.5-coder-3b-instruct")
v.SetDefault("init_model.key", "")
v.SetDefault("init_model.url", "https://model-square.app.baizhi.cloud/v1")
v.SetDefault("extension.baseurl", "https://release.baizhi.cloud")
c := Config{}
if err := viper.Unmarshal(&c); err != nil {
if err := v.Unmarshal(&c); err != nil {
return nil, err
}
c = defaultValue(c)
return &c, nil
}
func defaultValue(c Config) Config {
c.Server.Http.Host = cvt.ZeroWithDefault(c.Server.Http.Host, ":8888")
c.Redis.IdleConn = cvt.ZeroWithDefault(c.Redis.IdleConn, 20)
c.Database.MaxOpenConns = cvt.ZeroWithDefault(c.Database.MaxOpenConns, 50)
c.Database.MaxIdleConns = cvt.ZeroWithDefault(c.Database.MaxIdleConns, 10)
c.Database.ConnMaxLifetime = cvt.ZeroWithDefault(c.Database.ConnMaxLifetime, 30)
c.Session.ExpireDay = cvt.ZeroWithDefault(c.Session.ExpireDay, 15)
c.LLMProxy.Timeout = cvt.ZeroWithDefault(c.LLMProxy.Timeout, "30s")
c.LLMProxy.KeepAlive = cvt.ZeroWithDefault(c.LLMProxy.KeepAlive, "60s")
c.LLMProxy.ClientPoolSize = cvt.ZeroWithDefault(c.LLMProxy.ClientPoolSize, 100)
c.LLMProxy.RequestLogPath = cvt.ZeroWithDefault(c.LLMProxy.RequestLogPath, "/app/request/logs")
return c
}

View File

@@ -109,8 +109,8 @@ func (m *ModelUsecase) Update(ctx context.Context, req *domain.UpdateModelReq) (
func (m *ModelUsecase) InitModel(ctx context.Context) error {
m.logger.With("init_model", m.cfg.InitModel).Debug("init model")
if m.cfg.InitModel.ModelName == "" {
if m.cfg.InitModel.Name == "" {
return nil
}
return m.repo.InitModel(ctx, m.cfg.InitModel.ModelName, m.cfg.InitModel.ModelKey, m.cfg.InitModel.ModelURL)
return m.repo.InitModel(ctx, m.cfg.InitModel.Name, m.cfg.InitModel.Key, m.cfg.InitModel.URL)
}

View File

@@ -42,8 +42,8 @@ func (s *Session) Save(c echo.Context, name, domain string, data any) (string, e
return "", err
}
if ok, _ := s.rdb.SetNX(context.Background(), id, string(b), expire).Result(); !ok {
return "", fmt.Errorf("failed to save session")
if ok, err := s.rdb.SetNX(context.Background(), id, string(b), expire).Result(); !ok || err != nil {
return "", fmt.Errorf("failed to save session: %w", err)
}
c.SetCookie(&http.Cookie{