From c6d31c72a2aca131cc76ba486ac3b0b47d26937a Mon Sep 17 00:00:00 2001 From: engigu Date: Sat, 27 Dec 2025 20:43:48 +0800 Subject: [PATCH] feat: add agent exec --- Dockerfile | 25 +++++++++----- Makefile | 42 ++++++++++++++---------- internal/controllers/agent_controller.go | 4 +-- internal/services/agent_service.go | 15 ++++----- web/src/views/agents/Agents.vue | 4 +-- 5 files changed, 52 insertions(+), 38 deletions(-) diff --git a/Dockerfile b/Dockerfile index c1e188d..0586c06 100644 --- a/Dockerfile +++ b/Dockerfile @@ -54,22 +54,31 @@ ARG BUILD_TIME WORKDIR /app -# Copy agent source +# Copy agent source and config example COPY agent/ ./agent/ # Download dependencies WORKDIR /app/agent RUN go env -w GOPROXY=https://goproxy.cn,direct && go mod download -# Build agent for all platforms (parallel) +# Build agent for all platforms and package as tar.gz (sequential to avoid file conflicts) RUN mkdir -p /opt/agent && \ echo "${VERSION}" > /opt/agent/version.txt && \ - CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags="-s -w -X 'main.Version=${VERSION}' -X 'main.BuildTime=${BUILD_TIME}'" -o /opt/agent/baihu-agent-linux-amd64 . & \ - # CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build -ldflags="-s -w -X 'main.Version=${VERSION}' -X 'main.BuildTime=${BUILD_TIME}'" -o /opt/agent/baihu-agent-linux-arm64 . & \ - # CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -ldflags="-s -w -X 'main.Version=${VERSION}' -X 'main.BuildTime=${BUILD_TIME}'" -o /opt/agent/baihu-agent-windows-amd64.exe . & \ - # CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build -ldflags="-s -w -X 'main.Version=${VERSION}' -X 'main.BuildTime=${BUILD_TIME}'" -o /opt/agent/baihu-agent-darwin-amd64 . & \ - # CGO_ENABLED=0 GOOS=darwin GOARCH=arm64 go build -ldflags="-s -w -X 'main.Version=${VERSION}' -X 'main.BuildTime=${BUILD_TIME}'" -o /opt/agent/baihu-agent-darwin-arm64 . & \ - wait + # Linux amd64 + CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags="-s -w -X 'main.Version=${VERSION}' -X 'main.BuildTime=${BUILD_TIME}'" -o baihu-agent . && \ + tar -czvf /opt/agent/baihu-agent-linux-amd64.tar.gz baihu-agent config.example.ini && rm baihu-agent && \ + # Linux arm64 + # CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build -ldflags="-s -w -X 'main.Version=${VERSION}' -X 'main.BuildTime=${BUILD_TIME}'" -o baihu-agent . && \ + # tar -czvf /opt/agent/baihu-agent-linux-arm64.tar.gz baihu-agent config.example.ini && rm baihu-agent && \ + # # Windows amd64 + # CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -ldflags="-s -w -X 'main.Version=${VERSION}' -X 'main.BuildTime=${BUILD_TIME}'" -o baihu-agent.exe . && \ + # tar -czvf /opt/agent/baihu-agent-windows-amd64.tar.gz baihu-agent.exe config.example.ini && rm baihu-agent.exe && \ + # # Darwin amd64 + # CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build -ldflags="-s -w -X 'main.Version=${VERSION}' -X 'main.BuildTime=${BUILD_TIME}'" -o baihu-agent . && \ + # tar -czvf /opt/agent/baihu-agent-darwin-amd64.tar.gz baihu-agent config.example.ini && rm baihu-agent && \ + # # Darwin arm64 + # CGO_ENABLED=0 GOOS=darwin GOARCH=arm64 go build -ldflags="-s -w -X 'main.Version=${VERSION}' -X 'main.BuildTime=${BUILD_TIME}'" -o baihu-agent . && \ + # tar -czvf /opt/agent/baihu-agent-darwin-arm64.tar.gz baihu-agent config.example.ini && rm baihu-agent # ================================ # Stage 4: Final image diff --git a/Makefile b/Makefile index 361f3c4..c7289dd 100644 --- a/Makefile +++ b/Makefile @@ -28,13 +28,19 @@ build-all: build-web build build-agent: @mkdir -p data/agent @echo "$(VERSION)" > data/agent/version.txt - cd agent && CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags="-s -w -X 'main.Version=$(VERSION)' -X 'main.BuildTime=$(BUILD_TIME)'" -o ../data/agent/baihu-agent-linux-amd64 . - cd agent && CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build -ldflags="-s -w -X 'main.Version=$(VERSION)' -X 'main.BuildTime=$(BUILD_TIME)'" -o ../data/agent/baihu-agent-linux-arm64 . - cd agent && CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -ldflags="-s -w -X 'main.Version=$(VERSION)' -X 'main.BuildTime=$(BUILD_TIME)'" -o ../data/agent/baihu-agent-windows-amd64.exe . - cd agent && CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build -ldflags="-s -w -X 'main.Version=$(VERSION)' -X 'main.BuildTime=$(BUILD_TIME)'" -o ../data/agent/baihu-agent-darwin-amd64 . - cd agent && CGO_ENABLED=0 GOOS=darwin GOARCH=arm64 go build -ldflags="-s -w -X 'main.Version=$(VERSION)' -X 'main.BuildTime=$(BUILD_TIME)'" -o ../data/agent/baihu-agent-darwin-arm64 . - @echo "Agent binaries built in data/agent/ (for local dev)" - @echo "In Docker, agents are built to /opt/agent/" + @echo "Building and packaging agents..." + cd agent && CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags="-s -w -X 'main.Version=$(VERSION)' -X 'main.BuildTime=$(BUILD_TIME)'" -o baihu-agent . && \ + tar -czvf ../data/agent/baihu-agent-linux-amd64.tar.gz baihu-agent config.example.ini && rm baihu-agent + cd agent && CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build -ldflags="-s -w -X 'main.Version=$(VERSION)' -X 'main.BuildTime=$(BUILD_TIME)'" -o baihu-agent . && \ + tar -czvf ../data/agent/baihu-agent-linux-arm64.tar.gz baihu-agent config.example.ini && rm baihu-agent + cd agent && CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -ldflags="-s -w -X 'main.Version=$(VERSION)' -X 'main.BuildTime=$(BUILD_TIME)'" -o baihu-agent.exe . && \ + tar -czvf ../data/agent/baihu-agent-windows-amd64.tar.gz baihu-agent.exe config.example.ini && rm baihu-agent.exe + cd agent && CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build -ldflags="-s -w -X 'main.Version=$(VERSION)' -X 'main.BuildTime=$(BUILD_TIME)'" -o baihu-agent . && \ + tar -czvf ../data/agent/baihu-agent-darwin-amd64.tar.gz baihu-agent config.example.ini && rm baihu-agent + cd agent && CGO_ENABLED=0 GOOS=darwin GOARCH=arm64 go build -ldflags="-s -w -X 'main.Version=$(VERSION)' -X 'main.BuildTime=$(BUILD_TIME)'" -o baihu-agent . && \ + tar -czvf ../data/agent/baihu-agent-darwin-arm64.tar.gz baihu-agent config.example.ini && rm baihu-agent + @echo "Agent packages built in data/agent/" + @ls -lh data/agent/*.tar.gz # Clean built files clean: @@ -77,14 +83,14 @@ docker-down: # Help help: @echo "Available targets:" - @echo " all - Build the application (default)" - @echo " build - Build the application" - @echo " build-agent - Build agent for all platforms" - @echo " clean - Clean built files" - @echo " run - Run the application" - @echo " deps - Install dependencies" - @echo " docker-build - Build Docker image" - @echo " docker-run - Run Docker container" - @echo " docker-up - Start Docker Compose stack" - @echo " docker-down - Stop Docker Compose stack" - @echo " help - Show this help message" \ No newline at end of file + @echo " all - Build the application (default)" + @echo " build - Build the application" + @echo " build-agent - Build agent packages (tar.gz) for all platforms" + @echo " clean - Clean built files" + @echo " run - Run the application" + @echo " deps - Install dependencies" + @echo " docker-build - Build Docker image" + @echo " docker-run - Run Docker container" + @echo " docker-up - Start Docker Compose stack" + @echo " docker-down - Stop Docker Compose stack" + @echo " help - Show this help message" \ No newline at end of file diff --git a/internal/controllers/agent_controller.go b/internal/controllers/agent_controller.go index 8e9306d..a304fb6 100644 --- a/internal/controllers/agent_controller.go +++ b/internal/controllers/agent_controller.go @@ -317,9 +317,9 @@ func (c *AgentController) Download(ctx *gin.Context) { } ctx.Header("Content-Disposition", "attachment; filename="+filename) - ctx.Header("Content-Type", "application/octet-stream") + ctx.Header("Content-Type", "application/gzip") ctx.Header("Content-Length", strconv.Itoa(len(data))) - ctx.Data(200, "application/octet-stream", data) + ctx.Data(200, "application/gzip", data) } // GetVersion 获取 Agent 最新版本信息 diff --git a/internal/services/agent_service.go b/internal/services/agent_service.go index 90abb9e..7be7b40 100644 --- a/internal/services/agent_service.go +++ b/internal/services/agent_service.go @@ -320,9 +320,11 @@ func (s *AgentService) GetAvailablePlatforms() []map[string]string { for _, f := range files { name := f.Name() - if strings.HasPrefix(name, "baihu-agent-") { - // baihu-agent-linux-amd64, baihu-agent-windows-amd64.exe - parts := strings.Split(strings.TrimSuffix(name, ".exe"), "-") + // baihu-agent-linux-amd64.tar.gz + if strings.HasPrefix(name, "baihu-agent-") && strings.HasSuffix(name, ".tar.gz") { + // 去掉 .tar.gz 后缀 + baseName := strings.TrimSuffix(name, ".tar.gz") + parts := strings.Split(baseName, "-") if len(parts) >= 4 { platforms = append(platforms, map[string]string{ "os": parts[2], @@ -336,12 +338,9 @@ func (s *AgentService) GetAvailablePlatforms() []map[string]string { return platforms } -// GetAgentBinary 获取 Agent 二进制文件 +// GetAgentBinary 获取 Agent 压缩包 func (s *AgentService) GetAgentBinary(osType, arch string) ([]byte, string, error) { - filename := fmt.Sprintf("baihu-agent-%s-%s", osType, arch) - if osType == "windows" { - filename += ".exe" - } + filename := fmt.Sprintf("baihu-agent-%s-%s.tar.gz", osType, arch) // 优先从 /opt/agent 读取(容器内) filePath := filepath.Join("/opt/agent", filename) diff --git a/web/src/views/agents/Agents.vue b/web/src/views/agents/Agents.vue index f40361f..96af6c9 100644 --- a/web/src/views/agents/Agents.vue +++ b/web/src/views/agents/Agents.vue @@ -364,8 +364,8 @@ onUnmounted(() => {

使用说明

-

1. 下载对应平台的 Agent 程序

-

2. 创建 config.ini 配置文件,设置 server_url

+

1. 下载对应平台的 Agent 压缩包并解压

+

2. 修改 config.example.ini 为 config.ini,设置 server_url

3. 运行 ./baihu-agent start 启动

4. 在本页面"未注册"标签中审核通过

5. 可选: ./baihu-agent install 设置开机自启