feat: opsx-loki 全面升级 — 前端重构/用户与LDAP/部署向导/日志查询
基于 WEB-UI-Development-Guide 标准的整体升级,并更名 LokiDeploy → opsx-loki。 前端(Gin+React+shadcn/ui): - 按 02/07 章重构:页面域化拆分(无超 400 行文件)、PageContainer/ListQuery、 反馈分级(成功静默/失败 toast/危险确认)、401 单飞刷新+队列重放 - 暗色模式(next-themes)+ 语义 Token(--primary 品牌色/success/warning/info) - 部署向导(状态推导四步:环境→存储→Loki→采集,内嵌表单闭环) - 日志查询页:LogQL 标签构建器/拖拽直方图/日志上下文/Live Tail/查询历史 - 按用户+标签策略的查询授权(服务端强制合并策略) 后端(Go+Gin+JSON DB): - 简单用户管理(仅 admin,无 RBAC)+ TokenVersion 会话吊销 + 登录 IP 限流 - LDAP 接入:配置(AES 加密存储/hasPassword 脱敏)/测试连接/批量导入/登录 - 存储配置测试连接(SigV4 零依赖)+ 桶不存在自动创建 - Loki 三模式部署修复:SSH 密钥认证、3.x 配置模板、ruler 对象存储嵌套块、 凭证解密、孤儿 deploying 状态恢复、Grafana 部署(可选默认关)+面板导入 - DaemonSet 采集纯 YAML(去 helm 依赖)+ DNS 自愈回退 ClusterIP + 集群名标签 - 日志查询代理:cluster-svc 经 kube-apiserver proxy/url 直连 + cursor 翻页 - 统一 log 命名空间;部署就绪探活;Grafana 访问地址自动记录 修复:run.sh 增量编译检测、Sanitized 脱敏补全、LokiDeployment Update 白名单、 健康检查 CreatedAt 零值等 10+ 存量 bug。 数据兼容:DB 沿用旧 lokideploy.json(新名优先);localStorage 一次性迁移; HKDF 加密前缀保留(已加密凭证不受影响)。
This commit is contained in:
1 parent
327e282356
commit
f9c6c1d826
204 files changed
+14107
-9103
No files matched your search
@@ -7,8 +7,8 @@ import (
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"lokideploy/controllers"
|
||||
"lokideploy/middleware"
|
||||
"opsxloki/controllers"
|
||||
"opsxloki/middleware"
|
||||
|
||||
"github.com/gin-contrib/cors"
|
||||
"github.com/gin-gonic/gin"
|
||||
@@ -31,6 +31,9 @@ func SetupRouter() *gin.Engine {
|
||||
storageCtrl := controllers.NewStorageController()
|
||||
deploymentCtrl := controllers.NewDeploymentController()
|
||||
collectorCtrl := controllers.NewCollectorController()
|
||||
userCtrl := controllers.NewUserController()
|
||||
ldapCtrl := controllers.NewLdapController()
|
||||
logsCtrl := controllers.NewLogsController()
|
||||
|
||||
// API v1
|
||||
api := r.Group("/api/v1")
|
||||
@@ -51,8 +54,8 @@ func SetupRouter() *gin.Engine {
|
||||
c.String(http.StatusOK, "# LokiDeploy Metrics\n")
|
||||
})
|
||||
|
||||
// Public
|
||||
api.POST("/auth/login", authCtrl.Login)
|
||||
// Public(登录接口挂 IP 限流防爆破:20 次/分钟)
|
||||
api.POST("/auth/login", middleware.LoginRateLimit(20, time.Minute), authCtrl.Login)
|
||||
api.POST("/auth/refresh", authCtrl.RefreshToken)
|
||||
|
||||
// Auth required
|
||||
@@ -62,7 +65,45 @@ func SetupRouter() *gin.Engine {
|
||||
// Auth routes
|
||||
authorized.GET("/auth/user", authCtrl.GetUser)
|
||||
authorized.POST("/auth/password", authCtrl.ChangePassword)
|
||||
authorized.POST("/auth/register", middleware.AdminAuth(), authCtrl.Register)
|
||||
|
||||
// 日志查询:数据源管理 + Loki 代理查询
|
||||
logs := authorized.Group("/logs")
|
||||
{
|
||||
logs.GET("/sources", logsCtrl.ListSources)
|
||||
logs.POST("/sources", middleware.AdminAuth(), logsCtrl.CreateSource)
|
||||
logs.PUT("/sources/:id", middleware.AdminAuth(), logsCtrl.UpdateSource)
|
||||
logs.DELETE("/sources/:id", middleware.AdminAuth(), logsCtrl.DeleteSource)
|
||||
logs.POST("/sources/test", middleware.AdminAuth(), logsCtrl.TestSource)
|
||||
logs.GET("/policy-groups", middleware.AdminAuth(), logsCtrl.ListPolicyGroups)
|
||||
logs.POST("/policy-groups", middleware.AdminAuth(), logsCtrl.CreatePolicyGroup)
|
||||
logs.PUT("/policy-groups/:id", middleware.AdminAuth(), logsCtrl.UpdatePolicyGroup)
|
||||
logs.DELETE("/policy-groups/:id", middleware.AdminAuth(), logsCtrl.DeletePolicyGroup)
|
||||
logs.POST("/query", logsCtrl.Query)
|
||||
logs.POST("/context", logsCtrl.Context)
|
||||
logs.GET("/labels", logsCtrl.Labels)
|
||||
logs.GET("/label/:name/values", logsCtrl.LabelValues)
|
||||
logs.POST("/histogram", logsCtrl.Histogram)
|
||||
logs.GET("/health", logsCtrl.Health)
|
||||
}
|
||||
|
||||
// LDAP 配置(admin 读写;查询供用户页判断导入按钮显隐,登录用户即可读)
|
||||
authorized.GET("/settings/ldap", middleware.AdminAuth(), ldapCtrl.GetConfig)
|
||||
authorized.PUT("/settings/ldap", middleware.AdminAuth(), ldapCtrl.UpdateConfig)
|
||||
authorized.POST("/settings/ldap/test", middleware.AdminAuth(), ldapCtrl.TestConnection)
|
||||
authorized.POST("/settings/ldap/users", middleware.AdminAuth(), ldapCtrl.ListUsers)
|
||||
|
||||
// Users(admin 专用)
|
||||
users := authorized.Group("/users")
|
||||
users.Use(middleware.AdminAuth())
|
||||
{
|
||||
users.GET("", userCtrl.List)
|
||||
users.POST("", userCtrl.Create)
|
||||
users.DELETE("/:id", userCtrl.Delete)
|
||||
users.POST("/:id/reset-password", userCtrl.ResetPassword)
|
||||
users.POST("/batch-import-ldap", userCtrl.BatchImportLDAP)
|
||||
}
|
||||
// 普通用户仅可访问日志查询及自己的账号接口;管理资源统一在服务端保护。
|
||||
authorized.Use(middleware.AdminAuth())
|
||||
|
||||
// Clusters
|
||||
authorized.GET("/clusters", clusterCtrl.List)
|
||||
@@ -87,6 +128,7 @@ func SetupRouter() *gin.Engine {
|
||||
authorized.GET("/storages", storageCtrl.List)
|
||||
authorized.GET("/storages/:id", storageCtrl.Get)
|
||||
authorized.POST("/storages", storageCtrl.Create)
|
||||
authorized.POST("/storages/test", storageCtrl.TestConnection)
|
||||
authorized.PUT("/storages/:id", storageCtrl.Update)
|
||||
authorized.DELETE("/storages/:id", storageCtrl.Delete)
|
||||
authorized.GET("/storages/default", storageCtrl.GetDefault)
|
||||
@@ -102,6 +144,9 @@ func SetupRouter() *gin.Engine {
|
||||
authorized.POST("/deployments/:id/restart", deploymentCtrl.Restart)
|
||||
authorized.GET("/deployments/:id/logs", deploymentCtrl.GetLogs)
|
||||
authorized.GET("/deployments/stats", deploymentCtrl.GetStats)
|
||||
authorized.GET("/deployments/preflight", deploymentCtrl.Preflight)
|
||||
authorized.GET("/deployments/:id/ready", deploymentCtrl.Ready)
|
||||
authorized.GET("/deployments/versions", deploymentCtrl.GetVersions)
|
||||
|
||||
// Collectors
|
||||
authorized.GET("/collectors", collectorCtrl.List)
|
||||
|
||||
Reference in new issue
Block a user