fb2c3a6cae
- Tool 接口 + Registry 注册中心,工具模块化插拔 - system 工具:health / info - database 工具:db_query / db_tables / db_table_info / db_explain(四层 SQL 安全) - docker 工具:docker_ps / docker_logs / docker_inspect(白名单 + 大小限制) - middleware:auth(JWT+APIKey)/ ratelimit(令牌桶)/ audit(slog 结构化) - stdio / SSE 双传输模式,Viper 多环境配置 - Dockerfile 多阶段构建(golang:alpine → scratch),~15MB 镜像 - docker-compose.yml 一键部署 + 安全加固(read_only / no-new-privileges / cap_drop) - go build ./... / go vet ./... / go test ./... 全部通过 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
82 lines
1.8 KiB
Go
82 lines
1.8 KiB
Go
package main
|
|
|
|
import (
|
|
"flag"
|
|
"fmt"
|
|
"log/slog"
|
|
"os"
|
|
|
|
"ops-mcp/internal/server"
|
|
"ops-mcp/internal/tool"
|
|
|
|
"ops-mcp/config"
|
|
)
|
|
|
|
func main() {
|
|
env := flag.String("env", "dev", "运行环境:dev | staging | prod")
|
|
flag.Parse()
|
|
|
|
// 结构化日志
|
|
slog.SetDefault(slog.New(slog.NewTextHandler(os.Stderr, &slog.HandlerOptions{
|
|
Level: slog.LevelInfo,
|
|
})))
|
|
|
|
if err := run(*env); err != nil {
|
|
slog.Error("fatal", "err", err)
|
|
os.Exit(1)
|
|
}
|
|
}
|
|
|
|
func run(env string) error {
|
|
// 1. 加载配置
|
|
cfg, err := config.Load(env)
|
|
if err != nil {
|
|
fmt.Fprintf(os.Stderr, "Warning: could not load config file, using env vars only: %v\n", err)
|
|
cfg = &config.Config{
|
|
Env: env,
|
|
Server: config.ServerConfig{Transport: "stdio", Addr: ":8080"},
|
|
}
|
|
}
|
|
|
|
slog.Info("config loaded", "env", cfg.Env, "transport", cfg.Server.Transport)
|
|
|
|
// 2. 收集工具
|
|
var tools []tool.Tool
|
|
|
|
// database 工具
|
|
if len(cfg.Databases) > 0 {
|
|
dbConfigs := make([]tool.DatabaseConf, 0, len(cfg.Databases))
|
|
for alias, db := range cfg.Databases {
|
|
dbConfigs = append(dbConfigs, tool.DatabaseConf{
|
|
Alias: alias,
|
|
Driver: db.Driver,
|
|
DSN: db.DSN,
|
|
})
|
|
}
|
|
tools = append(tools, tool.NewDatabaseTool(dbConfigs))
|
|
}
|
|
|
|
// docker 工具
|
|
if cfg.Docker.Enabled {
|
|
dockerTool, err := tool.NewDockerTool(tool.DockerOpts{
|
|
ContainerPattern: cfg.Docker.ContainerPattern,
|
|
MaxLogBytes: cfg.Docker.MaxLogBytes,
|
|
MaxLogLines: cfg.Docker.MaxLogLines,
|
|
MaxLogSince: cfg.Docker.MaxLogSince,
|
|
})
|
|
if err != nil {
|
|
slog.Error("create docker tool", "err", err)
|
|
} else {
|
|
tools = append(tools, dockerTool)
|
|
}
|
|
}
|
|
|
|
// 3. 映射 server 配置
|
|
srvCfg := &server.Config{}
|
|
srvCfg.Server.Transport = cfg.Server.Transport
|
|
srvCfg.Server.Addr = cfg.Server.Addr
|
|
|
|
// 4. 启动
|
|
return server.Run(srvCfg, tools...)
|
|
}
|