package main import ( "log" "os" "strings" "github.com/joho/godotenv" "git.sundynix.cn/Blizzard/sundynix-site/server/internal/pkg/auth" "git.sundynix.cn/Blizzard/sundynix-site/server/internal/pkg/idgen" "git.sundynix.cn/Blizzard/sundynix-site/server/internal/router" "git.sundynix.cn/Blizzard/sundynix-site/server/internal/store" ) func main() { // 依次尝试仓库根 / server 目录下的 .env(已存在的环境变量优先) _ = godotenv.Load(".env") _ = godotenv.Load("../.env") // 未配置 SUNDYNIX_DB 时回落到本地 SQLite,方便零依赖起步 dsn := envOr("SUNDYNIX_DB", "sundynix-site.db") // 8080 常被 agentix gateway 占用,site 默认 8090 addr := envOr("SUNDYNIX_ADDR", ":8090") if err := idgen.Init(); err != nil { log.Fatalf("初始化雪花节点失败: %v", err) } auth.Init() db, err := store.Open(dsn) if err != nil { log.Fatalf("打开数据库失败: %v", err) } r, err := router.New(db) if err != nil { log.Fatalf("初始化路由失败: %v", err) } log.Printf("sundynix-site 启动于 %s (db=%s)", addr, maskDSN(dsn)) if err := r.Run(addr); err != nil { log.Fatalf("服务退出: %v", err) } } func envOr(key, fallback string) string { if v := os.Getenv(key); v != "" { return v } return fallback } // maskDSN 日志脱敏:user:pass@tcp(...) → user:***@tcp(...) func maskDSN(dsn string) string { at := strings.Index(dsn, "@") if at < 0 { return dsn } colon := strings.Index(dsn[:at], ":") if colon < 0 { return dsn } return dsn[:colon+1] + "***" + dsn[at:] }