ZenOps 已完成配置管理从 YAML 文件到 SQLite 数据库的迁移。本文档介绍如何集成和使用新的配置管理系统。
配置按类型分表存储:
- llm_config - LLM 大模型配置
- provider_accounts - 云厂商账号配置(阿里云/腾讯云)
- im_config - IM 平台配置(钉钉/飞书/企微)
- cicd_config - CICD 工具配置(Jenkins)
- mcp_servers - MCP 服务器配置
- system_config - 系统配置(服务器/认证/缓存等)
- 优先从数据库加载: 首次启动时优先尝试从数据库加载配置
- YAML 作为后备: 如果数据库为空,从 YAML 文件加载
- 自动迁移: YAML 配置会自动迁移到数据库(仅首次)
- 页面管理: 后续通过 Web 页面管理配置
在启动命令中集成配置迁移逻辑:
package cmd
import (
"log"
"os"
"github.com/eryajf/ZenOps/internal/config"
"github.com/eryajf/ZenOps/internal/database"
"github.com/eryajf/ZenOps/internal/service"
"github.com/spf13/cobra"
)
var rootCmd = &cobra.Command{
Use: "zenops",
Short: "ZenOps - 运维智能化工具",
PersistentPreRunE: func(cmd *cobra.Command, args []string) error {
// 1. 初始化数据库
db := database.GetDB()
if db == nil {
return fmt.Errorf("failed to initialize database")
}
// 2. 设置配置加载器
configService := service.NewConfigService()
// 设置数据库配置加载函数
config.SetDBLoader(func() (*config.Config, error) {
return configService.LoadConfigFromDB()
})
// 设置配置迁移函数
config.SetDBMigrator(func(cfg *config.Config) error {
// 迁移 YAML 配置到数据库
if err := configService.MigrateFromYAML(cfg); err != nil {
return err
}
// 迁移 MCP Servers 配置
if cfg.MCPServersConfig != "" {
if err := configService.MigrateMCPServersFromJSON(cfg.MCPServersConfig); err != nil {
log.Printf("Warning: failed to migrate MCP servers: %v", err)
}
}
return nil
})
// 3. 加载配置(优先从数据库)
cfg, err := config.LoadConfigWithDB(configFile)
if err != nil {
return fmt.Errorf("failed to load config: %w", err)
}
// 4. 设置全局配置
config.SetGlobalConfig(cfg)
return nil
},
}
func Execute() {
if err := rootCmd.Execute(); err != nil {
os.Exit(1)
}
}
func init() {
rootCmd.PersistentFlags().StringVar(&configFile, "config", "", "config file (default: ./config.yaml)")
}默认数据库文件位置: ./data/zenops.db
可通过环境变量自定义:
export ZENOPS_DB_PATH=/path/to/your/zenops.dbgo mod tidy这会安装以下新依赖:
github.com/glebarez/sqlite v1.11.0gorm.io/gorm v1.25.5
# 获取 LLM 配置
GET /api/v1/config/llm
# 保存 LLM 配置
PUT /api/v1/config/llm
Content-Type: application/json
{
"enabled": true,
"model": "DeepSeek-V3",
"api_key": "your-api-key",
"base_url": ""
}# 列出所有云厂商账号
GET /api/v1/config/providers?provider=aliyun
# 创建云厂商账号
POST /api/v1/config/providers
Content-Type: application/json
{
"provider": "aliyun",
"name": "production",
"enabled": true,
"access_key": "YOUR_AK",
"secret_key": "YOUR_SK",
"regions": ["cn-hangzhou", "cn-shanghai"]
}
# 更新云厂商账号
PUT /api/v1/config/providers/:id
# 删除云厂商账号
DELETE /api/v1/config/providers/:id# 获取钉钉配置
GET /api/v1/config/im/dingtalk
# 保存钉钉配置
PUT /api/v1/config/im/dingtalk
Content-Type: application/json
{
"enabled": true,
"config_data": {
"app_key": "your-app-key",
"app_secret": "your-app-secret",
"agent_id": "your-agent-id",
"card_template_id": ""
}
}
# 列出所有 IM 配置
GET /api/v1/config/im# 获取 Jenkins 配置
GET /api/v1/config/cicd/jenkins
# 保存 Jenkins 配置
PUT /api/v1/config/cicd/jenkins
Content-Type: application/json
{
"enabled": true,
"url": "https://jenkins.example.com",
"username": "admin",
"token": "your-token"
}# 列出所有 MCP 服务器
GET /api/v1/config/mcp
# 创建 MCP 服务器
POST /api/v1/config/mcp
Content-Type: application/json
{
"name": "gitea",
"is_active": true,
"type": "streamableHttp",
"description": "Gitea MCP Server",
"base_url": "http://localhost:5566/mcp",
"headers": {
"Authorization": "Bearer your-token"
},
"long_running": true,
"timeout": 300,
"tool_prefix": "",
"auto_register": true
}
# 更新 MCP 服务器
PUT /api/v1/config/mcp/:id
# 删除 MCP 服务器
DELETE /api/v1/config/mcp/:id# 列出所有系统配置
GET /api/v1/config/system
# 设置系统配置
POST /api/v1/config/system
Content-Type: application/json
{
"key": "server.http.port",
"value": "8080",
"description": "HTTP server port"
}- 程序检查数据库中是否有配置
- 如果数据库为空,从
config.yaml加载配置 - 自动将 YAML 配置迁移到数据库
- 如果有
mcp_servers.json,也会自动迁移 - 后续启动直接从数据库加载
数据库配置 > YAML 配置 > 环境变量 > 默认值
如果需要将数据库配置导出为 JSON:
configService := service.NewConfigService()
err := configService.ExportMCPServersToJSON("./mcp_servers_backup.json")依然支持通过环境变量覆盖配置:
export ZENOPS_DB_PATH=/custom/path/zenops.db
export ZENOPS_LLM_API_KEY=your-api-key
export ZENOPS_SERVER_HTTP_PORT=9090建议定期备份数据库文件:
# 备份数据库
cp ./data/zenops.db ./data/zenops_backup_$(date +%Y%m%d).db
# 恢复数据库
cp ./data/zenops_backup_20250101.db ./data/zenops.db- SQLite 并发限制: SQLite 设置了
MaxOpenConns(1),适合单实例部署 - 配置热更新: 通过 API 修改配置后,需要重启服务生效
- 敏感信息: API Key、Token 等敏感信息存储在数据库中,请妥善保管数据库文件
- YAML 配置: 迁移后,YAML 配置文件仍保留作为备份,但不再使用
检查目录权限:
mkdir -p ./data
chmod 755 ./data查看日志输出,手动检查 YAML 配置文件格式是否正确
- 检查 HTTP 服务是否启动
- 检查端口是否正确
- 使用 curl 测试接口
curl http://localhost:8080/api/v1/config/llm- 开发前端配置管理页面
- 实现配置变更通知机制
- 添加配置版本控制
- 支持配置导入导出功能