Files
mihomo-up/README.md
T
im0o 8e4505391d Initial commit: mihomo 内核管理脚本
bash 脚本,用于在 Linux 服务器上检查、安装、升级、回滚 mihomo 内核,
支持交互菜单与命令行双模式,带安全验证、自动备份与回滚。
2026-08-09 12:51:57 +08:00

102 lines
4.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# mihomo-up
一个 bash 脚本,用来在 Linux 服务器上**检查、安装、升级、回滚 [mihomo](https://github.com/MetaCubeX/mihomo) 内核**(Clash.Meta 的继任者,MetaCubeX 维护的代理核心)。可以直接跑交互菜单,也可以用子命令接进 cron / CI。
脚本只管内核二进制本身:它**不会**替你创建 systemd 服务、生成配置文件或设置订阅,这些需要你自己先准备好。
## 特性
- **双模式**:终端下无参数运行进入交互菜单;被管道/cron 调用时自动退化为安静的 `check`
- **两道安全闸门**:替换前先验证新二进制能运行且版本号对得上,再用新二进制 `-t` 校验你现有的配置,任一失败就中止、不动任何文件
- **自动备份与回滚**:替换前把旧版备份到 `/var/backups/mihomo/`(保留最近 3 份);升级后服务起不来会自动回滚并重启旧版
- **curl 一键运行友好**:交互输入读 `/dev/tty`,`bash <(curl ...)` 管道方式运行菜单照样能按键
- 支持 amd64 / arm64 / armv7,amd64 可指定微架构变体(v1/v2/v3/compatible)
## 环境要求
- Linux + bash
- 依赖命令:`curl`、`gzip`、`install`、`awk`(一般发行版自带)
- 升级操作需要 **root**(要写 `/usr/local/bin` 并重启服务)
- 服务的启停依赖 systemd 中名为 `mihomo` 的 service;没有的话脚本只替换二进制、跳过重启
## 快速开始
**交互菜单**(把地址换成你自己托管的脚本地址):
```bash
bash <(curl -fsSL https://你的地址/mihomo-up.sh)
```
**命令行**:
```bash
chmod +x mihomo-up.sh
./mihomo-up.sh check # 只查不改:当前版本 vs 最新版本
sudo ./mihomo-up.sh update # 升级到最新版
sudo ./mihomo-up.sh update --version v1.19.28 # 装指定版本
sudo ./mihomo-up.sh rollback # 回滚到上一个备份
./mihomo-up.sh list # 查看本地备份
```
菜单里另有:校验配置文件、服务控制(启停/状态/最近日志)等入口。
## 在 cron / CI 里用
`check` 的退出码专为脚本化设计:
| 退出码 | 含义 |
|---|---|
| 0 | 已是最新 |
| 10 | 有新版(或未安装) |
| 1 | 出错 |
例子——有新版时自动升级:
```bash
mihomo-up.sh check && exit 0
[ $? -eq 10 ] && mihomo-up.sh update -y
```
加 `--json` 会额外输出一行机器可读的 JSON,方便接入监控:
```json
{"current":"v1.19.27","latest":"v1.19.28","outdated":true}
```
## 选项一览
| 选项 | 作用 |
|---|---|
| `-y, --yes` | 非交互确认,全部默认同意 |
| `-n, --dry-run` | 只打印会做什么,不实际执行 |
| `--force` | 即使版本相同也重装(`install` 子命令等价于 `update --force`) |
| `--version <v>` | 指定版本,如 `v1.19.28` |
| `--no-restart` | 装完不启动服务 |
| `--json` | `check` 时额外输出一行 JSON |
| `--arch <a>` | 覆盖自动识别的架构:`amd64` / `arm64` / `armv7` |
| `--variant <v>` | amd64 微架构变体:`v1` / `v2` / `v3` / `compatible` |
| `--bin <path>` | 二进制路径,默认 `/usr/local/bin/mihomo` |
| `--conf-dir <dir>` | 配置目录,默认 `/etc/mihomo` |
## 默认值与环境变量
| 默认值 | 环境变量 |
|---|---|
| `/usr/local/bin/mihomo` | `MIHOMO_BIN` |
| `/etc/mihomo` | `MIHOMO_CONF_DIR` |
| `mihomo`(systemd 服务名) | `MIHOMO_SERVICE` |
| `/var/backups/mihomo` | `MIHOMO_BACKUP_DIR` |
备份最多保留 3 份(脚本内常量 `KEEP=3`)。
## 升级时发生了什么
1. 从 GitHub Releases 下载对应架构的 `.gz` 包并解压
2. **闸门 1**:新二进制必须能执行,且 `-v` 报告的版本号与目标一致
3. **闸门 2**:若存在 `config.yaml`,用新二进制 `-t` 校验现有配置,失败即中止
4. 备份旧二进制 → 停服务 → 安装新版 → 启动服务
5. 启动失败则**自动回滚**到刚才的备份并重启,最后提示你查 `journalctl -u mihomo -n 50`
任何一步失败都不会留下半个新系统:要么没动,要么已回滚。