mirror of
https://github.com/truewhile/MeBox.git
synced 2026-09-28 11:16:37 +08:00
b0fe40142a
* Rebrand MMTL to MeBox across codebase and assets Rename the project display name, Go module path, environment variable prefix (MEBOX_*), Docker image references, and UI branding from MMTL/mmtl to MeBox/mebox. Replace logo assets with the new MeBox icon and keep legacy SQLite migration support for existing mmtl.db deployments. Co-authored-by: truewhile <truewhile@users.noreply.github.com> * Fix logo icons: use cube-only crop without truncated text Previous icon generation cropped too much of the source image, including partial MeBox wordmark text that was cut off in square icon containers. Regenerate logo-64/192/512, favicon, and SVG from cube-only region. Co-authored-by: truewhile <truewhile@users.noreply.github.com> --------- Co-authored-by: Cursor Agent <cursoragent@cursor.com> Co-authored-by: truewhile <truewhile@users.noreply.github.com>
77 lines
2.1 KiB
Go
77 lines
2.1 KiB
Go
package config
|
|
|
|
import (
|
|
"crypto/rand"
|
|
"encoding/hex"
|
|
"fmt"
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
)
|
|
|
|
// normalize 填充派生默认值并自愈空的关键字段。
|
|
func (c *Config) normalize() error {
|
|
if c.App.DataDir == "" {
|
|
c.App.DataDir = "./data"
|
|
}
|
|
if c.Database.DBPath == "" {
|
|
c.Database.DBPath = filepath.Join(c.App.DataDir, "mebox.db")
|
|
}
|
|
if c.Database.Type == "" {
|
|
c.Database.Type = "auto"
|
|
}
|
|
if c.App.MaxCPUThreads < 1 {
|
|
c.App.MaxCPUThreads = 1
|
|
}
|
|
if c.App.MaxCPUThreads > 8 {
|
|
c.App.MaxCPUThreads = 8
|
|
}
|
|
if c.App.CloudScanMaxConcurrent < 1 {
|
|
c.App.CloudScanMaxConcurrent = 1
|
|
}
|
|
if c.App.CloudScanMaxConcurrent > 16 {
|
|
c.App.CloudScanMaxConcurrent = 16
|
|
}
|
|
if c.Database.MaxOpenConns <= 0 {
|
|
c.Database.MaxOpenConns = defaultDatabaseMaxOpenConns
|
|
}
|
|
if c.Database.MaxIdleConns <= 0 || c.Database.MaxIdleConns > c.Database.MaxOpenConns {
|
|
c.Database.MaxIdleConns = defaultDatabaseMaxIdleConns
|
|
if c.Database.MaxIdleConns > c.Database.MaxOpenConns {
|
|
c.Database.MaxIdleConns = c.Database.MaxOpenConns
|
|
}
|
|
}
|
|
if c.Cache.CacheDir == "" {
|
|
c.Cache.CacheDir = filepath.Join(c.App.DataDir, "cache")
|
|
}
|
|
if c.Cache.ImagesMaxSizeMB < 0 {
|
|
c.Cache.ImagesMaxSizeMB = 0
|
|
}
|
|
if c.Cache.RedisPrefix == "" {
|
|
c.Cache.RedisPrefix = "mebox"
|
|
}
|
|
if c.Cache.MediaTTLSeconds < 1 {
|
|
c.Cache.MediaTTLSeconds = 15
|
|
}
|
|
c.Search.Backend = strings.ToLower(strings.TrimSpace(c.Search.Backend))
|
|
if c.Search.Index == "" {
|
|
c.Search.Index = "mebox_media"
|
|
}
|
|
if c.Secrets.JWTSecret == "" {
|
|
// 持久化自动生成的密钥以在操作员忘记配置时保持会话稳定。
|
|
path := filepath.Join(c.App.DataDir, ".jwt_secret")
|
|
if data, err := os.ReadFile(path); err == nil && len(data) > 0 { // #nosec G304 -- path is fixed to .jwt_secret under configured DataDir.
|
|
c.Secrets.JWTSecret = strings.TrimSpace(string(data))
|
|
} else {
|
|
buf := make([]byte, 32)
|
|
if _, err := rand.Read(buf); err != nil {
|
|
return fmt.Errorf("generate jwt secret: %w", err)
|
|
}
|
|
c.Secrets.JWTSecret = hex.EncodeToString(buf)
|
|
_ = os.MkdirAll(c.App.DataDir, 0o750)
|
|
_ = os.WriteFile(path, []byte(c.Secrets.JWTSecret), 0o600)
|
|
}
|
|
}
|
|
return nil
|
|
}
|