main.go 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. package main
  2. import (
  3. "context"
  4. "log/slog"
  5. "os"
  6. "github.com/kairo/haven/internal/audit"
  7. "github.com/kairo/haven/internal/auth"
  8. "github.com/kairo/haven/internal/config"
  9. "github.com/kairo/haven/internal/db"
  10. )
  11. // main 是后端入口。
  12. //
  13. // 配置全部来自环境变量,见 docs/architecture.md 第四节;
  14. // 当前已接入:配置、日志、数据库、认证与授权(docs/api.md 第二至五、十一节)。
  15. // 静态托管与其余领域路由按 TODO.md 后续条目接入。
  16. func main() {
  17. if err := run(); err != nil {
  18. slog.Error("服务启动失败", "err", err)
  19. os.Exit(1)
  20. }
  21. }
  22. func run() error {
  23. cfg, err := config.Load()
  24. if err != nil {
  25. return err
  26. }
  27. logger := newLogger(cfg.LogLevel)
  28. slog.SetDefault(logger)
  29. conn, err := db.Open(context.Background(), cfg.DBDSN)
  30. if err != nil {
  31. return err
  32. }
  33. defer conn.Close()
  34. logger.Info("数据库连接就绪")
  35. store := auth.NewSQLStore(conn)
  36. svc := auth.NewService(conn)
  37. handler := auth.NewHandler(svc, store, cfg.TotpIssuer, cfg.CookieDomain, cfg.CookieSecure)
  38. // 审计事件在业务成功后写,失败只记日志(audit.md 第五节)
  39. auth.UseAudit(handler, audit.NewWriter(conn))
  40. r := newRouter(handler, store)
  41. logger.Info("后端启动", "listen_addr", cfg.ListenAddr)
  42. return r.Run(cfg.ListenAddr)
  43. }
苏ICP备2026082406号
苏公网安备 待审核