Skip to content

Geodata: Support automatically updating .dat files and hot reloading#5992

Merged
RPRX merged 6 commits intomainfrom
geodata-reload
Apr 25, 2026
Merged

Geodata: Support automatically updating .dat files and hot reloading#5992
RPRX merged 6 commits intomainfrom
geodata-reload

Conversation

@Meo597
Copy link
Copy Markdown
Collaborator

@Meo597 Meo597 commented Apr 21, 2026

低内存设备慎用,会 boom

@Meo597 Meo597 marked this pull request as ready for review April 21, 2026 17:18
@Fangliding
Copy link
Copy Markdown
Member

为什么不做成tls证书那样1800秒reload一次

@Meo597
Copy link
Copy Markdown
Collaborator Author

Meo597 commented Apr 21, 2026

有道理,现在还得依赖 API
开个新配置块,允许设置定时任务吧

那 API 还要不

@Fangliding
Copy link
Copy Markdown
Member

Fangliding commented Apr 21, 2026

api就不要了
比如搞个环境变量 XRAY_GEOFILE_RELOAD 什么的 非0就隔这么久热重载一次

@Meo597
Copy link
Copy Markdown
Collaborator Author

Meo597 commented Apr 21, 2026

本来想的是用户自己 cron
下载了调 api reload

@Meo597
Copy link
Copy Markdown
Collaborator Author

Meo597 commented Apr 21, 2026

新开个配置块吧
以后万一要自己下载 dat 呢

@Fangliding
Copy link
Copy Markdown
Member

现在这样就差不多了 还搞个下载就太麻烦了

@Fangliding
Copy link
Copy Markdown
Member

singbox倒是喜欢自己下这玩意

@Meo597
Copy link
Copy Markdown
Collaborator Author

Meo597 commented Apr 21, 2026

还真的,本以为他也没有

我倾向于 cron 格式,比较自由

@Fangliding
Copy link
Copy Markdown
Member

Fangliding commented Apr 21, 2026

那环境变量里写cron也行
自动下载程序每天0点 热重载0点过10分

@Meo597
Copy link
Copy Markdown
Collaborator Author

Meo597 commented Apr 21, 2026

居然没有个轻量级的现成的 cron 库
我 vibe 一个看看吧

@Fangliding
Copy link
Copy Markdown
Member

为了一个这玩意还要弄个cron引擎。。 那还是直接间隔算了吧

@Meo597
Copy link
Copy Markdown
Collaborator Author

Meo597 commented Apr 21, 2026

所以才想着 api 来的
系统自带 cron 还方便检测 geodat 的错误
失败了回滚旧文件,要不重启了就拉闸了

@Meo597
Copy link
Copy Markdown
Collaborator Author

Meo597 commented Apr 21, 2026

cron + 下载文件一起做了比较好
不然文件损坏难崩

docker 环境还是无 shell 的

@Meo597
Copy link
Copy Markdown
Collaborator Author

Meo597 commented Apr 21, 2026

{
  "geodata": {
    "cron": "0 4 * * *",
    "outbound": "proxy",
    "assets": [
      { "url": "https://example.com/geoip.dat", "file": "geoip.dat" },
      { "url": "https://example.com/geosite.dat", "file": "geosite.dat" }
    ]
  }
}

@Fangliding
Copy link
Copy Markdown
Member

我的意见就是
环境变量设置比api好 自动更新一下那个文件就算了 还得麻烦开个api写堆配置还得写个东西去调 不是人人都那么无聊写一堆东西挂那
cron不是要加一坨就是要call个依赖进来 所以用interval好一点
下载这种事太多别扒拉进来了 又是下载又是指定个sockopt设置dialerproxy(参考ech)又是指定路径(ray会从不止一个地方搜索geofile 甚至可以用环境变量指定)的又是验证有效性的(这种事故就发生过一次)

@Meo597
Copy link
Copy Markdown
Collaborator Author

Meo597 commented Apr 21, 2026

api 确实太重了

cron 还是 interval 其实不是很重要
我刚试了下重载的时候没什么感觉,我用的商业库要重载 1 分钟

下载感觉是刚需,不然用户自己弄下来的玩意失败了,一时半会发现不了
下次 xray 重启直接炸掉,比如 ssh 没开内网
比如当软路由用
而且 docker 镜像还是个无 shell 的

引入了热更带来了更多麻烦

@Fangliding
Copy link
Copy Markdown
Member

下次 xray 重启直接炸掉,比如 ssh 没开内网

前几天内网端自动更新的人好像刚被骂过
#5947 (comment)

@Meo597
Copy link
Copy Markdown
Collaborator Author

Meo597 commented Apr 21, 2026

我先糊个下载看看吧,对我来说是一样的

不在 core 糊,就得在 shell 糊
shell 那边我还得糊好几份,不同系统环境

@Meo597
Copy link
Copy Markdown
Collaborator Author

Meo597 commented Apr 23, 2026

这个 PR 后基本我要的功能都有了

鉴于上游已经烂完了
是时候把 https://github.com/XTLS/Xray-rules-dat 提上日程

Meo597 added 2 commits April 24, 2026 17:51
This reverts commit b390687.
@Meo597
Copy link
Copy Markdown
Collaborator Author

Meo597 commented Apr 24, 2026

完事了

@RPRX
Copy link
Copy Markdown
Member

RPRX commented Apr 25, 2026

下个版本后再讨论

@Meo597
Copy link
Copy Markdown
Collaborator Author

Meo597 commented Apr 25, 2026

好的,这个引入了一个轻量的外部依赖 cron

之所以把下载一起给干了,考量是失败能回滚
上游 geosite 随意删分类不是一次两次了

以及 ghcr.io/xtls/xray-core 是无 shell 的
如果只 reload 不给下载的话会很麻烦

面板、一键脚本啥的还得各造各的轮子
它们造的轮子,除了回滚不行,还不支持 outbound 指定

@RPRX
Copy link
Copy Markdown
Member

RPRX commented Apr 25, 2026

本来想着有没有外部程序想要自己下载文件然后 call Xray reload,后来想想全做 Xray 里效果相同,打算先合了跟着新版测测

这个 file 只写文件名是默认写到 Xray 启动时找到的 geoip/site 和 ext 吗,支持写绝对路径吗,虽然好像没啥用

除非以后还要自动下载更新别的东西。。。本来想着做成 crons 但想想连接观测已经是独立配置了,以后有新东西再 转译

尤其是,Xray-core 应当经常更新,而 crons 太多甚至被当成通用 crons 难道指望它几年不重启吗,这万万不行

@RPRX RPRX changed the title Geodata: Support hot reload Geodata: Support automatically updating .dat files and hot reloading Apr 25, 2026
@RPRX
Copy link
Copy Markdown
Member

RPRX commented Apr 25, 2026

之所以把下载一起给干了,考量是失败能回滚
上游 geosite 随意删分类不是一次两次了

或许实现个被删的分类留着旧数据,而其它的用新数据?

@RPRX RPRX merged commit 3bc24a3 into main Apr 25, 2026
78 checks passed
@Meo597 Meo597 deleted the geodata-reload branch April 26, 2026 02:46
@Meo597
Copy link
Copy Markdown
Collaborator Author

Meo597 commented Apr 26, 2026

本来想着有没有外部程序想要自己下载文件然后 call Xray reload

b390687 最开始就是这么做的,下游自己下载了然后调 API reload,如果失败了下游想办法回滚
一键脚本、面板、软路由还行,但 docker 不友好(特别是 ghcr.io 的),得在宿主或者再开个实例,还得打通 API 网络

interval 方案也不行,一些人的洋垃圾受不了,会希望避开高峰期 reload
以及 geodata 各家更新频率不一样,不好卡时间点,要么太滞后要么总是无意义地重载
搞得重启下 xray 还得看黄历

@Meo597
Copy link
Copy Markdown
Collaborator Author

Meo597 commented Apr 26, 2026

这个 file 只写文件名是默认写到 Xray 启动时找到的 geoip/site 和 ext 吗,支持写绝对路径吗,虽然好像没啥用

其实还可以写相对路径,规则里就得是 ext:subdir/xxx.dat
现在是严格限制只能写 xray 启动时能找到的文件,不让写绝对路径,怕不安全
考虑的是以后可能面板们需要用 API 增删 assets,因为 API 现在能添加路由规则
我用不到就没写这个 API

@Meo597
Copy link
Copy Markdown
Collaborator Author

Meo597 commented Apr 26, 2026

除非以后还要自动下载更新别的东西。。。本来想着做成 crons 但想想连接观测已经是独立配置了,以后有新东西再 转译

尤其是,Xray-core 应当经常更新,而 crons 太多甚至被当成通用 crons 难道指望它几年不重启吗,这万万不行

那就不太好搞 breaking changes 了
a/b 版启动失败回滚?

@Meo597
Copy link
Copy Markdown
Collaborator Author

Meo597 commented Apr 26, 2026

之所以把下载一起给干了,考量是失败能回滚
上游 geosite 随意删分类不是一次两次了

或许实现个被删的分类留着旧数据,而其它的用新数据?

也可以,状态会变得比较复杂
能写,以后我受不了上游再做吧

@RPRX
Copy link
Copy Markdown
Member

RPRX commented Apr 26, 2026

@yuhan6665 https://github.com/XTLS/Xray-install 那边的 PR 你看一下

@RPRX
Copy link
Copy Markdown
Member

RPRX commented Apr 26, 2026

这个 PR 后基本我要的功能都有了

鉴于上游已经烂完了 是时候把 https://github.com/XTLS/Xray-rules-dat 提上日程

感觉又是一层俄罗斯套娃,如果你觉得现有 geodata 不合理,想长期维护一套新的话也不是不行

@Meo597
Copy link
Copy Markdown
Collaborator Author

Meo597 commented Apr 26, 2026

site 没什么好办法这是个无限集
只要把 cn !cn 整明白了就行
主要是被墙域名要完备,这样保证速度的同时还能防止泄露

geoip 的话,准备多个来源交叉比对,然后结合 bgp 数据做到尽量精准
只要 ip 够准,靠 xray 目前的内置 dns 完全可以精准境内外分流
不怎么需要 site

目前上游的 geoip base maxmind 基本就图一乐,除 cn 外其它国家的分流基本没用
#5581 dat 改流式读取之后其实完全可以改 ipinfo 了

我这两天先自己折腾看看

@fanymagnet
Copy link
Copy Markdown
Contributor

Maybe we should rename "outbound" to "outboundTag"? Throughout the project, the suffix "Tag" is used for both inbound and outbound

@Meo597
Copy link
Copy Markdown
Collaborator Author

Meo597 commented Apr 27, 2026

可以配置文件加几个方言,我无所谓的
现在是 outbound 我不觉得有啥歧义

@Fangliding
Copy link
Copy Markdown
Member

标准方法是加sockopt 能直连能选出站

@Meo597
Copy link
Copy Markdown
Collaborator Author

Meo597 commented Apr 27, 2026

标准方法是加sockopt 能直连能选出站

core 我目前为止只摸了有限的几个模块
httpclient 选出站的代码我是从 obs 那里直接抄来的

@Fangliding
Copy link
Copy Markdown
Member

参考echsockopt就是了 json解析是现成的类型 dial的时候直接整个塞给dialer不需要管任何

@RPRX
Copy link
Copy Markdown
Member

RPRX commented Apr 27, 2026

标准方法是加sockopt 能直连能选出站

sockopt 然后 dialerProxy 吗

@RPRX
Copy link
Copy Markdown
Member

RPRX commented Apr 27, 2026

说白了 core 里的这些 TLS 请求还涉及到,就比如 domain fronting 要不要有,我觉得先写 outbound,有空时统一整一下吧

属于是经常想要 NEXT 架构的灵活性,又不想太灵活以至于不好做一些自动判断什么的

@Meo597
Copy link
Copy Markdown
Collaborator Author

Meo597 commented Apr 27, 2026

现在的行为是不填走路由,填了走指定的出,够用了反正

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants