Add panel-ssl.md; update README, installation, batch-certificate, and OpenAPI /system/ssl for challenge, Cloudflare token, and recovery notes. docs: align panel SSL with DNS-01 wildcards Add panel-ssl.md; update README, installation, batch-certificate, and OpenAPI /system/ssl for challenge, Cloudflare token, and recovery notes. docs: align panel SSL with DNS-01 wildcards Add panel-ssl.md; update README, installation, batch-certificate, and OpenAPI /system/ssl for challenge, Cloudflare token, and recovery notes. docs: align panel SSL with DNS-01 wildcards Add panel-ssl.md; update README, installation, batch-certificate, and OpenAPI /system/ssl for challenge, Cloudflare token, and recovery notes. docs: align panel SSL with DNS-01 wildcards Add panel-ssl.md; update README, installation, batch-certificate, and OpenAPI /system/ssl for challenge, Cloudflare token, and recovery notes. docs: align panel SSL with DNS-01 wildcards Add panel-ssl.md; update README, installation, batch-certificate, and OpenAPI /system/ssl for challenge, Cloudflare token, and recovery notes. docs: align panel SSL with DNS-01 wildcards Add panel-ssl.md; update README, installation, batch-certificate, and OpenAPI /system/ssl for challenge, Cloudflare token, and recovery notes. docs: align panel SSL with DNS-01 wildcards Add panel-ssl.md; update README, installation, batch-certificate, and OpenAPI /system/ssl for challenge, Cloudflare token, and recovery notes. docs: align panel SSL with DNS-01 wildcards Add panel-ssl.md; update README, installation, batch-certificate, and OpenAPI /system/ssl for challenge, Cloudflare token, and recovery notes. docs: align panel SSL with DNS-01 wildcards Add panel-ssl.md; update README, installation, batch-certificate, and OpenAPI /system/ssl for challenge, Cloudflare token, and recovery notes. docs: align panel SSL with DNS-01 wildcards Add panel-ssl.md; update README, installation, batch-certificate, and OpenAPI /system/ssl for challenge, Cloudflare token, and recovery notes. docs: align panel SSL with DNS-01 wildcards Add panel-ssl.md; update README, installation, batch-certificate, and OpenAPI /system/ssl for challenge, Cloudflare token, and recovery notes.
234 lines
13 KiB
Markdown
234 lines
13 KiB
Markdown
# 安装、升级与恢复
|
||
|
||
3m-ui 提供两种完整安装方式:Linux 一键安装,以及预构建 Docker 镜像。两者均包含面板和固定版本的 Mihomo,使用相同的首次初始化逻辑。默认安装、更新及 Docker `latest` 只跟随稳定版。
|
||
|
||
## Linux 一键安装
|
||
|
||
完整安装包支持 Linux amd64、arm64,要求 root、systemd 或 OpenRC、可访问 GitHub 的网络。不需要 Go、Node 或系统 libsqlite3。安装过程自动补齐下载和解压工具。
|
||
|
||
```bash
|
||
curl -fsSL https://raw.githubusercontent.com/kazeyukiro/3m-ui/main/scripts/install.sh | sudo sh
|
||
```
|
||
|
||
需要先检查脚本或指定参数时,下载到本地再执行:
|
||
|
||
```bash
|
||
curl -fsSLo install.sh https://raw.githubusercontent.com/kazeyukiro/3m-ui/main/scripts/install.sh
|
||
sudo env PANEL_PORT=8080 sh install.sh --yes
|
||
```
|
||
|
||
环境变量必须传给执行脚本的 `sh`,放在管道左侧的 `curl` 前面不会传递给右侧的安装程序。
|
||
|
||
首次安装默认使用 `8080`。放行面板和各节点实际使用的端口后,访问 `http://SERVER_IP:8080/`。安装时会显示管理员 `admin` 及随机初始密码,首次登录必须修改;遗失密码可执行 `sudo 3m-ui reset-admin`,生成新密码并使旧登录会话失效。密码不会写入配置文件或安装结果文件。
|
||
|
||
配置文件已存在时会保留,包括现有账号、密码、端口和密钥。重复运行安装程序用于更新程序文件,不会重置管理员。修改已安装面板的端口使用 `sudo 3m-ui config port 9000`。
|
||
|
||
从旧版安装脚本迁移时,先执行上面的最新安装命令一次,以安装新的快照与恢复流程;旧版 `3m-ui update` 不具备本文描述的完整备份保证。
|
||
|
||
|
||
### AI 提示词安装
|
||
|
||
把提示词复制到 ChatGPT / Claude / Cursor 等助手,并说明你的系统(如 Ubuntu 22.04)与是否已有 root SSH。助手应只协助执行官方脚本,不要改写成不明来源命令。完整提示词及使用说明见 [AI 提示词安装文档](ai-install-prompt.md)。
|
||
|
||
无需手动复制大段文本,用 `curl` 直接把纯文本提示词加载到剪贴板再粘贴:
|
||
|
||
```bash
|
||
curl -fsSL https://raw.githubusercontent.com/kazeyukiro/3m-ui/main/docs/ai-install-prompt.zh.txt | pbcopy # macOS
|
||
curl -fsSL https://raw.githubusercontent.com/kazeyukiro/3m-ui/main/docs/ai-install-prompt.zh.txt | xclip -sel clip # Linux X11
|
||
curl -fsSL https://raw.githubusercontent.com/kazeyukiro/3m-ui/main/docs/ai-install-prompt.zh.txt | wl-copy # Linux Wayland
|
||
```
|
||
|
||
提示词只引导使用上方官方一键脚本,所有下载均校验 `SHA256SUMS`。
|
||
|
||
测试 / 预发布通道(可选,非默认):
|
||
|
||
```text
|
||
在基础要求上,若用户明确要预发布/测试版,再使用:
|
||
sudo env THREE_M_UI_CHANNEL=pre sh -c 'curl -fsSL https://raw.githubusercontent.com/kazeyukiro/3m-ui/main/scripts/install.sh | sh'
|
||
或已安装后:sudo 3m-ui update pre
|
||
默认仍应安装稳定版。
|
||
```
|
||
|
||
完整预发布提示词可追加到主提示词末尾,详见 [AI 提示词安装文档](ai-install-prompt.md#测试--预发布通道可选非默认)。
|
||
|
||
|
||
### HTTPS 与对外访问
|
||
|
||
首次登录改密后,在「系统设置」配置面板 HTTPS:可以申请域名证书,也可以使用已有证书。
|
||
|
||
- **单域名**:默认 HTTP-01(公网 **80** 可达)。
|
||
- **通配符 `*.example.com`**:选 **DNS-01**,配置 Cloudflare API Token(Zone → DNS → Edit);详见 [panel-ssl.md](./panel-ssl.md)。
|
||
- **公网 IP**:Let’s Encrypt 短效证书(约 6 天、面板自动续期,需 80/443 可达)。
|
||
- **手动路径**:fullchain + privkey(如 certbot 签好的文件)。
|
||
|
||
已有 Nginx / Caddy 的用户可设置面板只监听 `127.0.0.1`,由反向代理提供 HTTPS。域名不是安装前置要求;HTTP 端口本身不代表已启用 HTTPS。
|
||
|
||
配置证书时,将自管证书放在 `/etc/3m-ui/` 或 `/var/lib/3m-ui/`,以便与数据库、密钥一起备份。域名解析、验证所需端口、防火墙与云安全组需要与所选择的访问方式匹配。
|
||
|
||
### 版本与来源
|
||
|
||
`v1.2.3` 等标签是不可变的正式版本,`v1.3.0-rc.1` 是显式选择的候选版本。下列版本号仅为格式示例,请换成 Releases 中实际存在的版本。
|
||
|
||
```bash
|
||
sudo sh install.sh v1.2.3
|
||
sudo 3m-ui update v1.2.3
|
||
|
||
# 主动加入滚动测试通道;此选择会保留至后续更新。
|
||
sudo env THREE_M_UI_CHANNEL=pre 3m-ui update
|
||
|
||
# 返回稳定版更新通道。
|
||
sudo env THREE_M_UI_CHANNEL=stable 3m-ui update
|
||
```
|
||
|
||
没有稳定版可用时会明确失败,不会自动改装 `pre`。默认不会自动升级;执行更新命令时才下载目标版本。
|
||
|
||
发布自己的 fork 时,需要显式选定发行来源,例如:
|
||
|
||
```bash
|
||
sudo env THREE_M_UI_REPO=YOUR_OWNER/3m-ui sh install.sh
|
||
```
|
||
|
||
此来源会保存在安装目录,后续更新沿用它。Docker 使用相同发行仓库的镜像,例如 `ghcr.io/YOUR_OWNER/3m-ui:v1.2.3`。不能假定从 fork 下载原始脚本后,默认下载地址也会自动改变。
|
||
|
||
所有发行下载均校验 `SHA256SUMS`,校验失败就停止。已安装 `cosign` 的用户可设置 `THREE_M_UI_VERIFY_COSIGN=1`,额外要求工作流签名验证。
|
||
|
||
### 自定义内核及高级架构
|
||
|
||
完整安装默认使用 `/usr/local/lib/3m-ui/mihomo`,不自动复用全局 `/usr/local/bin/mihomo`。既有配置指定的内核路径会保留。
|
||
|
||
`--no-mihomo` 只安装 / 更新面板,适用于已有外部内核,或只提供独立面板二进制的其他架构。新装时可设置 `THREE_M_UI_MIHOMO_BINARY=/absolute/path/to/mihomo`。自定义核心需要自行验证兼容性并备份;完整发行包只承诺清单指定的配套版本。
|
||
|
||
### 管理与备份
|
||
|
||
```bash
|
||
sudo 3m-ui status
|
||
sudo 3m-ui version
|
||
sudo 3m-ui logs
|
||
sudo 3m-ui restart
|
||
sudo 3m-ui backup
|
||
sudo 3m-ui update
|
||
```
|
||
|
||
`backup` 会短暂停服,在 `/var/lib/3m-ui/backups/` 创建完整快照,然后恢复原先的运行状态。快照目录可能较大,可在面板 **设置 → 备份** 清理,或调用 `POST /api/v1/system/backups/cleanup`。快照包含面板程序、配套核心、管理脚本、服务定义、配置、加密密钥、数据库及其辅助文件、Mihomo 数据和证书;历史备份不会递归收入新快照。
|
||
|
||
更新先完成下载和校验,再停服建立一致快照,替换程序并执行初始化与 HTTP/HTTPS 健康检查。更新失败会尝试恢复整份快照,包括迁移前的数据库和密钥。恢复失败时会输出可用快照位置。
|
||
|
||
```bash
|
||
# 换成实际创建的绝对路径;命令会先为当前状态再做一份备份。
|
||
sudo 3m-ui restore /var/lib/3m-ui/backups/ACTUAL-SNAPSHOT.tar.gz
|
||
```
|
||
|
||
快照恢复要求原安装路径一致。恢复其他版本时使用对应快照,不能只换旧二进制并假定数据库能够降级。请将重要快照复制到其他机器,定期实际演练恢复。
|
||
|
||
自动快照覆盖本安装的配置与数据目录。若已配置的数据库、核心配置或证书实际位于其他共享目录,脚本会在停服前报出路径并停止,避免声称已经完成备份。先把相关存储迁入受管理目录,或自行完成相应的备份和手动更新。外部核心二进制不会被替换。
|
||
|
||
证书、核心和 ACME 目录内的文件符号链接也会检查实际目标;嵌套目录符号链接和失效链接不支持自动快照,需要先整理为受管理目录内的实际文件和目录。
|
||
|
||
```bash
|
||
sudo 3m-ui uninstall # 保留配置、数据、密钥和证书
|
||
sudo 3m-ui uninstall --purge # 明确确认后彻底删除本安装的持久化内容
|
||
```
|
||
|
||
## Docker
|
||
|
||
使用本发行仓库 Releases 中的 `docker-compose.yml`,固定 Compose 所在目录,避免改变项目名后创建另一组空卷。
|
||
|
||
```bash
|
||
docker compose up -d
|
||
docker compose logs 3m-ui
|
||
```
|
||
|
||
镜像包含面板、配套 Mihomo,首次启动自动生成配置与密钥,并在日志中输出一次随机初始密码。只有密码哈希写入数据库;首次登录改密后可按自己的日志保留策略轮转首次启动日志。配置、数据和日志使用命名卷,卷权限由镜像准备。重启与容器重建不会再次生成账号或密钥。
|
||
|
||
镜像以非 root 用户运行。普通监听默认不需要 `privileged` 或 `NET_ADMIN`。低于 1024 的监听端口如受宿主机限制,可以使用高端口或为确有需要的部署添加 `NET_BIND_SERVICE`;TUN 等功能的权限需要自行配置。
|
||
|
||
### 网络与版本
|
||
|
||
默认 Compose 使用 Linux host 网络。新建监听会直接绑定宿主机端口,不需要重新创建容器,仍需处理端口冲突、防火墙和安全组。
|
||
|
||
需要 bridge 网络时,独立使用另一个模板:
|
||
|
||
```bash
|
||
docker compose -f docker-compose.bridge.yml up -d
|
||
```
|
||
|
||
bridge 模板仅把面板映射到 `127.0.0.1:8080`;公网访问需要反向代理或调整绑定。每个节点需要对应的 TCP/UDP 映射,模板包含端口范围示例。不要将 host 和 bridge 模板叠加使用。
|
||
|
||
建议在 Compose 同目录的 `.env` 中固定正式版本,例如:
|
||
|
||
```dotenv
|
||
THREE_M_UI_IMAGE=ghcr.io/kazeyukiro/3m-ui:v1.2.3
|
||
```
|
||
|
||
将示例换成实际发布标签。默认 `latest` 只跟随稳定版,`pre` 只用于主动参与测试。fork 的镜像仓库与发行仓库一致。
|
||
|
||
### Docker 升级、备份与恢复
|
||
|
||
升级通过替换镜像完成,容器内不运行宿主机安装脚本。升级前先拉取新镜像,再停服备份持久化目录:
|
||
|
||
```bash
|
||
docker compose pull
|
||
docker compose stop
|
||
mkdir -p backups
|
||
chmod 700 backups
|
||
docker compose run --rm --no-deps --user 0 --entrypoint sh \
|
||
-v "$PWD/backups:/backup" 3m-ui -c \
|
||
'umask 077; tar -czf /backup/before-upgrade.tar.gz /etc/3m-ui /var/lib/3m-ui'
|
||
docker compose up -d
|
||
docker compose ps
|
||
```
|
||
|
||
每次使用不同备份文件名;示例中的 `before-upgrade.tar.gz` 会被覆盖。证书和核心配置应存放在这两个持久化目录内。记录备份对应的镜像标签或 digest;需要恢复时停服,将 `.env` 改回该镜像,再恢复整份快照:
|
||
|
||
```bash
|
||
docker compose stop
|
||
docker compose run --rm --no-deps --user 0 --entrypoint sh \
|
||
-v "$PWD/backups:/backup:ro" 3m-ui -c \
|
||
'tar -tzf /backup/before-upgrade.tar.gz >/dev/null &&
|
||
find /etc/3m-ui /var/lib/3m-ui -mindepth 1 -maxdepth 1 -exec rm -rf {} \; &&
|
||
tar -xzf /backup/before-upgrade.tar.gz -C /'
|
||
docker compose up -d
|
||
```
|
||
|
||
恢复前还应备份当前卷。上述恢复命令先验证备份可读取,再清空这两个受管理目录的现有内容,避免将旧的 WAL 等辅助文件混入恢复结果。`docker compose down` 保留卷,`docker compose down -v` 会删除持久化卷。
|
||
|
||
遗失管理员密码时:
|
||
|
||
```bash
|
||
docker compose exec 3m-ui /usr/local/bin/3m-ui reset-admin
|
||
```
|
||
|
||
## 维护发行版本
|
||
|
||
固定 Mihomo 版本、架构资产名和 SHA256 在 `distribution/mihomo.env`。调整此文件意味着更新配套内核,必须重新执行安装与核心兼容验证。原生完整包和 Docker 构建共用这份清单。
|
||
|
||
正式 / 候选版本工作流按标签构建,并拒绝覆盖已发布版本。滚动 `pre` 是独立通道。镜像发布到 `ghcr.io/<当前仓库所有者>/<当前仓库名>`;仓库管理员首次发布时需要确保 package 可见性适合公众拉取。
|
||
|
||
发布验证应涵盖两种架构、首次初始化、真实核心运行、登录改密、创建节点、实际代理连接、更新保留数据和快照恢复。仅编译成功不能证明一台全新服务器可以安装。
|
||
|
||
|
||
## Subscription path and port
|
||
|
||
Optional `server.sub_path` (e.g. `/sub`) and `server.sub_port` in `/etc/3m-ui/config.yaml`, or env `THREE_M_UI_SUB_PATH` / `THREE_M_UI_SUB_PORT`. Legacy `/api/v1/client/sub/:token` remains. Set `public_url` to the client-facing base URL.
|
||
|
||
## Independent core updates
|
||
|
||
The Core page supports manual updates and rollback of official stable and Pre Mihomo
|
||
versions on Linux amd64/arm64. Selected versions persist in the existing data
|
||
volume across panel upgrades. See [core updates](core-updates.md) for validation,
|
||
recovery, and deployment integration details.
|
||
|
||
## Frontend compression and caching
|
||
|
||
The panel precompresses embedded text assets with gzip once at startup and serves
|
||
compressed responses when the client accepts them. Hashed JavaScript and CSS
|
||
assets use `Cache-Control: public, max-age=31536000, immutable`; HTML and assets
|
||
without content hashes use `no-cache` with ETags so new deployments are detected.
|
||
Identity and gzip responses have separate validators and use `Vary: Accept-Encoding`.
|
||
No reverse-proxy compression setting or writable asset directory is required.
|
||
Missing `/assets/` files return an uncached 404 rather than the SPA HTML fallback.
|
||
|
||
## Frontend stack (panel UI)
|
||
|
||
The embedded web UI is **React + Ant Design**, with icons from **Lucide** (`lucide-react`, adapted in `frontend/src/icons.tsx`). Building the panel binary runs `npm ci` / `npm install` and `npm run build` under `frontend/`.
|