diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 5103d27..4a7f486 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -9,6 +9,11 @@ on: permissions: contents: write # 需要写入权限来创建 Release +env: + # 更新产物镜像前缀:latest.json 里的 GitHub 下载直链会被改写为 <前缀> + 原始直链。 + # 更换镜像时,请同步修改 src-tauri/tauri.conf.json 中 updater.endpoints 的镜像地址。 + MIRROR_PREFIX: "https://ghproxy.net/" + jobs: publish-tauri: strategy: @@ -132,3 +137,45 @@ jobs: releaseDraft: true # 先创建草稿,手动确认后再发布 prerelease: false args: ${{ matrix.args }} + + # 所有平台构建完成后,把 latest.json 里的下载直链改写为镜像前缀, + # 让「下载安装包」这一步也走镜像加速(此前只有检查更新走镜像)。 + mirror-updater-manifest: + needs: publish-tauri + runs-on: ubuntu-latest + permissions: + contents: write + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + steps: + - name: Checkout + uses: actions/checkout@v5 + + - name: Rewrite latest.json download URLs to mirror + run: | + set -euo pipefail + TAG="v$(node -p "require('./package.json').version")" + echo "Release tag: $TAG" + + mkdir -p updater + # 从草稿 Release 中取回 tauri-action 生成的更新清单 + gh release download "$TAG" --pattern latest.json --dir updater --clobber + + node <<'NODE' + const fs = require("fs"); + const file = "updater/latest.json"; + const prefix = process.env.MIRROR_PREFIX; + const data = JSON.parse(fs.readFileSync(file, "utf8")); + let count = 0; + for (const info of Object.values(data.platforms || {})) { + if (info && typeof info.url === "string" && info.url.startsWith("https://github.com/")) { + info.url = prefix + info.url; + count += 1; + } + } + fs.writeFileSync(file, JSON.stringify(data, null, 2) + "\n"); + console.log(`Rewrote ${count} download URL(s) with mirror prefix: ${prefix}`); + NODE + + # 覆盖上传(签名针对安装包字节校验,与 URL 无关,改地址不影响更新校验) + gh release upload "$TAG" updater/latest.json --clobber diff --git a/README.md b/README.md index 3a6cfaf..67d99a2 100644 --- a/README.md +++ b/README.md @@ -1,56 +1,107 @@ # Frpilot -> 一个基于 **Tauri 2 + Vue 3 + TypeScript** 的 [frp](https://github.com/fatedier/frp) 可视化客户端,帮助用户快速配置 frpc 版本、服务器与隧道。 +> 一个基于 **Tauri 2 + Vue 3 + TypeScript** 的 [frp](https://github.com/fatedier/frp) 可视化客户端,帮你用图形界面管理 frpc 版本、服务器与隧道,从此告别手写 `frpc.toml`。 -Frpilot 目前处于早期开发阶段,已完成应用骨架(自定义标题栏、多语言、明暗主题、磨砂玻璃布局)。 +Frpilot 已从「应用骨架」成长为可用的一体化客户端:下载 frpc、配置服务器、编排隧道、一键启动并实时查看日志,全部在同一个窗口里完成,并内置应用内自动更新。 --- -## ✨ 功能特性 +## ✨ 已实现功能 -### 已实现 +### Frpc 版本管理 -- **i18n 国际化**:内置简体中文 / English,语言选择持久化,Ant Design Vue 组件库语言包联动 -- **自定义标题栏**:按操作系统自动切换 - - Windows:左侧 `Frpilot` 标题,右侧「语言 / 明暗 / 设置 / 最小化 / 关闭」 - - macOS:左侧红绿灯(关闭 / 最小化 / 最大化),右侧同上一组按钮 -- **明暗主题**:基于 `@vueuse/core` 的 `useDark`,Tailwind `dark:` 变体 + Ant Design Vue 暗色算法联动,选择持久化 -- **悬浮磨砂玻璃布局**:侧边栏(Aside)与内容区(Content)均为圆角 + `backdrop-filter` 毛玻璃面板 -- **侧边栏菜单**:仪表盘 / 服务器 / 隧道列表 / Frpc 下载 -- **底部系统信息**:CPU 占用、内存占用(百分比 + 进度条)、运行状态指示点 - - 🟢 运行正常 · 🔴 运行异常 · 🟡 未启动 +- 在线拉取 Frp 官方版本列表,支持「所有架构 frpc / frps」开关,按平台与架构筛选 +- 一键下载并自动解压,实时显示下载 / 解压进度与状态 +- 导入本地已有的 `frpc` / `frps` +- 删除已下载版本、复制下载直链 -### 规划中 +### 服务器管理 -- frpc 版本管理与下载 -- 服务器(frps)连接配置管理 -- 隧道配置的增删改查与启停 -- 配置文件的导入 / 导出与校验 +- frps 服务器的新增 / 编辑 / 删除 +- 服务器地址、端口、鉴权 Token、传输协议、TLS 开关、备注 +- 置顶与排序;启用开关(**同一时间仅允许启用一台**服务器) + +### 隧道管理 + +- 覆盖 **TCP / UDP / HTTP / HTTPS / STCP / XTCP / SUDP / TCPMUX** 等代理类型 +- 本地 IP / 端口、远程端口、自定义域名、子域名、URL 前缀 +- 高级配置:密钥、加密、压缩、带宽限制、Proxy Protocol、健康检查、负载均衡 +- 启用 / 置顶 / 排序 + +### 一键启动与实时日志 + +- 仪表盘选择 frpc 版本后「一键启动 / 停止」 +- 自动依据所选版本、已启用的服务器与隧道生成 `frpc.toml` 并拉起独立进程 +- 通过 `frpc-log` / `frpc-exit` 事件实时回显运行日志与进程退出信息 + +### 仪表盘 + +- 系统信息:主机名 / 系统 / 架构 / IP 地址 +- 服务器与隧道数量统计 +- 侧边栏常驻 CPU 占用、内存占用与运行状态指示点(🟢 运行正常 · 🔴 运行异常 · 🟡 未启动) + +### 应用内自动更新 + +- 启动时静默检查,支持手动检查更新 +- 更新弹窗以 **Markdown** 渲染更新说明,展示下载进度 +- 支持「忽略该版本」、一键更新,安装完成后自动重启 + +### 关于页面 + +- 项目介绍、技术栈标签、使用流程指引 +- 开源地址一键跳转、当前版本信息与「检查更新」入口 + +### 界面与体验 + +- **自定义标题栏**:Windows / macOS 双套方案,窗口可拖拽移动;顶部栏集成语言 / 主题 / 检查更新 / GitHub / 设置与窗口控制按钮 +- **macOS 特化**:还原原生红绿灯,隐藏冗余的最小化 / 关闭按钮,禁用 macOS 下不需要的最大化 +- **明暗主题**:跟随切换,Tailwind 暗色变体与 Ant Design Vue 暗色算法同步,选择持久化 +- **悬浮磨砂玻璃**:侧边栏、内容区与卡片统一为圆角 + `backdrop-filter` 半透明面板 +- **国际化**:内置简体中文 / English,语言选择持久化,Ant Design Vue 组件语言包联动 + +--- + +## 🖼️ 界面预览 + +| 仪表盘 | 服务器 | +| --- | --- | +| ![仪表盘](docs/snipastes/仪表盘.webp) | ![服务器](docs/snipastes/服务器.webp) | + +| 隧道列表 | Frpc 下载 | +| --- | --- | +| ![隧道列表](docs/snipastes/隧道列表.webp) | ![Frpc 下载](docs/snipastes/frpc下载.webp) | + +| 设置 · 外观 | 设置 · 关于 | +| --- | --- | +| ![外观设置](docs/snipastes/设置.webp) | ![关于](docs/snipastes/关于.webp) | --- ## 🧱 技术栈 -| 分类 | 选型 | -| ---------- | ---------------------------------------------------------------- | -| 桌面框架 | [Tauri 2](https://v2.tauri.app/)(Rust 后端) | -| 前端框架 | Vue 3(`