diff --git a/openflare_server/service/config_version.go b/openflare_server/service/config_version.go index 2ebf702d..b95d22ca 100644 --- a/openflare_server/service/config_version.go +++ b/openflare_server/service/config_version.go @@ -568,17 +568,18 @@ func buildSnapshotRoutes(routes []*model.ProxyRoute) ([]snapshotRoute, error) { } func resolveTunnelOpenRestyUpstreamURL() string { - port := 8080 relayNodes, err := model.ListNodesByType("tunnel_relay") - if err == nil { + if err == nil && len(relayNodes) > 0 { for _, node := range relayNodes { - if node != nil && node.RelayVhostHTTPPort > 0 { - port = node.RelayVhostHTTPPort - break + if node != nil { + addr := relayAgentAddress(node) + if addr != "" { + return "http://" + addr + } } } } - return fmt.Sprintf("http://127.0.0.1:%d", port) + return "http://127.0.0.1:8080" } func buildSnapshotWAFDocument(routes []*model.ProxyRoute) (snapshotWAFDocument, error) { diff --git a/openflare_server/service/relay.go b/openflare_server/service/relay.go index 335dadcf..867b39f5 100644 --- a/openflare_server/service/relay.go +++ b/openflare_server/service/relay.go @@ -436,6 +436,33 @@ func relayClientAddress(node *model.Node) string { return fmt.Sprintf("%s:%d", addr, port) } +func relayAgentAddress(node *model.Node) string { + if node == nil { + return "" + } + port := node.RelayVhostHTTPPort + if port <= 0 { + port = 8080 + } + addr := strings.TrimSpace(node.RelayAgentAccessAddr) + if addr == "" { + addr = strings.TrimSpace(node.RelayClientAccessAddr) + } + if addr == "" { + addr = strings.TrimSpace(node.IP) + } + if addr == "" { + return fmt.Sprintf("127.0.0.1:%d", port) + } + if _, _, err := net.SplitHostPort(addr); err == nil { + return addr + } + if strings.Contains(addr, ":") && strings.Count(addr, ":") > 1 { + return net.JoinHostPort(addr, strconv.Itoa(port)) + } + return fmt.Sprintf("%s:%d", addr, port) +} + func parseTunnelTargetAddr(addr string) (string, int) { addr = strings.TrimSpace(addr) if addr == "" { diff --git a/openflare_server/service/relay_test.go b/openflare_server/service/relay_test.go index 1e8f7b2d..b131ae27 100644 --- a/openflare_server/service/relay_test.go +++ b/openflare_server/service/relay_test.go @@ -348,7 +348,7 @@ func TestTunnelRoutePublishAndFlaredConfigUseRelayPorts(t *testing.T) { if err != nil { t.Fatalf("PublishConfigVersion failed: %v", err) } - if !strings.Contains(result.Version.RenderedConfig, "server 127.0.0.1:18080 max_fails=3 fail_timeout=10s;") { + if !strings.Contains(result.Version.RenderedConfig, "server de-e:18080 max_fails=3 fail_timeout=10s;") { t.Fatalf("expected rendered OpenResty upstream to use relay vhost port, got:\n%s", result.Version.RenderedConfig) } diff --git a/openflare_server/web/features/nodes/components/node-editor-modal.tsx b/openflare_server/web/features/nodes/components/node-editor-modal.tsx index 80a116ab..2acf7373 100644 --- a/openflare_server/web/features/nodes/components/node-editor-modal.tsx +++ b/openflare_server/web/features/nodes/components/node-editor-modal.tsx @@ -47,6 +47,7 @@ const nodeEditorSchema = z ip_manual_override: z.boolean(), auto_update_enabled: z.boolean(), relay_bind_port: z.string().trim(), + relay_vhost_http_port: z.string().trim(), relay_client_access_addr: z.string().trim(), relay_agent_access_addr: z.string().trim(), relay_client_proxy_url: z.string().trim(), @@ -74,6 +75,14 @@ const nodeEditorSchema = z message: '请填写正确的端口号 (1-65535)', }); } + const vhostPort = Number(values.relay_vhost_http_port); + if (Number.isNaN(vhostPort) || vhostPort < 1 || vhostPort > 65535) { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + path: ['relay_vhost_http_port'], + message: '请填写正确的端口号 (1-65535)', + }); + } } if (!values.geo_manual_override) { @@ -129,6 +138,7 @@ const defaultValues: NodeEditorValues = { ip_manual_override: false, auto_update_enabled: false, relay_bind_port: '7000', + relay_vhost_http_port: '8080', relay_client_access_addr: '', relay_agent_access_addr: '', relay_client_proxy_url: '', @@ -219,6 +229,7 @@ function buildFormValues(node?: Partial | null): NodeEditorValues { ip_manual_override: node.ip_manual_override ?? false, auto_update_enabled: node.auto_update_enabled ?? false, relay_bind_port: String(node.relay_bind_port ?? 7000), + relay_vhost_http_port: String(node.relay_vhost_http_port ?? 8080), relay_client_access_addr: node.relay_client_access_addr ?? '', relay_agent_access_addr: node.relay_agent_access_addr ?? '', relay_client_proxy_url: node.relay_client_proxy_url ?? '', @@ -244,6 +255,7 @@ function toPayload(values: NodeEditorValues): NodeMutationPayload { ip_manual_override: values.ip_manual_override, auto_update_enabled: values.auto_update_enabled, relay_bind_port: values.type === 'tunnel_relay' ? Number(values.relay_bind_port) : undefined, + relay_vhost_http_port: values.type === 'tunnel_relay' ? Number(values.relay_vhost_http_port) : undefined, relay_client_access_addr: values.type === 'tunnel_relay' ? values.relay_client_access_addr.trim() : undefined, relay_agent_access_addr: values.type === 'tunnel_relay' ? values.relay_agent_access_addr.trim() : undefined, relay_client_proxy_url: values.type === 'tunnel_relay' ? values.relay_client_proxy_url.trim() : undefined, @@ -383,6 +395,14 @@ export function NodeEditorModal({ + + + +
-

{route.origin_url}

+

{getUpstreamSummary(route)}

回源主机名: {route.origin_host || '$host'}

diff --git a/openflare_server/web/tests/unit/nodes-utils.test.ts b/openflare_server/web/tests/unit/nodes-utils.test.ts index 9c4b5100..fadf4203 100644 --- a/openflare_server/web/tests/unit/nodes-utils.test.ts +++ b/openflare_server/web/tests/unit/nodes-utils.test.ts @@ -12,6 +12,7 @@ function buildNode(overrides: Partial = {}): NodeItem { ip: '127.0.0.1', ip_manual_override: false, relay_bind_port: 7000, + relay_vhost_http_port: 8080, relay_client_access_addr: '', relay_agent_access_addr: '', relay_client_proxy_url: '',