Files
Logan.Li 97193eb090 feat: v0.4.0 主题切换 + LLM 全面优化 + 登录会话 + 用户管理/LDAP
主题:
- 深色/浅色/跟随系统(useTheme:本地缓存先行+远端同步+matchMedia),
  侧边栏快捷切换,设置页三档即选即生效

LLM(参考 opsxdb/aiops):
- llm.Client.ChatStream 流式(SSE 增量解析,透传 reasoning_content,
  ctx 控制超时);POST /api/ai/chat/stream(平台实时数据注入降幻觉,
  未配 LLM 降级规则 JSON,指令解析 action 不变)
- test-llm 支持草稿直测(保存前验证,apiKey 空/掩码回退已存)
- 发布失败自动 AI 分析日志尾部(结论/根因/建议),发布记录与发布
  Tab 展示分析卡片
- 设置页 Provider 预设(DeepSeek/GLM/GLM编码/Qwen/Kimi/Ollama/自定义)
  自动填 endpoint+模型+获取 Key 直达链接

登录与会话:
- HMAC 签名 token(7 天,密钥派生自 encryption.key);
  authMiddleware 保护 /api/*(豁免登录/健康/SSE日志流/入站webhook)
- 登录页 /login + 未登录跳转 + 登出;401 自动清理跳登录

用户管理与 LDAP(借鉴 LokiStack):
- /users 页面:本地用户 CRUD、一次性密码、角色切换、来源徽章
  (本地·蓝 | LDAP导入·紫);LDAP 导入按钮仅在启用且配置齐备时显示
- LDAP 配置卡(未启用仅提示语)、测试连接草稿直测+可选测试账号
- go-ldap:管理 Bind/用户搜索(防注入)/用户 DN 直连验证;
  批量导入冲突策略(已LDAP跳过/本地同名转LDAP/新建);
  登录分流本地 argon2id 或 LDAP 目录验证 + 首登 JIT 建号
2026-10-27 12:58:21 +08:00

5.3 KiB
Raw Permalink Blame History

FlowStack 发布系统

参考阿里云云效 / 华为云 CodeArts 风格的画布式发布系统。 架构:Go gin 后端 + React 19 前端,前端产物嵌入 Go 单二进制,一个端口同时服务 API 与页面。

快速开始

./run.sh            # 一键构建并启动,访问 http://localhost:9527
./run.sh stop       # 停止
./run.sh dev        # 开发模式(gin :9527 + Vite :5173 热更新)
./run.sh help       # 全部命令

首次启动自动创建 SQLite 数据库(data/flowstack.db)并写入两条示例流水线 (aiops-backend K8s 场景 / aiops-web 主机部署场景),零配置开箱即用。

初始管理员账号

首次启动自动生成 随机初始密码 的管理员账号(用户名 admin),并在日志中打印、写入 data/initial-admin-password.txt(权限 0600)。

查看初始密码:

# 方式一:从启动日志中查看(与 opsxloki 的 docker logs 用法一致)
grep -A6 "已生成管理员账号" logs/flowstack.log

# 方式二:直接查看密码文件(与 opsxloki 的 docker exec 用法一致)
cat data/initial-admin-password.txt

Docker 容器化部署时对应命令(参考 opsxloki 模式):

docker logs <容器名> | grep -A6 "已生成管理员账号"
docker exec <容器名> cat /app/data/initial-admin-password.txt

登录校验接口:POST /api/auth/login(body: {"username": "admin", "password": "..."},返回签名 token,前端自动携带)。 密码使用 argon2id 哈希存储。启用 LDAP 后同名目录账号自动走 LDAP 验证(密码不落库)。

功能模块

模块 说明 数据来源
登录/会话 本地账号 + LDAP 账号统一登录(JWT 式签名 token,7 天) gin API
主题 深色/浅色/跟随系统,侧边栏快捷切换,多端同步 gin API(持久化)
流水线 列表 + 画布编辑器(Tekton 任务库、拖拽编排、连线、节点属性配置) gin API(SQLite 持久化)
模拟执行 触发运行后节点状态实时推进(pending→running→success)+ SSE 日志流 gin API + 模拟执行引擎
AI 智能助手 全局悬浮对话:自然语言发布指令解析(流式输出、平台数据注入、规则兜底)、发布失败自动 AI 分析日志 OpenAI 兼容 LLM(DeepSeek/GLM/Qwen/Kimi/Ollama 预设)
飞书/Lark 通知 发布结果交互卡片(应用/分支/构建/状态/时间 + 构建详情按钮),支持加签 gin API
用户管理 本地用户 CRUD + LDAP 用户导入(未启用 LDAP 时导入按钮隐藏),本地/LDAP 来源徽章 gin API
LDAP 目录服务配置/测试连接/用户搜索导入、登录直连验证(密码不落库) gin API(go-ldap)
构建节点 CRUD + 连通测试 + dd 磁盘性能实测(本地 exec / SSH 远程) gin API
工具配置 Ubuntu 导向工具目录(apt/nvm 安装提示)、真实版本检测 gin API
GitOps 部署 ArgoCD 风格应用列表 / 资源树 / Diff gin API
Jenkins 服务器管理/Job 树/导入/真实构建触发与日志回传 gin API(生产级客户端)
批量发布 粘贴清单(opsx 风格解析)+ 手动勾选 + AI 对话触发 gin API
发布记录 运行历史、阶段、SSE 日志、Pod、失败 AI 分析、Jenkins 链接 gin API

架构

FlowStack/
├── run.sh                  # 启动脚本(单二进制模式)
├── backend/                # Go gin
│   ├── main.go             # 路由 + 静态托管(go:embed)
│   └── internal/
│       ├── model/          # GORM 模型(流水线/节点/连线/运行/日志/GitOps/插件)
│       ├── database/       # SQLite 初始化 + seed
│       └── handler/        # REST API + SSE 日志推送 + 模拟执行引擎
├── frontend/               # React 19 + Vite + Tailwind + shadcn/ui + React Flow
│   └── src/
│       ├── lib/api.ts      # REST 客户端
│       ├── components/flow/# 画布编辑器(PipelineFlowEditor / TektonNode)
│       └── pages/          # 14 个功能页面
└── data/                   # SQLite 数据库(运行时生成)

REST API 摘要

GET/POST        /api/pipelines              流水线列表 / 创建
GET/PUT/DELETE  /api/pipelines/:id          详情(含节点连线)/ 更新 / 删除
PUT             /api/pipelines/:id/nodes    保存画布节点(全量覆盖)
PUT             /api/pipelines/:id/edges    保存画布连线
POST            /api/pipelines/:id/runs     触发运行(模拟执行引擎)
GET             /api/runs                   运行列表
GET             /api/runs/:runId            运行详情(阶段+日志)
GET             /api/runs/:runId/logs/stream  SSE 实时日志
GET             /api/gitops/apps            GitOps 应用列表
GET/POST        /api/gitops/argo/*          ArgoCD 模拟接口
GET/POST/DELETE /api/plugins*               插件管理
GET             /health                     健康检查

技术栈

  • 后端:Go 1.24+ / gin / GORM / SQLite(glebarez 纯 Go 驱动)
  • 前端:React 19 / TypeScript / Vite 7 / Tailwind CSS / shadcn-ui / @xyflow/react (React Flow) / TanStack Query / lucide-react / sonner