diff --git a/.github/workflows/docker-build.yml b/.github/workflows/docker-build.yml index af7781c..ae67b8d 100644 --- a/.github/workflows/docker-build.yml +++ b/.github/workflows/docker-build.yml @@ -2,7 +2,7 @@ name: Build and Push Images Based on Version # 在这里定义统一版本号 env: - VERSION: "1.4.2" + VERSION: "1.4.3" on: push: diff --git a/docker-compose-v4.yml b/docker-compose-v4.yml index 38adff3..59819f4 100644 --- a/docker-compose-v4.yml +++ b/docker-compose-v4.yml @@ -26,7 +26,7 @@ services: retries: 10 backend: - image: bqlpfy/springboot-backend:1.4.2 + image: bqlpfy/springboot-backend:1.4.3 container_name: springboot-backend restart: unless-stopped environment: @@ -54,7 +54,7 @@ services: start_period: 90s frontend: - image: bqlpfy/vite-frontend:1.4.2 + image: bqlpfy/vite-frontend:1.4.3 container_name: vite-frontend restart: unless-stopped ports: diff --git a/docker-compose-v6.yml b/docker-compose-v6.yml index f552810..03bb011 100644 --- a/docker-compose-v6.yml +++ b/docker-compose-v6.yml @@ -26,7 +26,7 @@ services: retries: 10 backend: - image: bqlpfy/springboot-backend:1.4.2 + image: bqlpfy/springboot-backend:1.4.3 container_name: springboot-backend restart: unless-stopped environment: @@ -54,7 +54,7 @@ services: start_period: 90s frontend: - image: bqlpfy/vite-frontend:1.4.2 + image: bqlpfy/vite-frontend:1.4.3 container_name: vite-frontend restart: unless-stopped ports: diff --git a/go-gost/x/socket/websocket_reporter.go b/go-gost/x/socket/websocket_reporter.go index dc7db66..bef724a 100644 --- a/go-gost/x/socket/websocket_reporter.go +++ b/go-gost/x/socket/websocket_reporter.go @@ -14,8 +14,8 @@ import ( "time" "github.com/go-gost/x/config" - "github.com/go-gost/x/service" "github.com/go-gost/x/internal/util/crypto" + "github.com/go-gost/x/service" "github.com/gorilla/websocket" "github.com/shirou/gopsutil/v3/cpu" "github.com/shirou/gopsutil/v3/host" @@ -87,6 +87,9 @@ type TcpPingResponse struct { type WebSocketReporter struct { url string + addr string // 保存服务器地址 + secret string // 保存密钥 + version string // 保存版本号 conn *websocket.Conn reconnectTime time.Duration pingInterval time.Duration @@ -195,7 +198,25 @@ func (w *WebSocketReporter) connect() error { w.connecting = false }() - u, err := url.Parse(w.url) + // 重新读取 config.json 获取最新的协议配置 + type LocalConfig struct { + Addr string `json:"addr"` + Secret string `json:"secret"` + Http int `json:"http"` + Tls int `json:"tls"` + Socks int `json:"socks"` + } + + var cfg LocalConfig + if b, err := os.ReadFile("config.json"); err == nil { + json.Unmarshal(b, &cfg) + } + + // 使用最新的配置重新构建 URL + currentURL := "ws://" + w.addr + "/system-info?type=1&secret=" + w.secret + "&version=" + w.version + + "&http=" + strconv.Itoa(cfg.Http) + "&tls=" + strconv.Itoa(cfg.Tls) + "&socks=" + strconv.Itoa(cfg.Socks) + + u, err := url.Parse(currentURL) if err != nil { return fmt.Errorf("解析URL失败: %v", err) } @@ -225,7 +246,7 @@ func (w *WebSocketReporter) connect() error { return nil }) - fmt.Printf("✅ WebSocket连接建立成功\n") + fmt.Printf("✅ WebSocket连接建立成功 (http=%d, tls=%d, socks=%d)\n", cfg.Http, cfg.Tls, cfg.Socks) return nil } @@ -775,81 +796,81 @@ func (w *WebSocketReporter) handleDeleteLimiter(data interface{}) error { // handleSetProtocol 处理设置屏蔽协议的命令 func (w *WebSocketReporter) handleSetProtocol(data interface{}) error { - jsonData, err := json.Marshal(data) - if err != nil { - return fmt.Errorf("序列化协议设置失败: %v", err) - } + jsonData, err := json.Marshal(data) + if err != nil { + return fmt.Errorf("序列化协议设置失败: %v", err) + } - // 支持 {"http":0/1, "tls":0/1, "socks":0/1} - var req struct { - HTTP *int `json:"http"` - TLS *int `json:"tls"` - SOCKS *int `json:"socks"` - } - if err := json.Unmarshal(jsonData, &req); err != nil { - return fmt.Errorf("解析协议设置失败: %v", err) - } + // 支持 {"http":0/1, "tls":0/1, "socks":0/1} + var req struct { + HTTP *int `json:"http"` + TLS *int `json:"tls"` + SOCKS *int `json:"socks"` + } + if err := json.Unmarshal(jsonData, &req); err != nil { + return fmt.Errorf("解析协议设置失败: %v", err) + } - // 读取当前值作为默认 - httpVal, tlsVal, socksVal := 0, 0, 0 + // 读取当前值作为默认 + httpVal, tlsVal, socksVal := 0, 0, 0 - if req.HTTP != nil { - if *req.HTTP != 0 && *req.HTTP != 1 { - return fmt.Errorf("http 取值必须为0或1") - } - httpVal = *req.HTTP - } - if req.TLS != nil { - if *req.TLS != 0 && *req.TLS != 1 { - return fmt.Errorf("tls 取值必须为0或1") - } - tlsVal = *req.TLS - } - if req.SOCKS != nil { - if *req.SOCKS != 0 && *req.SOCKS != 1 { - return fmt.Errorf("socks 取值必须为0或1") - } - socksVal = *req.SOCKS - } + if req.HTTP != nil { + if *req.HTTP != 0 && *req.HTTP != 1 { + return fmt.Errorf("http 取值必须为0或1") + } + httpVal = *req.HTTP + } + if req.TLS != nil { + if *req.TLS != 0 && *req.TLS != 1 { + return fmt.Errorf("tls 取值必须为0或1") + } + tlsVal = *req.TLS + } + if req.SOCKS != nil { + if *req.SOCKS != 0 && *req.SOCKS != 1 { + return fmt.Errorf("socks 取值必须为0或1") + } + socksVal = *req.SOCKS + } - // 设置至 service,全量传递(未提供的值沿用0) - service.SetProtocolBlock(httpVal, tlsVal, socksVal) + // 设置至 service,全量传递(未提供的值沿用0) + service.SetProtocolBlock(httpVal, tlsVal, socksVal) - // 同步写入本地 config.json - if err := updateLocalConfigJSON(httpVal, tlsVal, socksVal); err != nil { - return fmt.Errorf("写入config.json失败: %v", err) - } - return nil + // 同步写入本地 config.json + if err := updateLocalConfigJSON(httpVal, tlsVal, socksVal); err != nil { + return fmt.Errorf("写入config.json失败: %v", err) + } + return nil } // updateLocalConfigJSON 将 http/tls/socks 写入工作目录下的 config.json func updateLocalConfigJSON(httpVal int, tlsVal int, socksVal int) error { - path := "config.json" + path := "config.json" - // 读取现有配置 - type LocalConfig struct { - Addr string `json:"addr"` - Secret string `json:"secret"` - Http int `json:"http"` - Tls int `json:"tls"` - Socks int `json:"socks"` - } + // 读取现有配置 + type LocalConfig struct { + Addr string `json:"addr"` + Secret string `json:"secret"` + Http int `json:"http"` + Tls int `json:"tls"` + Socks int `json:"socks"` + } - var cfg LocalConfig - if b, err := os.ReadFile(path); err == nil { - _ = json.Unmarshal(b, &cfg) - } + var cfg LocalConfig + if b, err := os.ReadFile(path); err == nil { + _ = json.Unmarshal(b, &cfg) + } - cfg.Http = httpVal - cfg.Tls = tlsVal - cfg.Socks = socksVal + cfg.Http = httpVal + cfg.Tls = tlsVal + cfg.Socks = socksVal - // 写回 - data, err := json.MarshalIndent(cfg, "", " ") - if err != nil { - return err - } - return os.WriteFile(path, data, 0644) + // 写回 + data, err := json.MarshalIndent(cfg, "", " ") + if err != nil { + return err + } + return os.WriteFile(path, data, 0644) } // handleCall 处理服务端的call回调消息 @@ -1021,12 +1042,16 @@ func getMemoryInfo() MemoryInfo { // StartWebSocketReporterWithConfig 使用配置字段启动WebSocket报告器 func StartWebSocketReporterWithConfig(addr string, secret string, http int, tls int, socks int, version string) *WebSocketReporter { - // 构建包含本机IP的WebSocket URL + // 构建初始 WebSocket URL fullURL := "ws://" + addr + "/system-info?type=1&secret=" + secret + "&version=" + version + "&http=" + strconv.Itoa(http) + "&tls=" + strconv.Itoa(tls) + "&socks=" + strconv.Itoa(socks) fmt.Printf("🔗 WebSocket连接URL: %s\n", fullURL) reporter := NewWebSocketReporter(fullURL, secret) + // 保存 addr, secret, version 供重连时使用 + reporter.addr = addr + reporter.secret = secret + reporter.version = version reporter.Start() return reporter } @@ -1107,6 +1132,32 @@ func tcpPingHost(ip string, port int, count int, timeoutMs int) (float64, float6 fmt.Printf("🔍 开始TCP ping测试: %s,次数: %d,超时: %dms\n", target, count, timeoutMs) + // 如果是域名,先解析一次DNS,避免每次连接都重新解析导致延迟累加 + if net.ParseIP(ip) == nil { + // 是域名,需要解析 + fmt.Printf("🔍 检测到域名,正在解析DNS...\n") + dnsStart := time.Now() + + addrs, err := net.LookupHost(ip) + dnsDuration := time.Since(dnsStart) + + if err != nil { + return 0, 100.0, fmt.Errorf("DNS解析失败: %v", err) + } + if len(addrs) == 0 { + return 0, 100.0, fmt.Errorf("DNS解析未返回任何IP地址") + } + + fmt.Printf("✅ DNS解析完成 (%.2fms),解析到 %d 个IP: %v\n", + dnsDuration.Seconds()*1000, len(addrs), addrs) + + // 使用第一个解析到的IP进行测试 + target = net.JoinHostPort(addrs[0], fmt.Sprintf("%d", port)) + fmt.Printf("🎯 使用IP地址进行测试: %s\n", target) + } else { + fmt.Printf("🎯 使用IP地址进行测试: %s\n", target) + } + for i := 0; i < count; i++ { start := time.Now() diff --git a/install.sh b/install.sh index 3f750e0..cbdd6bc 100644 --- a/install.sh +++ b/install.sh @@ -1,6 +1,6 @@ #!/bin/bash # 下载地址 -DOWNLOAD_URL="https://github.com/bqlpfy/flux-panel/releases/download/1.4.2/gost" +DOWNLOAD_URL="https://github.com/bqlpfy/flux-panel/releases/download/1.4.3/gost" INSTALL_DIR="/etc/gost" COUNTRY=$(curl -s https://ipinfo.io/country) if [ "$COUNTRY" = "CN" ]; then diff --git a/panel_install.sh b/panel_install.sh index ccc74ab..ea1489c 100755 --- a/panel_install.sh +++ b/panel_install.sh @@ -8,9 +8,9 @@ export LC_ALL=C # 全局下载地址配置 -DOCKER_COMPOSEV4_URL="https://github.com/bqlpfy/flux-panel/releases/download/1.4.2/docker-compose-v4.yml" -DOCKER_COMPOSEV6_URL="https://github.com/bqlpfy/flux-panel/releases/download/1.4.2/docker-compose-v6.yml" -GOST_SQL_URL="https://github.com/bqlpfy/flux-panel/releases/download/1.4.2/gost.sql" +DOCKER_COMPOSEV4_URL="https://github.com/bqlpfy/flux-panel/releases/download/1.4.3/docker-compose-v4.yml" +DOCKER_COMPOSEV6_URL="https://github.com/bqlpfy/flux-panel/releases/download/1.4.3/docker-compose-v6.yml" +GOST_SQL_URL="https://github.com/bqlpfy/flux-panel/releases/download/1.4.3/gost.sql" COUNTRY=$(curl -s https://ipinfo.io/country) if [ "$COUNTRY" = "CN" ]; then diff --git a/springboot-backend/src/main/java/com/admin/service/impl/NodeServiceImpl.java b/springboot-backend/src/main/java/com/admin/service/impl/NodeServiceImpl.java index 64a11bb..52a9133 100644 --- a/springboot-backend/src/main/java/com/admin/service/impl/NodeServiceImpl.java +++ b/springboot-backend/src/main/java/com/admin/service/impl/NodeServiceImpl.java @@ -363,7 +363,7 @@ public class NodeServiceImpl extends ServiceImpl implements No StringBuilder command = new StringBuilder(); // 第一部分:下载安装脚本 - command.append("curl -L https://github.com/bqlpfy/flux-panel/releases/download/1.4.2/install.sh") + command.append("curl -L https://github.com/bqlpfy/flux-panel/releases/download/1.4.3/install.sh") .append(" -o ./install.sh && chmod +x ./install.sh && "); // 处理服务器地址,如果是IPv6需要添加方括号 diff --git a/vite-frontend/src/config/site.ts b/vite-frontend/src/config/site.ts index 9b22614..8a66f4b 100644 --- a/vite-frontend/src/config/site.ts +++ b/vite-frontend/src/config/site.ts @@ -4,7 +4,7 @@ export type SiteConfig = typeof siteConfig; // 缓存相关常量 const CACHE_PREFIX = 'vite_config_'; -const VERSION = "1.4.2"; +const VERSION = "1.4.3"; const APP_VERSION = "1.0.3"; const getInitialConfig = () => {