feat: 一键安装、配置向导、卸载
原本只换内核二进制。现在补上从零到能用的完整链路:装内核 → 写 systemd 服务 → 向导生成 config.yaml → 启动,以及反过来的卸载清理。 所有配置改动统一走「先备份 → 改 → 用内核 -t 校验 → 不过就问是否还原」。
This commit is contained in:
@@ -1,64 +1,124 @@
|
|||||||
# mihomo-up
|
# mihomo-up
|
||||||
|
|
||||||
一个 bash 脚本,用来在 Linux 服务器上**检查、安装、升级、回滚 [mihomo](https://github.com/MetaCubeX/mihomo) 内核**(Clash.Meta 的继任者,MetaCubeX 维护的代理核心)。可以直接跑交互菜单,也可以用子命令接进 cron / CI。
|
一个 bash 脚本,在 Linux 服务器上**装好、配好、管住** [mihomo](https://github.com/MetaCubeX/mihomo) 内核(Clash.Meta 的继任者,MetaCubeX 维护的代理内核)。
|
||||||
|
|
||||||
脚本只管内核二进制本身:它**不会**替你创建 systemd 服务、生成配置文件或设置订阅,这些需要你自己先准备好。
|
一条命令从零到能用:下载内核 → 写 systemd 服务 → 用向导生成 `config.yaml` → 启动。之后改订阅、换端口、升级、回滚、卸载也都在同一个菜单里。
|
||||||
|
|
||||||
## 特性
|
它管这三样东西,别的不碰:
|
||||||
|
|
||||||
- **双模式**:终端下无参数运行进入交互菜单;被管道/cron 调用时自动退化为安静的 `check`
|
| | 默认位置 |
|
||||||
- **两道安全闸门**:替换前先验证新二进制能运行且版本号对得上,再用新二进制 `-t` 校验你现有的配置,任一失败就中止、不动任何文件
|
|---|---|
|
||||||
- **自动备份与回滚**:替换前把旧版备份到 `/var/backups/mihomo/`(保留最近 3 份);升级后服务起不来会自动回滚并重启旧版
|
| 内核二进制 | `/usr/local/bin/mihomo` |
|
||||||
- **curl 一键运行友好**:交互输入读 `/dev/tty`,`bash <(curl ...)` 管道方式运行菜单照样能按键
|
| systemd 服务 | `/etc/systemd/system/mihomo.service` |
|
||||||
- 支持 amd64 / arm64 / armv7,amd64 可指定微架构变体(v1/v2/v3/compatible)
|
| 配置文件 | `/etc/mihomo/config.yaml` |
|
||||||
|
|
||||||
## 环境要求
|
|
||||||
|
|
||||||
- Linux + bash
|
|
||||||
- 依赖命令:`curl`、`gzip`、`install`、`awk`(一般发行版自带)
|
|
||||||
- 升级操作需要 **root**(要写 `/usr/local/bin` 并重启服务)
|
|
||||||
- 服务的启停依赖 systemd 中名为 `mihomo` 的 service;没有的话脚本只替换二进制、跳过重启
|
|
||||||
|
|
||||||
## 快速开始
|
## 快速开始
|
||||||
|
|
||||||
**交互菜单**:
|
**交互菜单**(推荐,装机和日常维护都用它):
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
bash <(curl -fsSL https://git.im0o.top/im0o/mihomo-up/raw/branch/main/mihomo-up.sh)
|
bash <(curl -fsSL https://git.im0o.top/im0o/mihomo-up/raw/branch/main/mihomo-up.sh)
|
||||||
```
|
```
|
||||||
|
|
||||||
|
菜单第 1 项就是一键安装。跑完你会拿到:本机的 HTTP/SOCKS5 代理端口、一个 Web 面板地址和它的访问密钥,以及一个开机自启的 systemd 服务。
|
||||||
|
|
||||||
**命令行**:
|
**命令行**:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
chmod +x mihomo-up.sh
|
chmod +x mihomo-up.sh
|
||||||
|
|
||||||
./mihomo-up.sh check # 只查不改:当前版本 vs 最新版本
|
sudo ./mihomo-up.sh install # 一键安装:内核 + systemd + 配置向导 + 启动
|
||||||
sudo ./mihomo-up.sh update # 升级到最新版
|
./mihomo-up.sh check # 只查不改:当前版本 vs 最新版本
|
||||||
sudo ./mihomo-up.sh update --version v1.19.28 # 装指定版本
|
sudo ./mihomo-up.sh update # 只换内核二进制,配置和服务定义不动
|
||||||
sudo ./mihomo-up.sh rollback # 回滚到上一个备份
|
sudo ./mihomo-up.sh config # 重新跑配置向导
|
||||||
./mihomo-up.sh list # 查看本地备份
|
sudo ./mihomo-up.sh rollback # 内核回滚到上一个备份
|
||||||
|
sudo ./mihomo-up.sh uninstall # 卸载,会逐项问你配置和备份删不删
|
||||||
```
|
```
|
||||||
|
|
||||||
菜单里另有:校验配置文件、服务控制(启停/状态/最近日志)等入口。
|
## 菜单里有什么
|
||||||
|
|
||||||
|
```
|
||||||
|
1. 一键安装 内核 + systemd + 配置,缺哪步补哪步
|
||||||
|
2. 检查更新 3. 升级内核 4. 装指定版本内核
|
||||||
|
5. 回滚内核 6. 查看内核备份
|
||||||
|
7. 配置管理 换订阅 / 改端口 / 局域网共享 / 面板密钥 / 导入配置 / 校验 / 编辑 / 备份还原
|
||||||
|
8. 服务控制 启停 / 重启 / 状态 / 最近日志 / 开机自启 / 重写服务文件
|
||||||
|
9. 卸载
|
||||||
|
```
|
||||||
|
|
||||||
|
## 一键安装做了什么
|
||||||
|
|
||||||
|
1. **下内核**:按机器架构从 GitHub Releases 取对应的 `.gz` 并解压
|
||||||
|
2. **验内核**:新二进制必须能执行,且 `-v` 自报的版本号和目标一致,否则不落盘
|
||||||
|
3. **配文件**:没有 `config.yaml` 就跑配置向导(下面详述);已经有了就保持不动,只问一句要不要重做
|
||||||
|
4. **写服务**:按 [MetaCubeX 官方文档](https://wiki.metacubex.one/startup/service/)的推荐写 `mihomo.service`;已存在且内容不同的话,旧文件先备份成 `.bak-<时间戳>`
|
||||||
|
5. **起服务**:`daemon-reload` → `enable`(开机自启)→ `restart`,起不来就提示你看 `journalctl`
|
||||||
|
|
||||||
|
装完会打印一段总结:代理端口怎么用、面板地址和密钥是什么、日志怎么看。
|
||||||
|
|
||||||
|
## 配置向导问什么
|
||||||
|
|
||||||
|
向导生成的是一份**最小可用配置**,够跑,不臃肿:
|
||||||
|
|
||||||
|
| 问题 | 说明 |
|
||||||
|
|---|---|
|
||||||
|
| 订阅链接 | 机场给的 http(s) 地址,写成 `proxy-providers`,每 24 小时自动更新一次 |
|
||||||
|
| 本地代理端口 | `mixed-port`,HTTP 和 SOCKS5 共用,默认 7890 |
|
||||||
|
| 局域网共享 | `allow-lan`,开了同网段其它设备也能连(记得放行防火墙) |
|
||||||
|
| 管理接口 | 只允许本机 / 局域网公网可访问 / 不开。面板和 API 都连这里 |
|
||||||
|
| 访问密钥 | 回车即自动生成随机串;管理接口开在 `0.0.0.0` 时务必设 |
|
||||||
|
| Web 面板 | 选是就写 `external-ui-url`,内核首次启动自己去下载 metacubexd |
|
||||||
|
| 分流规则 | 国内直连、其余走代理(默认),或者全部走代理 |
|
||||||
|
|
||||||
|
生成的分组是 `PROXY`(手动选,默认跟着 AUTO)和 `AUTO`(自动挑延迟最低的),规则里内网地址一律直连。
|
||||||
|
|
||||||
|
**改配置不用手写 YAML**:菜单「配置管理」能直接换订阅、改端口、开关局域网共享、改面板密钥。每次改动之前自动备份成 `config.yaml.bak-<时间戳>`,改完立刻用内核 `-t` 校验,**校验不过会问你要不要还原**,服务在跑的话再问一句要不要重启生效。
|
||||||
|
|
||||||
|
需要手写的复杂配置(DNS、TUN、自定义规则)请用菜单里的「手动编辑配置」,或者用「从 URL 导入完整配置」整份换掉——这两条路同样有备份、校验、还原兜底。
|
||||||
|
|
||||||
|
## 升级和回滚
|
||||||
|
|
||||||
|
`update` 只换内核二进制,不动你的配置和服务定义。两道闸门:
|
||||||
|
|
||||||
|
1. 新二进制能跑起来,且版本号对得上
|
||||||
|
2. 用**新版本**去 `-t` 校验你**现有的**配置,通不过就中止,一个文件都不动
|
||||||
|
(配置本来就有问题、但你只想换内核时,加 `--skip-conf-check` 跳过这道)
|
||||||
|
|
||||||
|
替换前旧内核备份到 `/var/backups/mihomo/`(保留最近 3 份)。升级后服务起不来会**自动回滚**到旧版并重启,然后提示你看 `journalctl -u mihomo -n 50`。
|
||||||
|
|
||||||
|
任何一步失败都不会留下半个系统:要么没动,要么已回滚。
|
||||||
|
|
||||||
|
## 卸载会删什么
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo ./mihomo-up.sh uninstall # 逐项确认
|
||||||
|
sudo ./mihomo-up.sh uninstall --purge # 全删,不问
|
||||||
|
```
|
||||||
|
|
||||||
|
直接删掉:内核二进制、`mihomo.service` 及其备份、`mihomo.service.d/` drop-in 目录,并 `daemon-reload` + `reset-failed` 清干净 systemd 状态(服务会先 stop 再 disable)。
|
||||||
|
|
||||||
|
单独问你:配置目录 `/etc/mihomo`(订阅、节点选择记录、面板文件都在里面)、内核备份目录 `/var/backups/mihomo`。留着的话下次重装能直接接上。
|
||||||
|
|
||||||
## 在 cron / CI 里用
|
## 在 cron / CI 里用
|
||||||
|
|
||||||
|
无参数运行时,脚本会看 stdin 是不是终端:是就进菜单,被管道或 cron 调用就安静地跑 `check`。
|
||||||
|
|
||||||
`check` 的退出码专为脚本化设计:
|
`check` 的退出码专为脚本化设计:
|
||||||
|
|
||||||
| 退出码 | 含义 |
|
| 退出码 | 含义 |
|
||||||
|---|---|
|
|---|---|
|
||||||
| 0 | 已是最新 |
|
| 0 | 已是最新 |
|
||||||
| 10 | 有新版(或未安装) |
|
| 10 | 有新版(或还没安装) |
|
||||||
| 1 | 出错 |
|
| 1 | 出错 |
|
||||||
|
|
||||||
例子——有新版时自动升级:
|
例子——有新版就自动升级:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
mihomo-up.sh check && exit 0
|
mihomo-up.sh check && exit 0
|
||||||
[ $? -eq 10 ] && mihomo-up.sh update -y
|
[ $? -eq 10 ] && mihomo-up.sh update -y
|
||||||
```
|
```
|
||||||
|
|
||||||
加 `--json` 会额外输出一行机器可读的 JSON,方便接入监控:
|
加 `--json` 会额外输出一行机器可读的 JSON:
|
||||||
|
|
||||||
```json
|
```json
|
||||||
{"current":"v1.19.27","latest":"v1.19.28","outdated":true}
|
{"current":"v1.19.27","latest":"v1.19.28","outdated":true}
|
||||||
@@ -68,34 +128,54 @@ mihomo-up.sh check && exit 0
|
|||||||
|
|
||||||
| 选项 | 作用 |
|
| 选项 | 作用 |
|
||||||
|---|---|
|
|---|---|
|
||||||
| `-y, --yes` | 非交互确认,全部默认同意 |
|
| `-y, --yes` | 非交互确认,所有询问都当作同意 |
|
||||||
| `-n, --dry-run` | 只打印会做什么,不实际执行 |
|
| `-n, --dry-run` | 只打印会做什么,不实际改动 |
|
||||||
| `--force` | 即使版本相同也重装(`install` 子命令等价于 `update --force`) |
|
| `--force` | 版本相同也重装 |
|
||||||
| `--version <v>` | 指定版本,如 `v1.19.28` |
|
| `--version <v>` | 指定内核版本,如 `v1.19.28` |
|
||||||
| `--no-restart` | 装完不启动服务 |
|
| `--no-restart` | 装完不启动服务 |
|
||||||
|
| `--purge` | `uninstall` 时连配置目录和备份一起删 |
|
||||||
|
| `--skip-conf-check` | 升级时不用新版本预校验现有配置 |
|
||||||
| `--json` | `check` 时额外输出一行 JSON |
|
| `--json` | `check` 时额外输出一行 JSON |
|
||||||
| `--arch <a>` | 覆盖自动识别的架构:`amd64` / `arm64` / `armv7` |
|
| `--arch <a>` | 覆盖自动识别的架构:`amd64` / `arm64` / `armv7` |
|
||||||
| `--variant <v>` | amd64 微架构变体:`v1` / `v2` / `v3` / `compatible` |
|
| `--variant <v>` | amd64 微架构变体:`v1` / `v2` / `v3` / `compatible` |
|
||||||
| `--bin <path>` | 二进制路径,默认 `/usr/local/bin/mihomo` |
|
| `--mirror <url>` | GitHub 下载前缀,见下 |
|
||||||
|
| `--bin <path>` | 内核路径,默认 `/usr/local/bin/mihomo` |
|
||||||
| `--conf-dir <dir>` | 配置目录,默认 `/etc/mihomo` |
|
| `--conf-dir <dir>` | 配置目录,默认 `/etc/mihomo` |
|
||||||
|
| `--service <name>` | systemd 服务名,默认 `mihomo` |
|
||||||
|
| `-v` | 打印脚本自身版本 |
|
||||||
|
|
||||||
|
## GitHub 不通的机器
|
||||||
|
|
||||||
|
内核、版本号、Web 面板都从 GitHub 下载。国内机器直连失败时,用 `--mirror` 指定一个反代前缀,脚本会把它拼在所有 GitHub 地址前面:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo ./mihomo-up.sh install --mirror https://ghfast.top/
|
||||||
|
```
|
||||||
|
|
||||||
|
带 `--mirror` 跑配置向导时,生成的配置里会额外写上走同一个镜像的 `geox-url`,免得内核首次启动下载 GeoIP 数据库时卡住。
|
||||||
|
|
||||||
## 默认值与环境变量
|
## 默认值与环境变量
|
||||||
|
|
||||||
|
命令行选项优先级最高,其次是环境变量,最后是下面这些默认值:
|
||||||
|
|
||||||
| 默认值 | 环境变量 |
|
| 默认值 | 环境变量 |
|
||||||
|---|---|
|
|---|---|
|
||||||
| `/usr/local/bin/mihomo` | `MIHOMO_BIN` |
|
| `/usr/local/bin/mihomo` | `MIHOMO_BIN` |
|
||||||
| `/etc/mihomo` | `MIHOMO_CONF_DIR` |
|
| `/etc/mihomo` | `MIHOMO_CONF_DIR` |
|
||||||
| `mihomo`(systemd 服务名) | `MIHOMO_SERVICE` |
|
| `mihomo`(systemd 服务名) | `MIHOMO_SERVICE` |
|
||||||
| `/var/backups/mihomo` | `MIHOMO_BACKUP_DIR` |
|
| `/var/backups/mihomo` | `MIHOMO_BACKUP_DIR` |
|
||||||
|
| 空(不用镜像) | `MIHOMO_MIRROR` |
|
||||||
|
|
||||||
备份最多保留 3 份(脚本内常量 `KEEP=3`)。
|
内核备份最多保留 3 份(脚本内常量 `KEEP=3`)。配置备份不自动清理,攒多了自己删 `config.yaml.bak-*`。
|
||||||
|
|
||||||
## 升级时发生了什么
|
## 环境要求
|
||||||
|
|
||||||
1. 从 GitHub Releases 下载对应架构的 `.gz` 包并解压
|
- Linux + bash 4 以上
|
||||||
2. **闸门 1**:新二进制必须能执行,且 `-v` 报告的版本号与目标一致
|
- 依赖命令:`curl`、`gzip`、`install`、`awk`、`sed`(一般发行版自带)
|
||||||
3. **闸门 2**:若存在 `config.yaml`,用新二进制 `-t` 校验现有配置,失败即中止
|
- 安装、升级、改配置、卸载都需要 **root**,非 root 进菜单会先提醒一句
|
||||||
4. 备份旧二进制 → 停服务 → 安装新版 → 启动服务
|
- 没有 systemd 的机器(容器等)也能用:脚本会跳过服务相关步骤,只管内核和配置,你自己 `mihomo -d /etc/mihomo` 拉起来
|
||||||
5. 启动失败则**自动回滚**到刚才的备份并重启,最后提示你查 `journalctl -u mihomo -n 50`
|
- 交互输入读 `/dev/tty`,所以 `bash <(curl ...)` 这种 stdin 被占用的跑法照样能按键
|
||||||
|
|
||||||
任何一步失败都不会留下半个新系统:要么没动,要么已回滚。
|
## 参考
|
||||||
|
|
||||||
|
systemd 服务写法来自 [MetaCubeX 官方文档](https://wiki.metacubex.one/startup/service/)。一键安装和卸载的思路参考了 [ForLoveIcu/mihomo-for-linux-install](https://github.com/ForLoveIcu/mihomo-for-linux-install) 和 [nelvko/clash-for-linux-install](https://github.com/nelvko/clash-for-linux-install)。
|
||||||
|
|||||||
+810
-109
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user