diff --git a/internal/report/tool.go b/internal/report/tool.go index 76894c2..25438cc 100644 --- a/internal/report/tool.go +++ b/internal/report/tool.go @@ -5,6 +5,9 @@ import ( "net" "os" + "github.com/go-resty/resty/v2" + "github.com/perfect-panel/server/pkg/constant" + "github.com/perfect-panel/server/pkg/logger" "github.com/pkg/errors" ) @@ -43,9 +46,64 @@ func GatewayPort() (int, error) { var port int _, err := fmt.Sscanf(value, "%d", &port) if err != nil { + logger.Errorf("Failed to parse GATEWAY_PORT: %v Value %s", err.Error(), value) panic(err) } return port, nil } return 0, errors.New("could not determine gateway port") } + +// RegisterModule registers a module with the gateway. +func RegisterModule(port int) error { + // 从环境变量中读取网关模块端口 + gatewayPort, err := GatewayPort() + if err != nil { + return err + } + + // 从环境变量中获取通讯密钥 + value, exists := os.LookupEnv("SECRET_KEY") + if !exists { + panic("could not determine secret key") + } + + var response RegisterResponse + + client := resty.New().SetBaseURL(fmt.Sprintf("http://127.0.0.1:%d", gatewayPort)) + result, err := client.R().SetHeader("Content-Type", "application/json").SetBody(RegisterServiceRequest{ + Secret: value, + ProxyPath: "/api", + ServiceURL: fmt.Sprintf("http://127.0.0.1:%d", port), + Repository: "https://github.com/perfect-panel/server", + ServiceName: "ApiService", + ServiceVersion: constant.Version, + }).SetResult(&response).Post(RegisterAPI) + + if err != nil { + return err + } + + if result.IsError() { + return errors.New("failed to register module: " + result.Status()) + } + + if !response.Success { + return errors.New("failed to register module: " + response.Message) + } + logger.Infof("Module registered successfully: %s", response.Message) + return nil +} + +// IsGatewayMode checks if the application is running in gateway mode. +// It returns true if GATEWAY_MODE is set to "true" and GATEWAY_PORT is valid. +func IsGatewayMode() bool { + value, exists := os.LookupEnv("GATEWAY_MODE") + if exists && value == "true" { + if _, err := GatewayPort(); err == nil { + return true + } + } + + return false +} diff --git a/internal/report/types.go b/internal/report/types.go new file mode 100644 index 0000000..51d3c1a --- /dev/null +++ b/internal/report/types.go @@ -0,0 +1,16 @@ +package report + +// RegisterServiceResponse 模块注册请求参数 +type RegisterServiceResponse struct { + Success bool `json:"success"` // 注册是否成功 + Message string `json:"message"` // 返回信息 +} + +type RegisterServiceRequest struct { + Secret string `json:"secret"` // 通讯密钥 + ProxyPath string `json:"proxy_path"` // 代理路径 + ServiceURL string `json:"service_url"` // 服务地址 + Repository string `json:"repository"` // 服务代码仓库 + ServiceName string `json:"service_name"` // 服务名称 + ServiceVersion string `json:"service_version"` // 服务版本 +} diff --git a/internal/server.go b/internal/server.go index 64c2704..559c510 100644 --- a/internal/server.go +++ b/internal/server.go @@ -8,6 +8,7 @@ import ( "net/http" "time" + "github.com/perfect-panel/server/internal/report" "github.com/perfect-panel/server/pkg/logger" "github.com/perfect-panel/server/pkg/proc" @@ -65,9 +66,32 @@ func (m *Service) Start() { if m.svc == nil { panic("config file path is nil") } + // init service r := initServer(m.svc) - serverAddr := fmt.Sprintf("%v:%d", m.svc.Config.Host, m.svc.Config.Port) + // get server port + port := m.svc.Config.Port + host := m.svc.Config.Host + // check gateway mode + if report.IsGatewayMode() { + // get free port + freePort, err := report.ModulePort() + if err != nil { + logger.Errorf("get module port error: %s", err.Error()) + panic(err) + } + port = freePort + host = "127.0.0.1" + // register module + err = report.RegisterModule(port) + if err != nil { + logger.Errorf("register module error: %s", err.Error()) + panic(err) + } + logger.Infof("module registered on port %d", port) + } + + serverAddr := fmt.Sprintf("%v:%d", host, port) m.server = &http.Server{ Addr: serverAddr, Handler: r,