From 402090d4d68689d7c37b057d36d7e9ad4a7702be Mon Sep 17 00:00:00 2001 From: zhengkunwang223 <1paneldev@sina.com> Date: Sun, 4 Jan 2026 14:28:08 +0800 Subject: [PATCH] feat: Add enable UDP option for TCP/UDP website configuration --- agent/app/dto/request/website.go | 1 + agent/app/dto/response/website.go | 1 + agent/app/service/website.go | 15 +++++++++++++-- agent/app/service/website_utils.go | 8 ++++++-- frontend/src/api/interface/website.ts | 1 + frontend/src/lang/modules/en.ts | 1 + frontend/src/lang/modules/es-es.ts | 1 + frontend/src/lang/modules/ja.ts | 1 + frontend/src/lang/modules/ko.ts | 1 + frontend/src/lang/modules/ms.ts | 1 + frontend/src/lang/modules/pt-br.ts | 1 + frontend/src/lang/modules/ru.ts | 1 + frontend/src/lang/modules/tr.ts | 1 + frontend/src/lang/modules/zh-Hant.ts | 1 + frontend/src/lang/modules/zh.ts | 1 + .../website/website/config/basic/stream/index.vue | 5 +++++ .../src/views/website/website/create/index.vue | 4 ++++ 17 files changed, 41 insertions(+), 4 deletions(-) diff --git a/agent/app/dto/request/website.go b/agent/app/dto/request/website.go index 86ec6f85b497..8b747a4afd82 100644 --- a/agent/app/dto/request/website.go +++ b/agent/app/dto/request/website.go @@ -45,6 +45,7 @@ type StreamConfig struct { StreamPorts string `json:"streamPorts"` Name string `json:"name"` Algorithm string `json:"algorithm"` + UDP bool `json:"udp"` Servers []dto.NginxUpstreamServer `json:"servers"` } diff --git a/agent/app/dto/response/website.go b/agent/app/dto/response/website.go index 15aee9650d56..6e65921e1162 100644 --- a/agent/app/dto/response/website.go +++ b/agent/app/dto/response/website.go @@ -18,6 +18,7 @@ type WebsiteDTO struct { SiteDir string `json:"siteDir"` OpenBaseDir bool `json:"openBaseDir"` Algorithm string `json:"algorithm"` + UDP bool `json:"udp"` Servers []dto.NginxUpstreamServer `json:"servers"` } diff --git a/agent/app/service/website.go b/agent/app/service/website.go index 2d17c1395fab..d897b3c1b1cb 100644 --- a/agent/app/service/website.go +++ b/agent/app/service/website.go @@ -617,6 +617,13 @@ func (w WebsiteService) GetWebsite(id uint) (response.WebsiteDTO, error) { if err != nil { return res, err } + listens := config.FindDirectives("listen") + for _, listen := range listens { + params := listen.GetParameters() + if len(params) > 1 && params[1] == "udp" { + res.UDP = true + } + } upstreams := config.FindUpstreams() for _, up := range upstreams { directives := up.GetDirectives() @@ -2342,10 +2349,14 @@ func (w WebsiteService) UpdateStream(req request.StreamUpdate) error { } server := servers[0] server.Listens = []*components.ServerListen{} + var params []string + if req.UDP { + params = []string{"udp"} + } for _, port := range ports { - server.UpdateListen(port, false) + server.UpdateListen(port, false, params...) if website.IPV6 { - server.UpdateListen("[::]:"+port, false) + server.UpdateListen("[::]:"+port, false, params...) } } upstream := components.Upstream{ diff --git a/agent/app/service/website_utils.go b/agent/app/service/website_utils.go index 5dd2675dfb02..6434fa684ff7 100644 --- a/agent/app/service/website_utils.go +++ b/agent/app/service/website_utils.go @@ -206,10 +206,14 @@ func configDefaultNginx(website *model.Website, domains []model.WebsiteDomain, a } server := servers[0] ports := strings.Split(streamConfig.StreamPorts, ",") + var params []string + if streamConfig.UDP { + params = []string{"udp"} + } for _, port := range ports { - server.UpdateListen(port, false) + server.UpdateListen(port, false, params...) if website.IPV6 { - server.UpdateListen("[::]:"+port, false) + server.UpdateListen("[::]:"+port, false, params...) } } siteFolder := path.Join("/www", "sites", website.Alias) diff --git a/frontend/src/api/interface/website.ts b/frontend/src/api/interface/website.ts index 5476ef2e19b4..ce6af12bfac7 100644 --- a/frontend/src/api/interface/website.ts +++ b/frontend/src/api/interface/website.ts @@ -28,6 +28,7 @@ export namespace Website { dbType: string; favorite: boolean; streamPorts: string; + udp: boolean; } export interface WebsiteDTO extends Website { diff --git a/frontend/src/lang/modules/en.ts b/frontend/src/lang/modules/en.ts index b7c05b03d644..56dc84358d31 100644 --- a/frontend/src/lang/modules/en.ts +++ b/frontend/src/lang/modules/en.ts @@ -2756,6 +2756,7 @@ const message = { streamPortsHelper: 'Set the external listening port number, clients will access the service through this port, separated by commas, e.g., 5222,5223', streamHelper: 'TCP/UDP Port Forwarding and Load Balancing', + udp: 'Enable UDP', syncHtmlHelper: 'Sync to PHP and static websites', }, diff --git a/frontend/src/lang/modules/es-es.ts b/frontend/src/lang/modules/es-es.ts index f9ac932be0d4..9ab16a87fe9f 100644 --- a/frontend/src/lang/modules/es-es.ts +++ b/frontend/src/lang/modules/es-es.ts @@ -2748,6 +2748,7 @@ const message = { streamPortsHelper: 'Configura el número de puerto de escucha externo, los clientes accederán al servicio a través de este puerto, separado por comas, p. ej., 5222,5223', streamHelper: 'Reenvío de Puertos y Balanceo de Carga TCP/UDP', + udp: 'Habilitar UDP', syncHtmlHelper: 'Sincronizar con PHP y sitios web estáticos', }, diff --git a/frontend/src/lang/modules/ja.ts b/frontend/src/lang/modules/ja.ts index 61dca39ecd4a..3062d8a56ee7 100644 --- a/frontend/src/lang/modules/ja.ts +++ b/frontend/src/lang/modules/ja.ts @@ -2679,6 +2679,7 @@ const message = { streamPortsHelper: '外部リスニングポート番号を設定します。クライアントはこのポートを通じてサービスにアクセスします。カンマで区切ってください。例:5222,5223', streamHelper: 'TCP/UDP ポート転送とロードバランシング', + udp: 'UDPを有効化', syncHtmlHelper: 'PHP と静的ウェブサイトに同期', }, diff --git a/frontend/src/lang/modules/ko.ts b/frontend/src/lang/modules/ko.ts index ab53e80c80bb..25217f628b42 100644 --- a/frontend/src/lang/modules/ko.ts +++ b/frontend/src/lang/modules/ko.ts @@ -2635,6 +2635,7 @@ const message = { streamPortsHelper: '외부 수신 포트 번호를 설정합니다. 클라이언트는 이 포트를 통해 서비스에 액세스합니다. 쉼표로 구분하세요. 예: 5222,5223', streamHelper: 'TCP/UDP 포트 포워딩 및 로드 밸런싱', + udp: 'UDP 활성화', syncHtmlHelper: 'PHP 및 정적 웹사이트에 동기화', }, diff --git a/frontend/src/lang/modules/ms.ts b/frontend/src/lang/modules/ms.ts index 59da3b343589..9d12a6cadf8d 100644 --- a/frontend/src/lang/modules/ms.ts +++ b/frontend/src/lang/modules/ms.ts @@ -2737,6 +2737,7 @@ const message = { streamPortsHelper: 'Tetapkan nombor port pendengaran luaran, pelanggan akan mengakses perkhidmatan melalui port ini, dipisahkan dengan koma, cth., 5222,5223', streamHelper: 'Penerusan Port dan Pengimbangan Beban TCP/UDP', + udp: 'Dayakan UDP', syncHtmlHelper: 'Segerakkan ke PHP dan laman web statik', }, diff --git a/frontend/src/lang/modules/pt-br.ts b/frontend/src/lang/modules/pt-br.ts index fc23f103e70e..5c396b37782f 100644 --- a/frontend/src/lang/modules/pt-br.ts +++ b/frontend/src/lang/modules/pt-br.ts @@ -2742,6 +2742,7 @@ const message = { streamPortsHelper: 'Defina o número da porta de escuta externa, os clientes acessarão o serviço através desta porta, separados por vírgulas, por exemplo: 5222,5223', streamHelper: 'Encaminhamento de Portas e Balanceamento de Carga TCP/UDP', + udp: 'Habilitar UDP', syncHtmlHelper: 'Sincronizar com PHP e sites estáticos', }, diff --git a/frontend/src/lang/modules/ru.ts b/frontend/src/lang/modules/ru.ts index 6bff10243974..b2240cdd77be 100644 --- a/frontend/src/lang/modules/ru.ts +++ b/frontend/src/lang/modules/ru.ts @@ -2737,6 +2737,7 @@ const message = { streamPortsHelper: 'Установите номер внешнего порта прослушивания, клиенты будут получать доступ к службе через этот порт, разделяйте запятыми, например: 5222,5223', streamHelper: 'Перенаправление портов и балансировка нагрузки TCP/UDP', + udp: 'Включить UDP', syncHtmlHelper: 'Синхронизировать с PHP и статическими сайтами', }, diff --git a/frontend/src/lang/modules/tr.ts b/frontend/src/lang/modules/tr.ts index 7c7332d26fd1..df00db194526 100644 --- a/frontend/src/lang/modules/tr.ts +++ b/frontend/src/lang/modules/tr.ts @@ -2794,6 +2794,7 @@ const message = { streamPortsHelper: 'Harici dinleme bağlantı noktası numarasını ayarlayın, istemciler bu bağlantı noktası üzerinden hizmete erişecektir, virgülle ayırın, örn.: 5222,5223', streamHelper: 'TCP/UDP Port Yönlendirme ve Yük Dengeleme', + udp: "UDP'yi etkinleştir", syncHtmlHelper: 'PHP ve statik web siteleriyle senkronize et', }, diff --git a/frontend/src/lang/modules/zh-Hant.ts b/frontend/src/lang/modules/zh-Hant.ts index 90fdcf25bdd5..37eb584fbfc9 100644 --- a/frontend/src/lang/modules/zh-Hant.ts +++ b/frontend/src/lang/modules/zh-Hant.ts @@ -2566,6 +2566,7 @@ const message = { streamPorts: '監聽端口', streamPortsHelper: '設定對外監聽的埠號,客戶端將透過此埠存取服務,按逗號分割,例如:5222,5223', streamHelper: 'TCP/UDP 端口轉發與負載均衡', + udp: '啟用 UDP', syncHtmlHelper: '同步到 PHP 和靜態網站', }, diff --git a/frontend/src/lang/modules/zh.ts b/frontend/src/lang/modules/zh.ts index 88ffe0c716d9..9c29ae4813e8 100644 --- a/frontend/src/lang/modules/zh.ts +++ b/frontend/src/lang/modules/zh.ts @@ -2563,6 +2563,7 @@ const message = { streamPorts: '监听端口', streamPortsHelper: '设置对外监听的端口号,客户端将通过此端口访问服务,按逗号分割,例如:5222,5223', streamHelper: 'TCP/UDP 端口转发与负载均衡', + udp: '启用 UDP', syncHtmlHelper: '同步到 PHP 和静态网站', }, diff --git a/frontend/src/views/website/website/config/basic/stream/index.vue b/frontend/src/views/website/website/config/basic/stream/index.vue index 80ffd0d5325a..310fc97caad2 100644 --- a/frontend/src/views/website/website/config/basic/stream/index.vue +++ b/frontend/src/views/website/website/config/basic/stream/index.vue @@ -6,6 +6,9 @@ + + + @@ -39,6 +42,7 @@ const form = ref({ name: '', algorithm: '', websiteID: props.id, + udp: false, }); const streamFormRef = ref(); const lbFormRef = ref(); @@ -68,6 +72,7 @@ onMounted(async () => { form.value.name = res.data.primaryDomain; form.value.algorithm = res.data.algorithm == '' ? 'default' : res.data.algorithm; form.value.streamPorts = res.data.streamPorts; + form.value.udp = res.data.udp; let servers = []; res.data?.servers?.forEach((server) => { diff --git a/frontend/src/views/website/website/create/index.vue b/frontend/src/views/website/website/create/index.vue index 497d6b787445..7dc53f8abea6 100644 --- a/frontend/src/views/website/website/create/index.vue +++ b/frontend/src/views/website/website/create/index.vue @@ -187,6 +187,9 @@ :placeholder="$t('website.streamPortsHelper')" > + + +
@@ -507,6 +510,7 @@ const initData = () => ({ siteDir: '', streamPorts: '', + udp: false, name: '', algorithm: '', servers: [],