v1.2.0
OxiDNS v1.2.0
OxiDNS 1.2.0 是一个 Minor Release,本周期最大的变化是引入完整的编译期特性体系与三档预设 bundle,把 DoQ / DoH3、DoT / DoH、api / webui / metrics、可选插件以及 TLS / HTTP 依赖全部改为按需启用,并把"编译进来的能力"暴露给 CLI、API 与 WebUI。同步上线两个新插件 ip_selector 与 dynamic_domain_set + learn_domain,扩展 env 匹配器为多条件表达式,并修复缓存、DoH 监听、upgrade 等关键问题。
⚠️ 本版本含一个破坏性变更:env匹配器移除了遗留的两参数["KEY", "VALUE"]解析,详见下方升级说明。
✨ 亮点
- 编译期特性体系:新增
minimal/standard(推荐)/full三个 bundle,叠加 server-doq / server-doh3 / server-dot / server-doh、upstream-doq / upstream-doh3 / upstream-dot / upstream-doh、api/webui/metrics、plugin-mikrotik/query-recorder/ipset/cron/script/download/http-request/reverse-lookup/upgrade/arbitrary/plugin-ip-selector/plugin-dynamic-domain、provider-protobuf/adguard-rule等细粒度 flag。minimal二进制约 8.9 MB(vsfull约 21 MB,缩小约 58%)。 - Release 产物按 bundle 切分:新增 Linux musl
minimal/standard归档(full名称保持不变),upgrade与安装脚本支持显式选择 bundle;standard已包含api、webui、query_recorder、upgrade。 - 运行时能力反射:CLI 与
system/health上报激活的 bundle 与支持的插件类型;WebUI 在新建、引用选择、卡片、详情视图中自动禁用未编译进来的插件类型。 - 新插件
ip_selector(executor):A / AAAA 响应 IP 选优,支持带上限的 TCP / ping 探测、得分缓存、并发探测合并、DNSSEC 安全处理与失败兜底放行。 - 新插件
dynamic_domain_set(provider)+learn_domain(executor):可写、文件持久化、支持热快照与 API 规则管理的动态域名集;learn_domain不依赖 SQLite、不触发整体 reload,即可把查询/响应按过滤条件写入动态集;WebUI 新增规则列表、添加 / 删除 / 清空管理面板。 env匹配器多条件:每个参数都按独立表达式解析;推荐KEY=VALUE精确匹配,KEY:VALUE作为别名,支持 value 中含分隔符。- WebUI 卡片拖拽排序:仪表盘与插件中心均支持拖拽。插件中心的排序写回配置文件的
plugins顺序(暂存后由"应用更改"统一保存);仪表盘固定卡片顺序仅作为本地偏好持久化到localStorage。 - 新增
dynamic_domain_setWebUI 规则管理面板 与learn_domain字段级文档。
🐛 关键修复
cache:size视为条目上限而非启动时 map 容量,避免大缓存配置的预分配开销;启动与 API dump 加载后立即按上限裁剪。修复 #147。server:DoH3 / TLS 前置条件不满足或 HTTP/3 初始化失败时,先回收已启动的 HTTP/2 监听任务,避免泄漏的 DoH 监听句柄。upgrade:从运行时配置推断 WebUI 资源路径,修复与--working-dir组合使用时找不到 WebUI 资源的问题。config:消除运行时占位符{...}与env占位符的歧义。dynamic_domain_set:序列化追加写入、分行写入新增规则、写文件前先校验、保持内存与文件状态一致。perf(sequence):步骤记录改为受内部_sequence-step-recordingfeature 控制,仅在query_recorder启用时编译进来。
💥 破坏性变更
env 匹配器移除遗留的两参数解析
- 旧写法
env: ["KEY", "VALUE"]之前等价于$KEY == VALUE;现在表示"环境变量KEY与VALUE都存在"。 - 迁移方法(任选其一):
env: ["KEY=VALUE"](推荐)env: ["KEY:VALUE"]
- 如果你确实想保留新语义(两个环境变量都存在),无需修改。
- 详见
docs/migrate-from-mosdns中的迁移说明。
⬆️ 升级说明
- 根 crate 升级至
1.2.0;本周期crates/macros/crates/proto/crates/ripset/crates/zoneparser均无改动,子 crate 无需升级。Release tag:v1.2.0。 - 使用默认(
full)或standardbundle 时,v1.1.4配置可直接升级;如选择minimal或自定义裁剪 feature,配置里引用未编译进来的插件 / 协议会在启动时报错 "not compiled in; rebuild with--features ..."。 - 选择最小化部署:
cargo build --release --no-default-features --features minimal(或standard)。Release 通道同时发布minimal/standard/full三套 Linux musl 归档,upgrade与安装脚本支持显式 bundle 选择。需要 WebUI、query_recorder、upgrade的部署建议使用standard或full。 - 大缓存部署(如
size > 200000)强烈建议升级:先前会预分配过大 map,且 API dump 加载后未严格裁剪。 - 启用 DoH 且未启用 DoH3、或启用 DoH3 但缺少必需 TLS 配置的部署建议升级:先前在 HTTP/3 初始化失败时可能残留 HTTP/2 DoH 监听句柄。
dynamic_domain_set/learn_domain受plugin-dynamic-domain控制,ip_selector受plugin-ip-selector控制;二者均已包含在standard/fullbundle 中。
📦 依赖升级
socket20.6.3 → 0.6.4jiff0.2.24 → 0.2.28wincode0.5.4 → 0.5.5http1.4.0 → 1.4.1hyper1.9.0 → 1.10.1rusqlite0.39 → 0.40windows-service0.6 → 0.8.1
📚 文档
- 新增
PLUGIN_DEV.md插件开发与注册指南 - 新增
SECURITY.md安全策略 - 新增自定义构建中文文档与 quickstart 预设能力矩阵
- 新增 roadmap 时间线组件
- 移除安装文档中的 GHCR 引用
- 修复 TLS 配置文档格式
What's Changed
- Feat/webui drag ordering by @svenshi in #145
- fix(cache): avoid eager allocation for large cache limits by @svenshi in #148
- feat(build): gate api/tls/http protocols behind Cargo features by @svenshi in #144
- fix(upgrade): infer WebUI path from runtime config by @svenshi in #152
- fix(config): disambiguate runtime and env placeholders by @svenshi in #151
- feat(matcher): support multiple env conditions by @svenshi in #150
- feat(executor): add ip_selector response IP selection by @svenshi in #154
- feat(plugin): add dynamic domain learning by @svenshi in #153
- deps: bump the cargo-major group with 2 updates by @dependabot[bot] in #156
- deps: bump the cargo-patch-and-minor group with 5 updates by @dependabot[bot] in #155
Full Changelog: v1.1.4...v1.2.0