refactor: replace custom geo manager with Xray-core native geodata auto-update

Remove the panel-side custom geo download feature (service, controller,
/panel/api/custom-geo/* endpoints, CustomGeoResource model, UI tab) in
favor of Xray-core's native geodata section
(https://xtls.github.io/config/geodata.html).

- pass the top-level "geodata" key through xray.Config so it survives
  the template round-trip into the generated config
- add a Geodata Auto-Update section to the Xray Updates modal that
  edits geodata (cron schedule, download outbound, asset list) in the
  config template and restarts Xray on save
- previously downloaded geo files in the bin folder keep working in
  ext: routing rules; the orphaned custom_geo_resources table is left
  in place so existing source URLs stay recoverable
This commit is contained in:
MHSanaei
2026-06-10 18:27:12 +02:00
parent 4002be4ade
commit 3092326d9e
43 changed files with 416 additions and 2875 deletions
-11
View File
@@ -250,17 +250,6 @@ export const EXAMPLES: Record<string, unknown> = {
"up": 1048576,
"uuid": "e18c9a96-71bf-48d4-933f-8b9a46d4290c"
},
"CustomGeoResource": {
"alias": "",
"createdAt": 0,
"id": 0,
"lastModified": "",
"lastUpdatedAt": 0,
"localPath": "",
"type": "",
"updatedAt": 0,
"url": ""
},
"FallbackParentInfo": {
"masterId": 0,
"path": ""
-43
View File
@@ -1193,49 +1193,6 @@ export const SCHEMAS: Record<string, unknown> = {
],
"type": "object"
},
"CustomGeoResource": {
"properties": {
"alias": {
"type": "string"
},
"createdAt": {
"type": "integer"
},
"id": {
"type": "integer"
},
"lastModified": {
"type": "string"
},
"lastUpdatedAt": {
"type": "integer"
},
"localPath": {
"type": "string"
},
"type": {
"type": "string"
},
"updatedAt": {
"type": "integer"
},
"url": {
"type": "string"
}
},
"required": [
"alias",
"createdAt",
"id",
"lastModified",
"lastUpdatedAt",
"localPath",
"type",
"updatedAt",
"url"
],
"type": "object"
},
"FallbackParentInfo": {
"description": "FallbackParentInfo carries everything the frontend needs to rewrite a\nchild inbound's client link: where to connect (the master's address\nand port) and which path matched on the master's fallbacks array.\nThe frontend already has the master inbound in its dbInbounds list,\nso we only ship identifiers + the match path here.",
"properties": {
-12
View File
@@ -263,18 +263,6 @@ export interface ClientTraffic {
uuid: string;
}
export interface CustomGeoResource {
alias: string;
createdAt: number;
id: number;
lastModified: string;
lastUpdatedAt: number;
localPath: string;
type: string;
updatedAt: number;
url: string;
}
export interface FallbackParentInfo {
masterId: number;
path?: string;
-13
View File
@@ -280,19 +280,6 @@ export const ClientTrafficSchema = z.object({
});
export type ClientTraffic = z.infer<typeof ClientTrafficSchema>;
export const CustomGeoResourceSchema = z.object({
alias: z.string(),
createdAt: z.number().int(),
id: z.number().int(),
lastModified: z.string(),
lastUpdatedAt: z.number().int(),
localPath: z.string(),
type: z.string(),
updatedAt: z.number().int(),
url: z.string(),
});
export type CustomGeoResource = z.infer<typeof CustomGeoResourceSchema>;
export const FallbackParentInfoSchema = z.object({
masterId: z.number().int(),
path: z.string().optional(),