Links
Tags
Creators
Details
1.7.0
Compatibility
Changes
MikuHAProxy 1.7.0(正式版)
本版是一次逐文件的全量深度自查与修复:连查多轮,直到查不出问题为止。核心连接判定逻辑(渐进式前缀探测、白名单匹配、计数与限流)语义完全不变,改动的都是「出错时会不会把人坑住」的那一层。升级只需替换 jar,无需改动任何配置。
修复 · 配置读取
- 用记事本按 ANSI / GBK 保存的
config.toml/whitelist.conf不再整份读取失败。此前严格按 UTF-8 解码,遇到 GBK 字节会直接抛异常,白名单读取失败等于拒绝所有代理连接,而用户完全看不出是编码问题。现在非法字节按替换字符处理,规则照常生效,并额外提示一次「建议另存为 UTF-8」。 whitelist-file写成子目录形式(如sub/list.conf)时,插件会先建出父目录再写默认文件。此前父目录不存在会写出失败,用户只会看到「白名单文件不存在」。- 路径指向的是目录而非文件时,改为明确报告「不是普通文件」,不再笼统地说「不存在」——后者会把人引去反复检查路径拼写。
10.0.0.0 /8这种斜杠前多一个空格的写法不再被判为「不是 IP 字面量」。
修复 · 连接处理
- 白名单校验通过、但把 PROXY 解码器装回管道两次都失败时(例如管道被其它插件反复改动),现在会断开该连接并计入「异常」。此前探测器会留在管道上并已置位判定标记,后续字节被永久丢弃,连接一直挂到对端超时——白占连接槽且没有任何日志。
- 管道里已存在名为
haproxy-detector的其它处理器时,不再当成「已注入」静默放过,而是如实计入「未注入」并告警一次。此前这条连接会落到 Velocity 原有的解码器上、直连被掐断,而状态页里一条记录都没有。 - 数据目录改名时若「改到目标名」与「回滚」双双失败,插件改为直接使用中间目录,不再回到那个已经空掉的旧路径。此前会在空路径上重新生成出厂模板,用户看到的效果是「白名单被清空了」,而他原本的文件还躺在
*.renaming里。 - 初始化异常日志不再一律说「插件不生效」:连接接管已成功、只是后续步骤出错时,会如实说明「已接管,命令可能未注册」。
- 系统时钟被 NTP 往回校准后,
status的已运行时间不再显示成负数。
改进 · 可读性
/mikuproxy list最多逐条回显 100 条规则,超出部分只报总数。白名单写到上千行时,全量回显会刷满聊天框,客户端甚至可能因一次性收到过多数据包而卡顿。- 状态页里限流参数的说明改为「同一地址的同类日志」,与「分类 + 地址」分槽的实际语义一致。
reload失败时的提示不再把原因说成「配置有误」——数据目录不可写同样会失败,现在指向控制台日志。- 规则回显会转义反斜杠,Windows 路径形式的条目不再显示成被吞掉的样子。
- 部署数据目录改名失败的告警里补充说明「本次启动将直接使用该目录,以免白名单被当成文件不存在」。
发版流程
- GitHub Release 说明改为取自发版提交的正文(就是本段内容),不再由 GitHub 自动汇总「What's Changed」。更新日志与代码变更从此在同一次提交里评审。
- 正式版 / 测试版的判定改为「版本号第三位是否为 0」,与纯数字版本号规则一致;此前按 tag 里有没有
Beta判断,而该后缀已不再使用。 - Modrinth 上传步骤同样按此规则判定,说明摘要的提取也改为跳过声明段,避免把版权声明当成摘要。
测试
- 新增 5 条守护用例:GBK 文件仍可解析(配置与白名单各一条)、白名单路径为目录时的提示、
list回显上限、改名回滚失败时返回中间目录。 - 测试总数 141 → 146,18 个测试类;CI 全绿:
Tests run: 146, Failures: 0, Errors: 0, Skipped: 2+BUILD SUCCESS(Skipped 2 是需要特定文件系统大小写行为的用例,在 Linux CI 上按设计跳过)。
升级说明
- 完全向后兼容:无需改动
config.toml或whitelist.conf,用MikuHAProxy-1.7.0.jar替换旧 jar 后重启代理即可。 - 环境要求不变:Velocity 4.0 及以上(Velocity-CTD 4.x 同样适用)、Java 25、
velocity.toml中haproxy-protocol = true。 - 权限与命令不变:
mikuhaproxy.admin,/mikuproxy(别名/mhp、/mikuhaproxy)。
MikuMC 系列插件交流群:1105054380
Projects on Modrinth are automatically available through a Maven repository for use with JVM build tools such as Gradle. To learn more about the Modrinth Maven API, click here.
Note: When available, you should use the creator's maven repo instead as it will have transitive dependency information that the Modrinth Maven API does not. You may also end up with duplicate dependencies if you use a mix of Modrinth and non-Modrinth Maven repositories for your dependencies, because the group identifier will be different when served through the Modrinth Maven API.
Maven coordinates:
Version ID:
build.gradle:
repositories {
exclusiveContent {
forRepository {
maven {
name = "Modrinth"
url = "https://api.modrinth.com/maven"
}
}
// forRepositories(fg.repository) // Uncomment when using ForgeGradle
filter {
includeGroup "maven.modrinth"
}
}
}
// Standard Gradle dependency
dependencies {
implementation "maven.modrinth:SPh6m4k5:b493QlWV"
}
// Legacy Loom dependency
dependencies {
modImplementation "maven.modrinth:SPh6m4k5:b493QlWV"
}

