多环境运维管理工具 — 支持桌面客户端与服务端两种部署模式
EnvPilot 是一个 DevOps 运维助手,用于统一管理服务器和中间件资产。
采用插件化资产模型,支持 SSH 命令执行、在线终端、健康检查等运维功能。
| 模式 | 适用场景 | 通信方式 |
|---|---|---|
| 桌面模式(Wails) | 本地个人使用,无需服务器 | Wails IPC(原生 WebView 桥接) |
| 服务端模式(HTTP) | 团队共享,部署到服务器 | REST API + SSE + WebSocket |
两种模式共享全部业务逻辑(internal/),只有入口层不同。
| 层次 | 技术 |
|---|---|
| 桌面容器 | Wails v2(Go + WebView2) |
| 后端语言 | Go 1.25 |
| HTTP 框架 | Go 标准库 net/http(1.22+ 路径参数语法) |
| 前端框架 | React 18 + TypeScript |
| 样式系统 | TailwindCSS v4 + shadcn/ui |
| 状态管理 | Zustand |
| 本地数据库 | SQLite(GORM) |
| 日志系统 | zap + lumberjack |
| 实时通信 | Wails IPC(桌面)/ SSE + WebSocket(服务端) |
- 资产管理:环境 / 分组 / 资产 / 凭据 CRUD,插件化资产类型(8 种内置)
- 命令执行:SSH 单机执行、批量并发执行,实时输出流式推送
- 在线终端:SSH PTY 全功能终端,基于 xterm.js
- 中间件连接:MySQL / PostgreSQL / Redis / RocketMQ / RabbitMQ / Kafka,已支持连接测试、库表浏览、只读 SQL、Redis 命令和 MQ 消息发送
- 健康检查:定时 Ping / TCP / 资源监控(待实现)
- 操作审计:已支持资产、凭据、连接器操作日志记录与统一查询,审计页面已可用
- Go 1.25+
- Node.js 20+
- Wails CLI v2(桌面模式需要)
# 安装 Wails CLI
go install github.com/wailsapp/wails/v2/cmd/wails@latest# 启动热更新开发模式
wails dev
# 或使用 Makefile
make dev# 终端 1:启动 Go HTTP 服务
make dev-server
# 等同于:go run ./cmd/server/ --addr :8080
# 终端 2:启动前端开发服务器(含代理)
npm run dev:server --prefix frontend
# 访问:http://localhost:5173# 桌面版(Wails,当前平台)
make build-desktop
# 直接使用 wails build 也会在构建前自动同步版本号和 commitid
wails build
# 服务端版(HTTP,当前平台)
make build-server
./bin/envpilot-server --addr :8080
# 交叉编译服务端(Linux amd64)
make build-server-linux
# 同时构建两种模式
make build-all服务端版前端以静态资源形式内嵌到二进制文件,无需单独部署 Web 服务器。
构建元信息说明:
make build-*、GitHub Release 工作流以及直接执行wails build都会先运行go run ./cmd/buildmeta -mode sync,统一生成应用内版本号、短 commitid 以及桌面端包资源版本。未命中 Git tag 时版本号默认为dev,桌面包资源版本回落为0.0.0。
config/config.yaml 中的数据库配置已按驱动拆分,避免 SQLite 和 MySQL 字段混用。当前推荐默认使用 SQLite,本地即可启动:
app:
name: EnvPilot
data_dir: ./data
log_dir: ./logs
database:
driver: sqlite
sqlite:
filename: envpilot.db
mysql:
host: 127.0.0.1
port: 3306
username: root
password: ""
dbname: envpilot
params: charset=utf8mb4&parseTime=True&loc=UTC
pool:
max_idle_conns: 5
max_open_conns: 20说明:
database.driver=sqlite时只使用database.sqlite.*database.driver=mysql时只使用database.mysql.*database.pool.*为通用连接池参数- 旧版平铺结构
database.host / database.filename / ...仍可读取,但保存后会统一写回新结构
main/master分支提交或合并请求会触发 GitHub Actions 构建校验;测试阶段默认执行make test-core,只覆盖internal/、database/、pkg/下的业务与基础包。桌面链路在分支校验中只执行前端资源构建和go build .入口编译,不执行应用启动测试,避免因本地数据库配置指向外部 MySQL 导致校验失败- 推送
v开头的 tag(例如v0.0.1)会触发 Release 工作流;同样会先执行make test-core,然后再构建 Linux 服务端包(amd64、arm64,基于纯 Go SQLite 驱动使用CGO_ENABLED=0构建,避免额外的 GLIBC/Zig 依赖)、macOS 通用桌面包(Intel + Apple Silicon)和 Windows 桌面包(amd64、arm64)并发布到 GitHub Releases - 本地可使用
./scripts/release.sh v0.0.1自动切换到发布分支、同步远端、创建 annotated tag 并推送到远端;脚本会优先使用master,不存在时回落到远端默认分支
所有文档位于 doc/ 目录:
| 文档 | 说明 |
|---|---|
doc/req.md |
需求规格说明书(v0.2) |
doc/design.md |
系统技术设计文档(架构、数据模型、API、开发规范) |
doc/dev.md |
开发进度与阶段任务文档 |
doc/modules.md |
模块文档导航页 |
doc/modules-foundation.md |
基础设施模块说明 |
doc/modules-business.md |
业务模块说明 |
EnvPilot 目前将服务器与中间件都建模为插件。每个内置插件集中在 internal/plugin/builtin/<type>/ 目录,通常按以下方式拆分:
definition.go:插件元数据定义与注册connector.go:连接器工厂注册与具体实现
插件元数据统一通过 PluginDef 描述:
config_schema:前端动态表单字段credential_types:允许绑定的凭据类型credential_required:是否要求强制绑定凭据capabilities:该插件支持的连接或执行能力integration_guide:后续扩展该类中间件时的接入要点
这意味着新增一个中间件时,不需要在前端、连接器、资产管理各自维护一份元数据;同时目录内又保留了定义与运行逻辑的职责拆分,避免单文件膨胀。
| 类型 | 分类 | 主要能力 | 典型凭据 |
|---|---|---|---|
| MySQL | database | 连接测试 / 库表浏览 / 只读 SQL | password |
| PostgreSQL | database | 连接测试 / 库表浏览 / 只读 SQL | password |
| Redis | cache | 连接测试 / 白名单命令执行 | password, token |
| RabbitMQ | mq | 连接测试 / 消息发送 | password |
| Kafka | mq | 连接测试 / 消息发送 | password, token, sasl |
| RocketMQ | mq | 连接测试 / 消息发送 | token, access_key_secret |
为了适配不同中间件,凭据类型已经从单一密码模式扩展为以下几类:
password:用户名 + 密码,适用于 MySQL、PostgreSQL、RabbitMQ 等ssh_key:SSH 私钥,适用于 Linux 服务器token:单值 Token 或访问口令,适用于 Redis、RocketMQ 等access_key_secret:AccessKey + SecretKey,适用于 RocketMQ ACL 等场景sasl:SASL 用户名 + 密钥,适用于 Kafka SASL 认证
资产绑定凭据时会按插件定义做兼容性校验,前端也会自动过滤不兼容凭据,减少配置错误。
当前已经接入的审计内容包括:
- 资产创建、更新、删除
- 凭据创建、更新、删除、明文查看
- 连接器连接测试
- SQL 执行、Redis 命令执行、MQ 消息发送
当前仍在补充的增强项包括:
- 更细粒度筛选条件
- 审计日志导出
- executor 等剩余链路的进一步覆盖
审计日志支持桌面模式和服务端模式统一查询,前端页面位于 操作审计。
EnvPilot/
├── main.go # 桌面模式入口(Wails)
├── app.go # Wails 生命周期 + 基础 API(桌面专用)
├── Makefile # 构建脚本
│
├── cmd/
│ └── server/
│ ├── main.go # 服务端模式入口(HTTP)
│ ├── embed.go # 前端静态资源内嵌
│ └── dist/ # 服务端前端构建产物(make build-server 生成)
│
├── api/ # 服务端 HTTP handler 层
│ ├── router.go # 路由注册 + CORS + SPA fallback
│ ├── asset_handler.go # 资产管理 REST handler
│ ├── executor_handler.go # 命令执行(POST)+ 输出流(SSE)+ 终端(WebSocket)
│ ├── event_bus.go # 进程内发布订阅总线(服务端实时事件)
│ └── util.go # JSON 响应工具
│
├── internal/ # 共享业务逻辑(桌面 / 服务端均使用)
│ ├── app/
│ │ └── container.go # 共享初始化容器(无 Wails 依赖)
│ ├── plugin/ # 插件注册表(资产类型定义)
│ │ ├── definition.go # PluginDef、ConfigField 结构
│ │ ├── registry.go # Register / Get / List
│ │ └── builtin/ # 8 种内置插件目录(按 <type>/definition.go + connector.go 组织)
│ ├── asset/ # 资产管理(环境/分组/资产/凭据)
│ │ ├── api/ # Wails 绑定层(桌面专用)
│ │ ├── model/ # 数据模型(Asset / Credential / Environment / Group)
│ │ ├── repository/ # 数据访问层
│ │ └── service/ # 业务逻辑层
│ ├── executor/ # SSH 命令执行 + 在线终端
│ │ ├── api/ # Wails 绑定层(含 WailsEmitter)
│ │ ├── model/ # 执行记录模型
│ │ ├── repository/ # 执行记录持久化
│ │ ├── service/ # 执行服务(依赖 event.Emitter 接口)
│ │ └── ssh/ # SSH 连接池 + 危险命令检测
│ ├── connector/ # 中间件连接器抽象、工厂、服务与双模式 API
│ ├── audit/ # 审计模型、Repository、Service 与查询 API
│ └── config/ # 系统配置
│
├── pkg/ # 公共工具包
│ ├── crypto/ # AES-256-GCM 加解密 + PBKDF2
│ ├── event/ # EventEmitter 接口(桌面/服务端解耦)
│ └── logger/ # 全局日志(zap)
│
├── database/ # 数据库连接与迁移
│ ├── db.go
│ └── migration/ # 版本化迁移(schema_migrations 表追踪)
│
├── config/ # 配置文件(YAML)
│
├── frontend/ # React 18 前端(shadcn/ui + TypeScript)
│ ├── src/
│ │ ├── lib/
│ │ │ ├── apiClient.ts # HTTP / WebSocket / SSE 封装(服务端模式)
│ │ │ └── wailsRuntime.ts # Wails 事件安全封装(桌面模式)
│ │ ├── services/ # 后端调用封装(双模式自动切换)
│ │ ├── store/ # Zustand 状态管理
│ │ ├── pages/ # 页面组件
│ │ └── components/ # 公共组件(shadcn/ui)
│ ├── dist/ # 桌面模式构建产物(Wails 内嵌)
│ ├── dist-server/ # 服务端模式构建产物
│ └── vite.config.ts # 支持 desktop / server 双模式构建
│
└── doc/ # 项目文档
- 所有敏感数据(密码、私钥)使用 AES-256-GCM 加密存储
- 密钥通过 PBKDF2-SHA256 从主密码派生
- 高风险命令(
rm -rf/DROP/DELETE)需要二次确认 - 明文凭据查看操作将记录审计日志
- 服务端模式 CORS 默认允许所有来源(生产部署时请按需收紧)