add global config support

This commit is contained in:
wjqserver 2025-06-30 15:31:14 +08:00
parent cd1e1a42f3
commit 34d553a890
23 changed files with 1682 additions and 343 deletions

19
gen/default.go Normal file
View file

@ -0,0 +1,19 @@
package gen
var (
DefaultGlobalConfig = CaddyGlobalConfig{
Debug: false,
PortsConfig: CaddyGlobalPortsConfig{
AdminPort: "localhost:2019",
HTTPPort: 80,
HTTPSPort: 443,
},
Metrics: true,
LogConfig: CaddyGlobalLogConfig{
Level: "INFO",
RotateSize: "10MB",
RotateKeep: "10",
RotateKeepForTime: "24h",
},
}
)

View file

@ -87,27 +87,6 @@ func Add80SiteConfig(cfg *config.Config, cdb *db.ConfigDB) error {
return err
}
/*
originConfig := db.CaddyfileConfig{
Domain: ":80",
TmplType: "file_server",
FileServer: db.FileServerConfig{
FileDirPath: cfg.Server.CaddyDir + "pages/demo",
EnableBrowser: false,
},
Log: db.LogConfig{
EnableLog: true,
LogDomain: ":80",
},
ErrorPage: db.ErrorPageConfig{
EnableErrorPage: true,
},
Encode: db.EncodeConfig{
EnableEncode: true,
},
}
*/
originGobData, err := EncodeGobConfig(siteConfig)
if err != nil {
return err
@ -150,3 +129,52 @@ func Add80SiteConfig(cfg *config.Config, cdb *db.ConfigDB) error {
return nil
}
// 读入全局配置模板
func ReadGlobalTmpl(dir string) ([]byte, error) {
// 读取目录下的caddyfile文件
content, err := os.ReadFile(filepath.Join(dir, "gtmpl", "caddyfile"))
if err != nil {
return nil, err
}
fmt.Printf("Read global template: %s\n", "caddyfile")
return content, nil
}
func SetGlobalConfig(cfg *config.Config, cdb *db.ConfigDB) error {
var config = DefaultGlobalConfig
paramsGob, err := EncodeGobConfig(config)
if err != nil {
return fmt.Errorf("encode gob config error: %w", err)
}
// 取出数据库内的tmpl
tmplContent, err := ReadGlobalTmpl(cfg.Server.CaddyDir)
if err != nil {
return fmt.Errorf("get global template error: %w", err)
}
renderedContent, err := RenderGlobalConfig(paramsGob, tmplContent)
if err != nil {
return fmt.Errorf("render global config error: %w", err)
}
//回写条目到数据库
err = cdb.SaveGlobalConfig(db.GlobalConfig{
Filename: "caddyfile",
Params: paramsGob,
TmplContent: tmplContent,
RenderedContent: renderedContent,
})
if err != nil {
return fmt.Errorf("save global config error: %w", err)
}
err = os.WriteFile(cfg.Server.CaddyDir+"Caddyfile", renderedContent, 0644)
if err != nil {
return fmt.Errorf("write Caddyfile error: %w", err)
}
return nil
}

View file

@ -53,6 +53,27 @@ func RenderConfig(site string, cdb *db.ConfigDB) error {
return nil
}
func RenderGlobalConfig(paramsGob []byte, tmplContent []byte) ([]byte, error) {
// 渲染caddyfile
var globalConfig CaddyGlobalConfig
err := DecodeGobConfig(paramsGob, &globalConfig)
if err != nil {
return nil, fmt.Errorf("failed to decode global config params: %w", err)
}
parsedTmpl, parseErr := template.New("caddyfile").Parse(string(tmplContent))
if parseErr != nil {
return nil, fmt.Errorf("failed to parse global caddyfile template: %w", parseErr)
}
var renderedContentBuilder bytes.Buffer
if err := parsedTmpl.Execute(&renderedContentBuilder, globalConfig); err != nil {
return nil, fmt.Errorf("failed to render global caddyfile template: %w", err)
}
return renderedContentBuilder.Bytes(), nil
}
// 把caddycfg内容转为GOB
func EncodeGobConfig(caddycfg any) ([]byte, error) {
var buf bytes.Buffer

View file

@ -55,11 +55,12 @@ type CaddyUniEncodeConfig struct {
}
type CaddyGlobalConfig struct {
Debug bool `json:"debug"`
PortsConfig CaddyGlobalPortsConfig `json:"ports_config"`
Metrics bool `json:"metrics"`
LogConfig CaddyGlobalLogConfig `json:"log_config"`
TLSConfig CaddyGlobalTLSConfig `json:"tls_config"`
Debug bool `json:"debug"`
PortsConfig CaddyGlobalPortsConfig `json:"ports_config"`
Metrics bool `json:"metrics"`
LogConfig CaddyGlobalLogConfig `json:"log_config"`
TLSConfig CaddyGlobalTLSConfig `json:"tls_config"`
TLSSnippetConfig CaddyGlobalSnippetTLSConfig `json:"tls_snippet_config"`
}
type CaddyGlobalPortsConfig struct {
@ -88,8 +89,18 @@ var LogLevelList = map[string]struct{}{
}
type CaddyGlobalTLSConfig struct {
Provider string `json:"provider"`
Token string `json:"token"`
EnableDNSChallenge bool `json:"enable_dns_challenge"`
Provider string `json:"provider"`
Token string `json:"token"`
ECHOuterSNI string `json:"echouter_sni"`
Email string `json:"email"`
}
type CaddyGlobalSnippetTLSConfig struct {
EnableSiteTLSSnippet bool `json:"enable_site_tls_snippet"`
Email string `json:"email"`
Provider string `json:"provider"`
Token string `json:"token"`
}
// 维护一个提供商列表