fix: agent install.sh 404 + 三阶段构建编译agent二进制

问题: 构建上下文 ./backend 无法访问 ../agent, 导致容器内
/app/agent/deploy/install.sh 不存在, 返回 404

修复:
- Dockerfile 改为三阶段构建 (backend go1.21 + agent go1.24 交叉编译 + alpine runtime)
- docker-compose backend build context 改为项目根
- routes.go /agent/arch 安装命令改为动态获取 URL
- 新增 .dockerignore
- agent_install.go: SSH 远程安装 handler
- AgentWizard.tsx: 复制按钮 fallback + 动态 server URL
- ServerTableRow.tsx: agent 状态判断

验证: curl|bash 安装成功, agent 上报数据到 MySQL ✅
This commit is contained in:
Logan committed 2026-06-18 09:44:12 +08:00
1 parent d0344c2f52
commit d0b94d39c0
9 files changed
+281 -38

No files matched your search

+19 -1
View File
@@ -4,6 +4,7 @@ import (
"ezops/internal/api/handlers"
"ezops/internal/api/middleware"
"ezops/internal/config"
"fmt"
"github.com/gin-gonic/gin"
"go.uber.org/zap"
@@ -28,6 +29,19 @@ func Register(r *gin.Engine, db *gorm.DB, log *zap.Logger, cfg *config.Config) {
r.StaticFile("/agent/aiops-agent-linux-arm64", "./agent/bin/aiops-agent-linux-arm64")
r.StaticFile("/agent/aiops-agent-darwin-arm64", "./agent/bin/aiops-agent-darwin-arm64") // macOS Apple Silicon // Logan.Li
r.GET("/agent/arch", func(c *gin.Context) {
// 动态构建安装命令 URL(根据请求来源,兼容 nginx 反代)
scheme := "http"
if c.Request.TLS != nil {
scheme = "https"
}
if proto := c.GetHeader("X-Forwarded-Proto"); proto != "" {
scheme = proto
}
host := c.Request.Host
if host == "" {
host = "localhost:8080"
}
base := fmt.Sprintf("%s://%s", scheme, host)
c.JSON(200, gin.H{
"version": "1.0.0",
"downloads": gin.H{
@@ -35,7 +49,7 @@ func Register(r *gin.Engine, db *gorm.DB, log *zap.Logger, cfg *config.Config) {
"linux-arm64": "/agent/aiops-agent-linux-arm64",
"darwin-arm64": "/agent/aiops-agent-darwin-arm64",
},
"install": "curl -fsSL http://<server>:8080/agent/install.sh | sudo bash -s -- --server http://<server>:8080 --token <token>",
"install": fmt.Sprintf("curl -fsSL %s/agent/install.sh | sudo bash -s -- --server %s --token <token>", base, base),
})
})
@@ -122,6 +136,10 @@ func Register(r *gin.Engine, db *gorm.DB, log *zap.Logger, cfg *config.Config) {
servers.DELETE("/:id", serverHandler.DeleteServer)
servers.POST("/batch-delete", serverHandler.BatchDeleteServers)
servers.POST("/batch", serverHandler.BatchCreateServers)
// Agent 远程安装 // Logan.Li
agentInstallHandler := handlers.NewAgentInstallHandler(db)
servers.POST("/:id/install-agent", agentInstallHandler.InstallAgent)
}
// 云账号路由