Compare commits

..
4 Commits
Author SHA1 Message Date
im0oandClaude Opus 5 e77ef3045a feat: 多订阅 / 地区分组 / 回国模式 / 多入站 / GEO 管理
多订阅:
- 向导的订阅那步改成可以连续填多个 (最多 8 个, 回车结束),每个一条独立的
  proxy-providers,节点合并进同一组
- 订阅行标记升级成 "# mihomo-up:sub:<provider名>",配置菜单里可按序号改任意一条
- 改完顺手删掉对应的节点缓存,否则内核会继续用旧节点

地区分组:
- 支持 HK TW JP SG US KR UK DE FR,每个地区一个 url-test 组,靠节点名关键词
  匹配 (中英文 + 旗帜 emoji)
- 提醒: 某地区匹配不到任何节点会让内核拒绝启动,紧接着的校验会指出来

分流规则从两种变三种:
- 3 = 指定地区走代理、其余直连,也就是回国 / 分区代理
- 回国模式生成 .mrs 规则集而不是 GEOIP: 域名维度打头,IP 维度兜底。
  国内站挂境外 CDN 时解析出的 IP 不在本国段,只靠 GEOIP 会整片漏掉
- 只有 CN 有成体系的域名列表,其它国家代码只能按 IP 匹配,脚本会当场说明后果

多入站 (listeners):
- 新增「入站端口」菜单: 加/删额外的本地端口,每个可绑一个策略组、DIRECT,
  或按 rules 分流
- 每条写成一行 YAML 流式映射并带标记,加删就是加一行删一行,不动别处
- 拦截端口冲突和非法类型;选了具体出站会提醒它完全跳过 rules
- 删到最后一条时连空的 listeners: 标题一起去掉

GEO / 规则集:
- 新增菜单: 列出 geoip.dat / geosite.dat / *.mmdb / rules/*.mrs 的大小和
  更新时间。下载失败是静默的 —— 规则全不匹配、流量落到 MATCH,看起来像
  "配置没生效",所以状态必须可见
- 立即更新优先走管理接口 POST /configs/geo,不重启内核;接口不可用时回退到
  删文件 + 重启
- 自动更新开关写 geo-auto-update / geo-update-interval

验证: 三种规则模式生成的配置都用 PyYAML 解析通过,分组、rule-providers、
listeners 结构和字段类型均符合预期;两个 .mrs 地址实测 200。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XpjLPV4JvAsuq9ACb3u6B4
2026-08-09 17:55:59 +08:00
im0oandClaude Opus 5 06a42149c6 docs: 把被削成单字的动词补回完整词语
用户可见文案里有一批动词被缩成了单字,读起来像电报。统一补全,
菜单标签、帮助文本、提示信息、README 一起过。

装 → 安装        验 → 校验        下 → 下载
起 → 启动        跑 → 运行        拉 → 拉取
删 → 删除        换 → 更换        改 → 修改
查 → 查询        敲 → 输入        重跑 → 重新运行
启停 → 启动 / 停止   自启 → 开机自启   不开 → 不开启
复验 → 重新校验   没法 → 无法      落盘 → 写入磁盘

顺带修掉批量替换造成的重复词 (安安装 / 更更换 / 重写入服务文件 /
已打开开机自启),并补了一条通用自查: 用带 lookbehind 的正则扫任意
汉字连续重复,以及扫非「安装」的孤立「装」。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XpjLPV4JvAsuq9ACb3u6B4
2026-08-09 17:32:26 +08:00
im0oandClaude Opus 5 a275e76206 feat: 加快捷命令 mihomo-up,并按 edit-article / think-twice 过一遍文案
快捷命令:
- 一键安装会往 /usr/local/bin/mihomo-up 装一个启动器,每次执行先拉最新脚本再跑,
  仓库更新后机器上无需手动更新
- 与纯"每次重新下载"的区别: 落一份缓存到 /var/lib/mihomo-up/,
  拉不到 (断网/仓库挂) 或拉到的内容 bash -n 不过时回落缓存。
  代理管理脚本尤其需要这条 —— 最需要它的时候往往正是网络不正常的时候
- 抓取带 5s 连接 / 20s 总超时;参数和退出码原样透传
- 新增 shortcut 子命令、服务菜单第 8 项、--script-url / MIHOMO_UP_URL
- uninstall 连启动器和缓存一起清理

修复:
- 子命令失败时 ERR trap 会在人话提示后再补一句「第 N 行出错」,看起来像崩了。
  分发点改用 || exit 1 收尾
- --mirror 缓存失败的提示原本描述错了后果,改成照实说
- 升级闸门失败、缺配置两处只给菜单路径,命令行模式下是悬空引用,补上等价命令
- allow-lan 开启时报出具体端口号;管理接口设 0.0.0.0 时补一句暴露后果
- 无效菜单选项说清什么才有效

README:
- 按依赖顺序重排章节: 环境要求提到快速开始之前,快捷命令移到一键安装之后,
  GitHub 镜像移到选项表之前以消掉「见下」悬空引用
- 开头「管三样东西」与实际不符,改为完整清单
- 拆开超过 240 字符的长段

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XpjLPV4JvAsuq9ACb3u6B4
2026-08-09 17:26:57 +08:00
im0oandClaude Opus 5 afa5ae42f1 feat: 一键安装 / 配置向导 / 卸载,并整体优化脚本
安装:
- 新增 install 子命令和菜单第 1 项「一键安装」: 装内核 → 写 systemd →
  跑配置向导 → enable + start,装完打印代理端口 / 面板地址 / 密钥 / 日志命令
- systemd unit 按 MetaCubeX 官方文档写入,旧 unit 内容不同时先备份

配置:
- 新增配置向导,问 7 个问题生成最小可用配置 (订阅 provider、mixed-port、
  allow-lan、external-controller、secret、Web 面板、分流规则)
- 新增「配置管理」菜单: 换订阅 / 改端口 / 局域网共享 / 面板密钥 / URL 导入 /
  校验 / 手动编辑 / 备份还原。每次改动前自动备份,改完 -t 校验,
  不过则询问还原,服务在跑再询问重启

卸载:
- 新增 uninstall 子命令和菜单项: stop + disable + 删 unit 和 drop-in +
  daemon-reload + reset-failed + 删二进制,配置目录和内核备份单独询问
- --purge 全删不问

其它:
- --mirror 支持 GitHub 反代前缀,带 mirror 时生成的配置一并写走镜像的 geox-url
- --service 自定义服务名、--skip-conf-check 跳过升级前的配置预校验
- 服务菜单新增开机自启开关和重写服务文件
- 修复 ask_default 与 ask 的局部变量重名: bash 动态作用域下 printf -v
  写进了 ask 自己的变量,导致向导除默认值外的输入全部丢失
- 修复输入流 EOF 时向导在「订阅不能空」处死循环
- 修复无配置时改端口直接 die 退出菜单、查版本失败 die 掉整个会话、
  --dry-run 被 root 检查提前挡掉等问题
- 生成的 find-process-mode 加引号,避免被解析成布尔值

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XpjLPV4JvAsuq9ACb3u6B4
2026-08-09 13:38:27 +08:00
2 changed files with 510 additions and 606 deletions
+57 -64
View File
@@ -15,16 +15,12 @@
| 脚本缓存 | `/var/lib/mihomo-up/` |
| 内核备份 | `/var/backups/mihomo/` |
(可选装的 Sub-Store 在 `/opt/sub-store`、Patchbay 在 `/opt/patchbay`,卸载 mihomo 都不会动它们)
除此之外它不碰你系统里的任何东西。
## 环境要求
- Linux + bash 4 以上
- 依赖命令:`curl`、`gzip`、`install`、`awk`、`sed`(一般发行版自带)
- 只有选装 Sub-Store 时才额外需要 `node` 和 `unzip`;脚本会检测并给出安装命令,不替你装
- 选装 Patchbay 需要 `tar` 和 `unzip`;它的运行时(bun)由它自己的安装脚本装一份私有副本,不碰系统
- 安装、升级、修改配置、卸载都需要 **root**。非 root 也能进菜单,会先提醒一句
- 没有 systemd 的机器(容器等)也能用:脚本跳过服务相关步骤,只管内核和配置,你自己 `mihomo -d /etc/mihomo` 启动起来
@@ -54,26 +50,22 @@ sudo ./mihomo-up.sh config # 重新运行配置向导
sudo ./mihomo-up.sh rollback # 内核回滚到上一个备份
sudo ./mihomo-up.sh uninstall # 卸载,会逐项问你配置和备份要不要删除
sudo ./mihomo-up.sh shortcut # 只安装 / 刷新 mihomo-up 快捷命令
sudo ./mihomo-up.sh substore # 安装 / 更新 Sub-Store(订阅聚合,可选)
sudo ./mihomo-up.sh patchbay # 安装 / 更新 Patchbay(网页编辑配置,可选)
```
## 菜单里有什么
```
1. 一键安装 内核 + systemd + 配置,缺哪步补哪步
2. 检查更新 3. 升级内核 4. 装指定版本内核
2. 检查更新 3. 升级内核 4. 安装指定版本内核
5. 回滚内核 6. 查看内核备份
7. 配置管理 生成配置 / 改端口 / 看面板密钥 / 校验 / 手动编辑
8. 服务控制 启动 / 停止 / 重启 / 状态 / 日志 / 开机自启
9. Sub-Store 订阅聚合,可选,见下
p. Patchbay 网页编辑配置,可选,见下
u. 卸载 mihomo
7. 配置管理 订阅 / 端口 / 局域网 / 面板密钥 / 入站端口 / GEO / 导入 / 校验 / 编辑 / 备份
8. 服务控制 启动 / 停止 / 重启 / 状态 / 最近日志 / 开机自启 / 重写服务文件
9. 卸载
```
## 一键安装做了什么
1. **下载内核**:按机器架构从 GitHub Releases 取对应的 `.gz` 并解压
1. **下载内核**:按机器架构从 GitHub Releases 下载对应的 `.gz` 并解压
2. **校验内核**:新二进制必须能执行,且 `-v` 自报的版本号和目标一致,否则不写入磁盘
3. **准备配置**:没有 `config.yaml` 就运行配置向导;已经有了就保持不动,只问一句要不要重做
4. **写入服务**:按 [MetaCubeX 官方文档](https://wiki.metacubex.one/startup/service/)的推荐写 `mihomo.service`。已存在且内容不同的话,旧文件先备份成 `.bak-<时间戳>`
@@ -106,19 +98,24 @@ fork 之后想让快捷命令指向你自己那份,安装的时候加 `--scrip
## 配置向导问什么
向导生成的是一份**最小可用配置**,够用,不臃肿。它只认**一条**订阅地址——多个机场的聚合、节点改名、筛选去重,交给 Sub-Store 那类工具做(见下一节),脚本这边不重复造。
向导生成的是一份**最小可用配置**,够用,不臃肿:
| 问题 | 说明 |
|---|---|
| 订阅地址 | 机场给的,或 Sub-Store 输出的那条。写成 `proxy-providers`,每 24 小时自动更新 |
| 本地代理端口 | `mixed-port`,HTTP 和 SOCKS5 共用同一个端口,默认 7890 |
| 订阅链接 | 机场给的 http(s) 地址。**可以填多个**,一次一个,回车结束(最多 8 个) |
| 本地代理端口 | `mixed-port`,HTTP 和 SOCKS5 共用,默认 7890 |
| 局域网共享 | `allow-lan`,开了同网段其它设备也能连(还要放行防火墙) |
| 管理接口 | 只允许本机 / 局域网公网可访问 / 不开启。面板和 API 都连这里 |
| 访问密钥 | 回车即自动生成随机串;管理接口开在 `0.0.0.0` 时务必设 |
| Web 面板 | 选是就写 `external-ui-url`,内核首次启动自己去下载 metacubexd |
| 地区分组 | 留空=不拆。填 `HK JP US` 之类就按地区各建一个自动测速组 |
| 分流规则 | 三选一,见下面的表 |
生成的分组是 `PROXY`(总开关,手动选,默认跟着 AUTO)和 `AUTO`(全部节点里自动挑延迟最低的)。
多个订阅的节点会合并进同一组。每个订阅是一条独立的 `proxy-providers`,各自按 24 小时周期更新。
**地区分组**支持 `HK TW JP SG US KR UK DE FR`。每个地区一个 `url-test` 组,靠节点名里的关键词匹配,中英文和旗帜 emoji 都认。
注意:某个地区一个节点都没匹配上的话内核会拒绝启动,紧接着的校验会当场告诉你。
**分流规则**三选一,内网地址在哪种模式下都直连:
@@ -130,68 +127,69 @@ fork 之后想让快捷命令指向你自己那份,安装的时候加 `--scrip
地区填两位 ISO 代码(`CN`、`US`、`JP`、`DE`…),小写自动转大写。
**模式 3(回国)**不用 `GEOIP`,而是生成两条 `.mrs` 规则集:域名维度打头,IP 维度兜底。原因是很多国内站挂着境外 CDN,域名解析出来的 IP 不在国内段,只靠 `GEOIP` 会整片漏掉。只有 `CN` 有成体系的域名列表,填别的国家代码时脚本会当场告诉你只能按 IP 匹配、会漏掉什么。
生成的分组是 `PROXY`(总开关,手动选,默认跟着 AUTO)、`AUTO`(全部节点里自动测速),加上你要的那几个地区组。
**改配置的安全网**:每次改动之前自动备份成 `config.yaml.bak-<时间戳>`(只留最近 10 份),改完立刻用内核 `-t` 校验。**校验不过会问你要不要还原**,服务正在运行的话再问一句要不要重启生效。配置文件权限是 `0640`,因为密钥就明文存在里面。
## 回国 / 分区代理
复杂配置(DNS、TUN、自定义规则、多开入站端口)请用「手动编辑配置」,它同样有备份、校验、还原兜底。
上面的模式 3 是反过来的:命中的地区走代理,其余直连。适合人在境外、只想让国内站点走国内节点。
其中**多开入站端口**是最常被问到的一个,配置长这样:
```yaml
listeners:
- { name: in-7801, type: mixed, listen: 0.0.0.0, port: 7801, proxy: PROXY }
- { name: in-7802, type: mixed, listen: 0.0.0.0, port: 7802 }
```
`type` 可以是 `mixed`(HTTP + SOCKS5 同口)、`http`、`socks`。写了 `proxy:` 就**完全跳过 rules**,这个端口的流量一律走那个策略组或节点;不写就照常按 `rules` 分流。
想按端口区分又保留分流,用入站规则代替 `proxy:`:
它不用 `GEOIP`,而是生成两条 `.mrs` 规则集:
```yaml
rules:
- GEOIP,CN,DIRECT # 顺序重要,先放该直连的
- IN-NAME,in-7801,PROXY
- RULE-SET,cn-domain,PROXY # 域名维度
- RULE-SET,cn-ip,PROXY,no-resolve # IP 维度兜底
- MATCH,DIRECT
```
## Sub-Store(可选)
**为什么必须有域名那份**:很多国内站挂着境外 CDN,域名解析出来的 IP 不在国内段,只靠 `GEOIP` 会整片漏掉。域名列表才是主力,IP 那条只兜住「直接连 IP、没有域名」的连接。
[Sub-Store](https://github.com/sub-store-org/Sub-Store) 是订阅聚合器:把多个机场和自建节点合成一条订阅地址,带 Web 界面,**能看到筛选后实际剩下哪些节点**。菜单第 9 项安装,它是独立服务,**不进一键安装,也不是用 mihomo 的前提**。
`.mrs` 是二进制规则集,只下载你要用的那一两个列表,不用拖整包 `geosite.dat`。下载走 `proxy: DIRECT`,因为你人在境外,直连最快。
装完的用法是:在它的界面里加各个机场的订阅和自建节点 → 做一条「组合订阅」→ 复制它的 mihomo 格式输出地址 → 回本脚本「配置管理 → 生成配置」填进去。
有个限制脚本会当场告诉你:**只有 CN 有成体系的域名列表**。换成别的国家代码就只能按 IP 匹配,该地区挂境外 CDN 的站点会漏掉。
**装法**:原生 Node + systemd,装到 `/opt/sub-store`。脚本**不替你装 Node**——装语言运行时是最容易搞坏服务器的操作,检测不到时它会打印你这个发行版的安装命令,你执行完再回来。另外需要 `unzip`。
## 多开入站端口
**更新**(菜单第 2 项)和内核升级用同一套闸门:下载到临时目录 → `node --check` 验后端、`unzip -t` 验前端 → 备份旧的 → 换上 → 起服务 → **起不来自动回滚**。任一步不过都不动现有版本。
一个端口对应一个出站——从 7801 进来的全走香港节点,从 7802 进来的全走日本。菜单「配置管理 → 入站端口」增删,写成 mihomo 的 `listeners`:
**安全上要知道的一件事**:Sub-Store 的后端 API **没有鉴权**,访问地址里那串随机路径就是唯一凭据,谁知道谁就能读走你所有订阅(里面带着机场账号)。所以脚本默认绑 `127.0.0.1`,装完打印现成的 SSH 隧道命令:
```bash
ssh -L 3001:127.0.0.1:3001 用户名@你的服务器
# 然后本机浏览器打开脚本给你的那条 http://127.0.0.1:3001/?api=... 地址
```yaml
listeners:
- { name: in-7801, type: mixed, listen: 0.0.0.0, port: 7801, proxy: HK }
- { name: in-7802, type: mixed, listen: 0.0.0.0, port: 7802 }
```
要公网直连也可以,但要你明确选,脚本会警告一次。另外注意:把 Sub-Store 生成的订阅链接发给别人时,链接里就含着后端地址。
卸载 mihomo **不会**连带删除 Sub-Store——你的订阅数据在里面。要删就走菜单第 9 项里的卸载。
## Patchbay(可选)
[Patchbay](https://git.im0o.top/im0o/mihomo-patchbay) 是编辑 mihomo 配置的网页工具:在浏览器里改配置、校验、直接重载内核,省得 SSH 上去用 vi。菜单 `p` 项安装,它同样是独立服务,**不进一键安装**。
**这里只是个入口**:装、更新、卸载全由 Patchbay 自己的 `install.sh` 完成,本脚本只负责把它拉下来执行(先过一遍 `bash -n`,语法不过就不以 root 运行),并把 `--mirror`、`-y` 和 `MIHOMO_BIN` / `MIHOMO_CONF_DIR` 原样传过去。所以 Patchbay 的版本、服务定义、环境变量都归它自己管,出问题去它的仓库反馈。
**前提**是 mihomo 已经装好、且配置里开了管理接口(`external-controller`)——Patchbay 靠管理接口读线路和触发重载。没开的话它会拒绝安装并告诉你先跑一遍配置向导。
装完只监听 `127.0.0.1:7580`,访问方式和访问令牌在安装结束时打印出来,用法和 Sub-Store 一样是 SSH 隧道:
用法就是把代理地址指到不同端口:
```bash
ssh -N -L 7580:127.0.0.1:7580 用户名@你的服务器
# 然后本机浏览器打开 http://127.0.0.1:7580,填脚本给你的访问令牌
curl -x http://127.0.0.1:7801 https://example.com # 走 HK 组
curl -x http://127.0.0.1:7802 https://example.com # 按 rules 分流
```
卸载 mihomo 同样**不会**连带删除 Patchbay,要删走菜单 `p` → 卸载。
出站可以选任意一个已有策略组、`DIRECT`,或者「按 rules 分流」。
**选了具体出站就完全跳过 rules**:这个端口的流量一律走它,包括本该直连的内网以外流量。脚本在你选完之后会提醒一次。想保留分流就选「按 rules」。
类型支持 `mixed`(HTTP + SOCKS5 同口)、`http`、`socks`。端口和主代理端口或其它入站冲突会被当场拒绝。
## GEO 数据和规则集
`GEOIP`、`GEOSITE`、`RULE-SET` 规则都要靠数据文件才能匹配。内核缺文件时会自己去下载,但**下载失败是静默的**。
失败的表现是:规则一条都匹配不上,流量全落到最后的 `MATCH`,看起来就像"配置没生效"——你会先去怀疑节点,而不是怀疑一个几天前静默失败的下载。
菜单「配置管理 → GEO / 规则集」把这件事变可见:列出配置目录里的 `geoip.dat`、`geosite.dat`、`*.mmdb` 和 `rules/*.mrs`,带大小和上次更新时间。几天没变就是没更新成功。
「立即更新」优先走管理接口的 `POST /configs/geo`,**不用重启内核**。管理接口没开、或服务没在运行时,回退到删掉数据文件再重启服务重新下载(动手前会问你)。
「自动更新 开/关」写的是 `geo-auto-update` 和 `geo-update-interval: 24`。
## 改配置的安全网
上面这些改动——换订阅、改端口、加入站、开关自动更新——都不用手写 YAML,也都走同一套保护。
每次动手之前自动备份成 `config.yaml.bak-<时间戳>`,改完立刻用内核 `-t` 校验。**校验不过会问你要不要还原**,服务正在运行的话再问一句要不要重启生效。
需要手写的复杂配置(DNS、TUN、自定义规则)请用菜单里的「手动编辑配置」,或者用「从 URL 导入完整配置」整份换掉——这两条路同样有备份、校验、还原兜底。
## 升级和回滚
@@ -287,11 +285,6 @@ sudo ./mihomo-up.sh install --mirror https://ghfast.top/
| `/usr/local/bin/mihomo-up`(快捷命令) | `MIHOMO_UP_LAUNCHER` |
| `/var/lib/mihomo-up`(脚本缓存) | `MIHOMO_UP_CACHE` |
| 仓库 raw 地址(快捷命令拉取源) | `MIHOMO_UP_URL` |
| `/opt/sub-store`(Sub-Store 目录) | `SUBSTORE_DIR` |
| `sub-store`(Sub-Store 服务名) | `SUBSTORE_SERVICE` |
| `/opt/patchbay`(Patchbay 目录) | `PATCHBAY_PREFIX` |
| `patchbay`(Patchbay 服务名) | `PATCHBAY_SERVICE` |
| Patchbay 仓库 raw 地址(安装脚本拉取源) | `PATCHBAY_INSTALL_URL` |
内核备份最多保留 3 份(脚本内常量 `KEEP=3`)。配置备份不自动清理,积累多了自己删除 `config.yaml.bak-*`。
+446 -535
View File
File diff suppressed because it is too large Load Diff