im0o b43a2f0a64 feat: 加 Patchbay 安装入口
Patchbay 是网页编辑 mihomo 配置的工具,独立仓库、独立发布链路。这里只做
入口:拉它的 install.sh 下来执行,装、更新、卸载的逻辑都在那边,不复制过来。

- 菜单 p 项和 patchbay 子命令,二级菜单为安装/更新、检查更新、服务控制、卸载
- 不直接 bash <(curl ...):先下到临时文件过一遍 bash -n 再以 root 执行。
  上游推坏了、或者中间设备塞回来一个门户登录页,那条写法会直接跑掉
- MIHOMO_MIRROR / MIHOMO_BIN / MIHOMO_CONF_DIR 原样透传(名字本来就相同),
  -y 跟 ASSUME_YES 走,--purge 跟 PURGE 走,check 的退出码按 0/10/1 解读
- 状态显示只读 version.txt 和 systemd 单元状态,版本和服务定义归它自己管
- 卸载 mihomo 不连带删除它,和 Sub-Store 同样处理

顺手把 Sub-Store 的服务控制菜单抽成通用的 unit_ctl_menu,两边共用,行为没变。
2026-08-12 16:14:36 +08:00
2026-08-12 16:14:36 +08:00
2026-08-12 16:14:36 +08:00

mihomo-up

一个 bash 脚本,在 Linux 服务器上安装好、配置好、管起来 mihomo 内核(Clash.Meta 的继任者,MetaCubeX 维护的代理内核)。

一条命令从零到能用:下载内核 → 写入 systemd 服务 → 用向导生成 config.yaml → 启动。之后修改订阅、更换端口、升级、回滚、卸载也都在同一个菜单里。

安装完成后,这台机器上会多出这几样东西——卸载时它们全都能一键清掉:

默认位置
内核二进制 /usr/local/bin/mihomo
配置文件 /etc/mihomo/config.yaml
systemd 服务 /etc/systemd/system/mihomo.service
快捷命令 /usr/local/bin/mihomo-up
脚本缓存 /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 启动起来

交互输入读的是 /dev/tty 而不是标准输入,所以 bash <(curl ...) 这种 stdin 已被占用的运行方式,菜单照样能按键。

快速开始

交互菜单(推荐,首次安装和日常维护都用它):

bash <(curl -fsSL https://git.im0o.top/im0o/mihomo-up/raw/branch/main/mihomo-up.sh)

菜单第 1 项就是一键安装。运行完你会拿到:本机的 HTTP/SOCKS5 代理端口、一个 Web 面板地址和它的访问密钥、一个开机自启的 systemd 服务。

还会拿到一个 mihomo-up 命令——以后直接输入它就能进菜单,不用再翻上面这条 URL。

命令行:

chmod +x mihomo-up.sh

sudo ./mihomo-up.sh install       # 一键安装:内核 + systemd + 配置向导 + 启动
     ./mihomo-up.sh check         # 只查询不改动:当前版本 vs 最新版本
sudo ./mihomo-up.sh update        # 只更换内核二进制,配置和服务定义不动
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. 装指定版本内核
5. 回滚内核        6. 查看内核备份
7. 配置管理        生成配置 / 改端口 / 看面板密钥 / 校验 / 手动编辑
8. 服务控制        启动 / 停止 / 重启 / 状态 / 日志 / 开机自启
9. Sub-Store       订阅聚合,可选,见下
p. Patchbay        网页编辑配置,可选,见下
u. 卸载 mihomo

一键安装做了什么

  1. 下载内核:按机器架构从 GitHub Releases 取对应的 .gz 并解压
  2. 校验内核:新二进制必须能执行,且 -v 自报的版本号和目标一致,否则不写入磁盘
  3. 准备配置:没有 config.yaml 就运行配置向导;已经有了就保持不动,只问一句要不要重做
  4. 写入服务:按 MetaCubeX 官方文档的推荐写 mihomo.service。已存在且内容不同的话,旧文件先备份成 .bak-<时间戳>
  5. 安装快捷命令:问一句,可以拒绝。它是什么见「快捷命令 mihomo-up」一节
  6. 启动服务:daemon-reload → enable(开机自启)→ restart,启动不了就提示你看 journalctl

每一步都是「缺什么补什么」:已经安装过的机器再运行一遍,不会覆盖你现有的配置。

安装完成后会打印一段总结:代理端口怎么用、面板地址和密钥是什么、日志怎么看。

快捷命令 mihomo-up

一键安装会往 /usr/local/bin/mihomo-up 放一个启动器。它不是脚本本体,而是每次执行都去拉取最新脚本再运行——你更新了仓库,机器上下次输入 mihomo-up 就自动用上新版,不需要谁去手动更新。

mihomo-up                    # 进菜单,参数原样透传
mihomo-up check --json       # 子命令照样能用,退出码也透传

和纯粹的"每次重新下载"不同的是,它会把拉到的脚本落一份缓存到 /var/lib/mihomo-up/,并在这两种情况下回落到缓存:

  • 拉取失败(网络断了、仓库挂了)。这条对代理管理脚本尤其要紧:你最需要它的时候,往往正是代理挂了、网络不正常的时候,那时候还得能进菜单重启服务、看日志。
  • 拉到的东西没通过 bash -n 语法检查(上游推了个坏版本,或者中间设备塞回来一个门户登录页)。宁可用旧的,也不以 root 执行来路不明的半个脚本。

抓取带 5 秒连接 / 20 秒总超时,网络卡住不会让菜单一直转着等。

fork 之后想让快捷命令指向你自己那份,安装的时候加 --script-url <你的 raw 地址>,或者设环境变量 MIHOMO_UP_URL。

cron 里别用它:每次执行都联网拉取脚本,等于给定时任务多加一个失败点。定时任务直接指向缓存那份 /var/lib/mihomo-up/mihomo-up.sh,或者你自己固定的副本。

配置向导问什么

向导生成的是一份最小可用配置,够用,不臃肿。它只认一条订阅地址——多个机场的聚合、节点改名、筛选去重,交给 Sub-Store 那类工具做(见下一节),脚本这边不重复造。

问题 说明
订阅地址 机场给的,或 Sub-Store 输出的那条。写成 proxy-providers,每 24 小时自动更新
本地代理端口 mixed-port,HTTP 和 SOCKS5 共用同一个端口,默认 7890
局域网共享 allow-lan,开了同网段其它设备也能连(还要放行防火墙)
管理接口 只允许本机 / 局域网公网可访问 / 不开启。面板和 API 都连这里
访问密钥 回车即自动生成随机串;管理接口开在 0.0.0.0 时务必设
Web 面板 选是就写 external-ui-url,内核首次启动自己去下载 metacubexd
分流规则 三选一,见下面的表

生成的分组是 PROXY(总开关,手动选,默认跟着 AUTO)和 AUTO(全部节点里自动挑延迟最低的)。

分流规则三选一,内网地址在哪种模式下都直连:

模式 生成的规则 用途
1 全部走代理 MATCH,PROXY 默认
2 指定地区直连、其余走代理 GEOIP,<CC>,DIRECT + MATCH,PROXY 常见的翻墙用法
3 指定地区走代理、其余直连 RULE-SET,... + MATCH,DIRECT 回国 / 分区代理

地区填两位 ISO 代码(CN、US、JP、DE…),小写自动转大写。

**模式 3(回国)**不用 GEOIP,而是生成两条 .mrs 规则集:域名维度打头,IP 维度兜底。原因是很多国内站挂着境外 CDN,域名解析出来的 IP 不在国内段,只靠 GEOIP 会整片漏掉。只有 CN 有成体系的域名列表,填别的国家代码时脚本会当场告诉你只能按 IP 匹配、会漏掉什么。

改配置的安全网:每次改动之前自动备份成 config.yaml.bak-<时间戳>(只留最近 10 份),改完立刻用内核 -t 校验。校验不过会问你要不要还原,服务正在运行的话再问一句要不要重启生效。配置文件权限是 0640,因为密钥就明文存在里面。

复杂配置(DNS、TUN、自定义规则、多开入站端口)请用「手动编辑配置」,它同样有备份、校验、还原兜底。

其中多开入站端口是最常被问到的一个,配置长这样:

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::

rules:
  - GEOIP,CN,DIRECT        # 顺序重要,先放该直连的
  - IN-NAME,in-7801,PROXY
  - MATCH,DIRECT

Sub-Store(可选)

Sub-Store 是订阅聚合器:把多个机场和自建节点合成一条订阅地址,带 Web 界面,能看到筛选后实际剩下哪些节点。菜单第 9 项安装,它是独立服务,不进一键安装,也不是用 mihomo 的前提。

装完的用法是:在它的界面里加各个机场的订阅和自建节点 → 做一条「组合订阅」→ 复制它的 mihomo 格式输出地址 → 回本脚本「配置管理 → 生成配置」填进去。

装法:原生 Node + systemd,装到 /opt/sub-store。脚本不替你装 Node——装语言运行时是最容易搞坏服务器的操作,检测不到时它会打印你这个发行版的安装命令,你执行完再回来。另外需要 unzip。

更新(菜单第 2 项)和内核升级用同一套闸门:下载到临时目录 → node --check 验后端、unzip -t 验前端 → 备份旧的 → 换上 → 起服务 → 起不来自动回滚。任一步不过都不动现有版本。

安全上要知道的一件事:Sub-Store 的后端 API 没有鉴权,访问地址里那串随机路径就是唯一凭据,谁知道谁就能读走你所有订阅(里面带着机场账号)。所以脚本默认绑 127.0.0.1,装完打印现成的 SSH 隧道命令:

ssh -L 3001:127.0.0.1:3001 用户名@你的服务器
# 然后本机浏览器打开脚本给你的那条 http://127.0.0.1:3001/?api=... 地址

要公网直连也可以,但要你明确选,脚本会警告一次。另外注意:把 Sub-Store 生成的订阅链接发给别人时,链接里就含着后端地址。

卸载 mihomo 不会连带删除 Sub-Store——你的订阅数据在里面。要删就走菜单第 9 项里的卸载。

Patchbay(可选)

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 隧道:

ssh -N -L 7580:127.0.0.1:7580 用户名@你的服务器
# 然后本机浏览器打开 http://127.0.0.1:7580,填脚本给你的访问令牌

卸载 mihomo 同样不会连带删除 Patchbay,要删走菜单 p → 卸载。

升级和回滚

update 只更换内核二进制,不动你的配置和服务定义。替换前有两道闸门,任一不过就中止:

  1. 新二进制能运行起来,且 -v 自报的版本号和目标一致
  2. 用新版本去 -t 校验你现有的配置

第二道是为了挡住「新内核不认旧配置」这种升完才发现的问题。配置本来就有毛病、但你只想更换内核时,加 --skip-conf-check 跳过它。

替换前旧内核备份到 /var/backups/mihomo/(保留最近 3 份)。升级后服务启动不了会自动回滚到旧版并重启,然后提示你看 journalctl -u mihomo -n 50。

任何一步失败都不会留下半个系统:要么没动,要么已回滚。

卸载会删什么

sudo ./mihomo-up.sh uninstall           # 逐项确认
sudo ./mihomo-up.sh uninstall --purge   # 全部删除,不询问

直接删掉:内核二进制、mihomo.service 及其备份、mihomo.service.d/ drop-in 目录、快捷命令和它的缓存。systemd 那边会先 stop 再 disable,然后 daemon-reload + reset-failed 把状态清干净。

会单独问你的两项:配置目录 /etc/mihomo(订阅、节点选择记录、面板文件都在里面)、内核备份目录 /var/backups/mihomo。留着的话下次重新安装能直接接上。

在 cron / CI 里用

无参数运行时,脚本会看 stdin 是不是终端:是就进菜单,被管道或 cron 调用就安静地运行 check。

check 的退出码专为脚本化设计:

退出码 含义
0 已是最新
10 有新版(或还没安装)
1 出错

例子——有新版就自动升级:

mihomo-up.sh check && exit 0
[ $? -eq 10 ] && mihomo-up.sh update -y

加 --json 会额外输出一行机器可读的 JSON:

{"current":"v1.19.27","latest":"v1.19.28","outdated":true}

GitHub 直连不通时

内核、版本号、Web 面板都从 GitHub 下载。机器直连 GitHub 失败或太慢时,用 --mirror 指定一个反代前缀,脚本会把它拼在所有 GitHub 地址前面:

sudo ./mihomo-up.sh install --mirror https://ghfast.top/

带 --mirror 运行配置向导时,生成的配置里会额外写上走同一个镜像的 geox-url,免得内核首次启动下载 GeoIP 数据库时卡住。

选项一览

选项 作用
-y, --yes 非交互确认,所有询问都当作同意
-n, --dry-run 只打印会做什么,不实际改动
--force 版本相同也重新安装
--version <v> 指定内核版本,如 v1.19.28
--no-restart 安装完成后不启动服务
--purge uninstall 时连配置目录和备份一起删除
--skip-conf-check 升级时不用新版本预校验现有配置
--json check 时额外输出一行 JSON
--arch <a> 覆盖自动识别的架构:amd64 / arm64 / armv7
--variant <v> amd64 微架构变体:v1 / v2 / v3 / compatible
--mirror <url> GitHub 反代前缀,用法见上一节
--script-url <u> 快捷命令每次去拉的脚本地址(fork 后指到你自己那份)
--bin <path> 内核路径,默认 /usr/local/bin/mihomo
--conf-dir <dir> 配置目录,默认 /etc/mihomo
--service <name> systemd 服务名,默认 mihomo
-v 打印脚本自身版本

默认值与环境变量

命令行选项优先级最高,其次是环境变量,最后是下面这些默认值:

默认值 环境变量
/usr/local/bin/mihomo MIHOMO_BIN
/etc/mihomo MIHOMO_CONF_DIR
mihomo(systemd 服务名) MIHOMO_SERVICE
/var/backups/mihomo MIHOMO_BACKUP_DIR
空(不用镜像) MIHOMO_MIRROR
/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-*。

参考

systemd 服务写法来自 MetaCubeX 官方文档。

一键安装和卸载的思路参考了 ForLoveIcu/mihomo-for-linux-install 和 nelvko/clash-for-linux-install。

S
Description
No description provided
Readme
258 KiB
Languages
Shell 100%