5abc705eae
- web/: 产品官网(Hero 事件流终端、功能矩阵、架构、快速开始、下载、博客 + Markdown 详情页),青瓷绿双主题 - admin/: 内容管理(JWT 登录、文章分页/搜索/CRUD、草稿与发布),embed 挂 /admin - server/: Gin + GORM,MySQL(DSN 走 .env,SQLite 兜底);规范落地:sundynix_ 表前缀、字符串雪花主键、snake_case 列名、统一响应信封、公共分页参数 - 双 SPA embed 单二进制部署,make build 一键出包 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
66 lines
1.5 KiB
Go
66 lines
1.5 KiB
Go
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:]
|
|
}
|