mirror of
https://github.com/MHSanaei/3x-ui.git
synced 2026-07-09 06:06:08 +00:00
feat: replace panel proxy URL with outbound-based egress bridge
Instead of requiring a manual SOCKS5/HTTP URL, the panel now lets the admin pick an Xray outbound from a dropdown (same UX as Geodata Auto-Update). At runtime, injectPanelEgress appends a loopback SOCKS inbound (tag: panel-egress) and prepends a routing rule so the panel's own HTTP traffic — version checks, Telegram, normal geo-file updates — is routed through the chosen outbound. Xray-native Geodata Auto-Update is unaffected (it uses its own geodata.outbound inside Xray). Blackhole outbounds are excluded from both picker dropdowns since routing any download through one just drops it. Translations updated for all 13 locales.
This commit is contained in:
@@ -26,7 +26,7 @@ export const EXAMPLES: Record<string, unknown> = {
|
||||
"ldapUserFilter": "",
|
||||
"ldapVlessField": "",
|
||||
"pageSize": 0,
|
||||
"panelProxy": "",
|
||||
"panelOutbound": "",
|
||||
"remarkModel": "",
|
||||
"restartXrayOnClientDisable": false,
|
||||
"sessionMaxAge": 1,
|
||||
@@ -115,7 +115,7 @@ export const EXAMPLES: Record<string, unknown> = {
|
||||
"ldapUserFilter": "",
|
||||
"ldapVlessField": "",
|
||||
"pageSize": 0,
|
||||
"panelProxy": "",
|
||||
"panelOutbound": "",
|
||||
"remarkModel": "",
|
||||
"restartXrayOnClientDisable": false,
|
||||
"sessionMaxAge": 1,
|
||||
|
||||
@@ -94,8 +94,8 @@ export const SCHEMAS: Record<string, unknown> = {
|
||||
"minimum": 0,
|
||||
"type": "integer"
|
||||
},
|
||||
"panelProxy": {
|
||||
"description": "Proxy URL for the panel's own outbound requests (GitHub/Telegram)",
|
||||
"panelOutbound": {
|
||||
"description": "Xray outbound tag for the panel's own outbound HTTP (update checks/downloads, Telegram, geo updates, outbound-subscription fetches)",
|
||||
"type": "string"
|
||||
},
|
||||
"remarkModel": {
|
||||
@@ -357,7 +357,7 @@ export const SCHEMAS: Record<string, unknown> = {
|
||||
"ldapUserFilter",
|
||||
"ldapVlessField",
|
||||
"pageSize",
|
||||
"panelProxy",
|
||||
"panelOutbound",
|
||||
"remarkModel",
|
||||
"restartXrayOnClientDisable",
|
||||
"sessionMaxAge",
|
||||
@@ -528,8 +528,8 @@ export const SCHEMAS: Record<string, unknown> = {
|
||||
"minimum": 0,
|
||||
"type": "integer"
|
||||
},
|
||||
"panelProxy": {
|
||||
"description": "Proxy URL for the panel's own outbound requests (GitHub/Telegram)",
|
||||
"panelOutbound": {
|
||||
"description": "Xray outbound tag for the panel's own outbound HTTP (update checks/downloads, Telegram, geo updates, outbound-subscription fetches)",
|
||||
"type": "string"
|
||||
},
|
||||
"remarkModel": {
|
||||
@@ -797,7 +797,7 @@ export const SCHEMAS: Record<string, unknown> = {
|
||||
"ldapUserFilter",
|
||||
"ldapVlessField",
|
||||
"pageSize",
|
||||
"panelProxy",
|
||||
"panelOutbound",
|
||||
"remarkModel",
|
||||
"restartXrayOnClientDisable",
|
||||
"sessionMaxAge",
|
||||
|
||||
@@ -30,7 +30,7 @@ export interface AllSetting {
|
||||
ldapUserFilter: string;
|
||||
ldapVlessField: string;
|
||||
pageSize: number;
|
||||
panelProxy: string;
|
||||
panelOutbound: string;
|
||||
remarkModel: string;
|
||||
restartXrayOnClientDisable: boolean;
|
||||
sessionMaxAge: number;
|
||||
@@ -120,7 +120,7 @@ export interface AllSettingView {
|
||||
ldapUserFilter: string;
|
||||
ldapVlessField: string;
|
||||
pageSize: number;
|
||||
panelProxy: string;
|
||||
panelOutbound: string;
|
||||
remarkModel: string;
|
||||
restartXrayOnClientDisable: boolean;
|
||||
sessionMaxAge: number;
|
||||
|
||||
@@ -38,7 +38,7 @@ export const AllSettingSchema = z.object({
|
||||
ldapUserFilter: z.string(),
|
||||
ldapVlessField: z.string(),
|
||||
pageSize: z.number().int().min(0).max(1000),
|
||||
panelProxy: z.string(),
|
||||
panelOutbound: z.string(),
|
||||
remarkModel: z.string(),
|
||||
restartXrayOnClientDisable: z.boolean(),
|
||||
sessionMaxAge: z.number().int().min(1).max(525600),
|
||||
@@ -129,7 +129,7 @@ export const AllSettingViewSchema = z.object({
|
||||
ldapUserFilter: z.string(),
|
||||
ldapVlessField: z.string(),
|
||||
pageSize: z.number().int().min(0).max(1000),
|
||||
panelProxy: z.string(),
|
||||
panelOutbound: z.string(),
|
||||
remarkModel: z.string(),
|
||||
restartXrayOnClientDisable: z.boolean(),
|
||||
sessionMaxAge: z.number().int().min(1).max(525600),
|
||||
|
||||
Reference in New Issue
Block a user