feat: 官网 + 管理端 + Gin/GORM 后端首个完整版本
- 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>
This commit is contained in:
@@ -0,0 +1,65 @@
|
||||
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:]
|
||||
}
|
||||
Reference in New Issue
Block a user