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 @@