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
+13 -42
View File
@@ -219,48 +219,19 @@
"geofilesUpdateDialogDesc": "با این کار همه فایل‌ها به‌روزرسانی می‌شوند.",
"geofilesUpdateAll": "همه را به‌روزرسانی کنید",
"geofileUpdatePopover": "فایل جغرافیایی با موفقیت به‌روز شد",
"customGeoTitle": "GeoSite / GeoIP سفارشی",
"customGeoAdd": "افزودن",
"customGeoType": "نوع",
"customGeoAlias": "نام مستعار",
"customGeoUrl": "URL",
"customGeoEnabled": "فعال",
"customGeoLastUpdated": "آخرین به‌روزرسانی",
"customGeoExtColumn": "مسیریابی (ext:…)",
"customGeoToastUpdateAll": "همه منابع سفارشی به‌روزرسانی شدند",
"customGeoActions": "اقدامات",
"customGeoEdit": "ویرایش",
"customGeoDelete": "حذف",
"customGeoDownload": "به‌روزرسانی اکنون",
"customGeoModalAdd": "افزودن geo سفارشی",
"customGeoModalEdit": "ویرایش geo سفارشی",
"customGeoModalSave": "ذخیره",
"customGeoDeleteConfirm": "این منبع geo سفارشی حذف شود؟",
"customGeoRoutingHint": "در قوانین مسیریابی مقدار را به صورت ext:file.dat:tag استفاده کنید (tag را جایگزین کنید).",
"customGeoInvalidId": "شناسه منبع نامعتبر است",
"customGeoAliasesError": "بارگذاری نام مستعارهای geo سفارشی ناموفق بود",
"customGeoValidationAlias": "نام مستعار فقط حروف کوچک، اعداد، - و _",
"customGeoValidationUrl": "URL باید با http:// یا https:// شروع شود",
"customGeoAliasPlaceholder": "a-z 0-9 _ -",
"customGeoAliasLabelSuffix": " (سفارشی)",
"customGeoToastList": "فهرست geo سفارشی",
"customGeoToastAdd": "افزودن geo سفارشی",
"customGeoToastUpdate": "به‌روزرسانی geo سفارشی",
"customGeoToastDelete": "geofile سفارشی «{{ .fileName }}» حذف شد",
"customGeoToastDownload": "geofile «{{ .fileName }}» به‌روزرسانی شد",
"customGeoErrInvalidType": "نوع باید geosite یا geoip باشد",
"customGeoErrAliasRequired": "نام مستعار لازم است",
"customGeoErrAliasPattern": "نام مستعار دارای نویسه نامجاز است",
"customGeoErrAliasReserved": "این نام مستعار رزرو است",
"customGeoErrUrlRequired": "URL لازم است",
"customGeoErrInvalidUrl": "URL نامعتبر است",
"customGeoErrUrlScheme": "URL باید http یا https باشد",
"customGeoErrUrlHost": "میزبان URL نامعتبر است",
"customGeoErrDuplicateAlias": "این نام مستعار برای این نوع قبلاً استفاده شده است",
"customGeoErrNotFound": "منبع geo سفارشی یافت نشد",
"customGeoErrDownload": "بارگیری ناموفق بود",
"customGeoErrUpdateAllIncomplete": "به‌روزرسانی یک یا چند منبع geo سفارشی ناموفق بود",
"customGeoEmpty": "هنوز منبع geo سفارشی‌ای ثبت نشده — برای ایجاد روی «افزودن» کلیک کنید",
"geodataTitle": "به‌روزرسانی خودکار Geodata",
"geodataHint": "Xray این فایل‌ها را طبق زمان‌بندی دانلود کرده و بدون ری‌استارت بارگذاری مجدد می‌کند. آدرس‌ها باید HTTPS باشند. هر فایل باید از قبل در پوشه bin موجود باشد تا Xray بتواند آن را به‌روزرسانی کند.",
"geodataCron": "زمان‌بندی (cron)",
"geodataOutbound": "دانلود از طریق خروجی (اختیاری)",
"geodataFile": "نام فایل",
"geodataAddFile": "افزودن فایل",
"geodataSaveRestart": "ذخیره و ری‌استارت Xray",
"geodataConfirmTitle": "تنظیمات geodata ذخیره شود؟",
"geodataConfirmContent": "قالب پیکربندی Xray به‌روزرسانی و Xray ری‌استارت می‌شود.",
"geodataInvalidUrl": "هر فایل به یک آدرس HTTPS نیاز دارد.",
"geodataInvalidFile": "نام فایل باید ساده باشد، مانند geosite_custom.dat (بدون مسیر).",
"geodataInvalidCron": "Cron باید ۵ بخش داشته باشد، مثل 0 4 * * *",
"geodataEmpty": "فایلی پیکربندی نشده است. در قوانین مسیریابی فایل‌ها به صورت ext:geosite_custom.dat:category استفاده می‌شوند.",
"dontRefresh": "در حال نصب، لطفا صفحه را رفرش نکنید",
"logs": "لاگ‌ها",
"config": "پیکربندی",