From f9f18ae13c0375423d9f73e2dbe4acde70b6e6c2 Mon Sep 17 00:00:00 2001 From: JianFeeeee Date: Thu, 3 Sep 2026 07:28:13 +0800 Subject: [PATCH] =?UTF-8?q?chore:=20v0.1.1=20=E2=80=94=20=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E5=8F=B7=E6=94=B6=E6=8B=A2=E8=BF=9B=20internal/versio?= =?UTF-8?q?n=20+=20=E5=8F=91=E5=B8=83=E8=84=9A=E6=9C=AC=E6=A0=A1=E9=AA=8C?= =?UTF-8?q?=E5=92=8C=E8=A6=86=E7=9B=96=E5=AE=89=E8=A3=85=E5=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 internal/version 包作为版本号唯一来源,release.sh 通过 -ldflags -X 注入真实 tag。此前 /api/manager/status 与集群 JoinInfo 里各自硬编码 "0.1.0",产物报告的版本与 tag 无关。 - release.sh:SHA256SUMS 移到原生安装包构建之后统一重算,覆盖 deb/rpm/setup.exe/pkg。此前只算 tar.gz/zip,用户校验安装包会得到 "no file was verified"(v0.1.0 发布时实际踩到)。 - rpm spec / build_installers.sh 默认版本与 changelog、README 安装 示例文件名同步到 0.1.1。 验证:go test ./internal/cluster/... ./internal/httpapi/... 通过; 6 平台产物架构逐个 file 校验正确;linux-amd64 实跑 /status 报告 version=0.1.1(确认 ldflags 注入生效)。 --- README.md | 12 +++---- cmd/webui4frpc/main.go | 7 ++-- internal/httpapi/server.go | 3 +- internal/version/version.go | 12 +++++++ packaging/rpm/webui4frpc.spec | 7 +++- packaging/windows/README.md | 66 +++++++++++++++++++++++++++++++++++ scripts/build_installers.sh | 2 +- scripts/release.sh | 18 ++++++---- 8 files changed, 109 insertions(+), 18 deletions(-) create mode 100644 internal/version/version.go diff --git a/README.md b/README.md index 36a48f7..09ab245 100644 --- a/README.md +++ b/README.md @@ -79,7 +79,7 @@ cd web && npm run build && rm -rf internal/httpapi/dist && cp -r web/dist intern ### Linux (Debian / Ubuntu) ```bash -sudo dpkg -i webui4frpc-0.1.0-linux-amd64.deb # 或 linux-arm64.deb +sudo dpkg -i webui4frpc-0.1.1-linux-amd64.deb # 或 linux-arm64.deb sudo nano /etc/webui4frpc/webui4frpc.env # 改掉默认密码 sudo systemctl restart webui4frpc ``` @@ -87,7 +87,7 @@ sudo systemctl restart webui4frpc ### Linux (RHEL / Fedora / openEuler / 默认 / 龙蜥) ```bash -sudo rpm -i webui4frpc-0.1.0-linux-x86_64.rpm +sudo rpm -i webui4frpc-0.1.1-linux-x86_64.rpm sudo vi /etc/webui4frpc/webui4frpc.env sudo systemctl enable --now webui4frpc ``` @@ -97,7 +97,7 @@ sudo systemctl enable --now webui4frpc ### Windows -双击 `webui4frpc-0.1.0-windows-amd64-setup.exe`(ARM 设备用 `windows-arm64-setup.exe`)。 +双击 `webui4frpc-0.1.1-windows-amd64-setup.exe`(ARM 设备用 `windows-arm64-setup.exe`)。 安装向导会询问监听地址与管理员凭据,完成后: - 程序装到 `C:\Program Files\webui4frpc` @@ -107,8 +107,8 @@ sudo systemctl enable --now webui4frpc ### macOS ```bash -sudo installer -pkg webui4frpc-0.1.0-darwin-arm64.pkg -target / # Apple Silicon -sudo installer -pkg webui4frpc-0.1.0-darwin-amd64.pkg -target / # Intel +sudo installer -pkg webui4frpc-0.1.1-darwin-arm64.pkg -target / # Apple Silicon +sudo installer -pkg webui4frpc-0.1.1-darwin-amd64.pkg -target / # Intel ``` 或直接双击 `.pkg` 走图形安装器。安装后 launchd 开机自启,配置在 @@ -126,7 +126,7 @@ sudo launchctl kickstart -k system/com.jianfeeeee.webui4frpc 不想装服务只想跑一下,用对应的 `.tar.gz` / `.zip`,解压即用: ```bash -tar xzf webui4frpc-0.1.0-linux-amd64.tar.gz +tar xzf webui4frpc-0.1.1-linux-amd64.tar.gz ./webui4frpc -addr 127.0.0.1:7500 -user admin -password 你的密码 -workdir ./data ``` diff --git a/cmd/webui4frpc/main.go b/cmd/webui4frpc/main.go index fdf5a72..ff6628f 100644 --- a/cmd/webui4frpc/main.go +++ b/cmd/webui4frpc/main.go @@ -25,6 +25,7 @@ import ( "webui4frpc/internal/process" "webui4frpc/internal/render" "webui4frpc/internal/store" + "webui4frpc/internal/version" ) func main() { @@ -132,7 +133,7 @@ func main() { } var ring *cluster.Engine ring = cluster.NewEngine( - selfID, selfID, *user, *pass, "0.1.0", nil, + selfID, selfID, *user, *pass, version.Version, nil, &cluster.AppHandler{ LoadFn: func() (float64, float64) { // NetPct: real NIC saturation from /proc/net/dev deltas vs @@ -533,7 +534,7 @@ func main() { // CreateCluster so the node is at least functional as standalone. func retryJoinCluster(ctx context.Context, ring *cluster.Engine, targetAddr, joinKey string) { selfNode := ring.State().Nodes[0] - ji := cluster.JoinInfo{ID: selfNode.ID, Addr: selfNode.Addr, Version: "0.1.0", JoinKey: joinKey} + ji := cluster.JoinInfo{ID: selfNode.ID, Addr: selfNode.Addr, Version: version.Version, JoinKey: joinKey} deadline := time.NewTimer(5 * time.Minute) defer deadline.Stop() ticker := time.NewTicker(10 * time.Second) @@ -593,7 +594,7 @@ func retryRejoinCached(ctx context.Context, ring *cluster.Engine, peersJSON stri return } for _, p := range peers { - ji := cluster.JoinInfo{ID: selfNode.ID, Addr: selfNode.Addr, Version: "0.1.0", JoinKey: p.Key} + ji := cluster.JoinInfo{ID: selfNode.ID, Addr: selfNode.Addr, Version: version.Version, JoinKey: p.Key} jc, cancel := context.WithTimeout(ctx, 8*time.Second) err := ring.JoinRing(jc, p.Addr, ji) cancel() diff --git a/internal/httpapi/server.go b/internal/httpapi/server.go index 824a6cb..403fd00 100644 --- a/internal/httpapi/server.go +++ b/internal/httpapi/server.go @@ -20,6 +20,7 @@ import ( "webui4frpc/internal/cluster" "webui4frpc/internal/process" "webui4frpc/internal/store" + "webui4frpc/internal/version" ) //go:embed all:dist @@ -413,7 +414,7 @@ func (h *Handler) handleStatus(w http.ResponseWriter, r *http.Request) { } resp := map[string]any{ - "version": "0.1.0", + "version": version.Version, "workDir": h.WorkDir, "settings": settings, "services": locals, diff --git a/internal/version/version.go b/internal/version/version.go new file mode 100644 index 0000000..592f870 --- /dev/null +++ b/internal/version/version.go @@ -0,0 +1,12 @@ +// Package version holds the single source of truth for the build version. +// +// Value is overridable at build time so release artifacts carry the real tag: +// +// go build -ldflags="-X webui4frpc/internal/version.Version=0.1.1" ./cmd/webui4frpc +// +// Kept in its own package because both cmd/ and internal/httpapi report it +// (main can't be imported, and httpapi must not depend on cmd). +package version + +// Version is the running build's semantic version, without a leading "v". +var Version = "0.1.1" diff --git a/packaging/rpm/webui4frpc.spec b/packaging/rpm/webui4frpc.spec index b48b3c2..fdf0102 100644 --- a/packaging/rpm/webui4frpc.spec +++ b/packaging/rpm/webui4frpc.spec @@ -1,5 +1,5 @@ Name: webui4frpc -Version: %{?_w4f_version}%{!?_w4f_version:0.1.0} +Version: %{?_w4f_version}%{!?_w4f_version:0.1.1} Release: 1%{?dist} Summary: Visual frpc controller with token-ring cluster License: MIT @@ -67,6 +67,11 @@ fi %doc %{_docdir}/webui4frpc/README.md %changelog +* Wed Sep 02 2026 JianFeeeee - 0.1.1-1 +- 修复令牌环冻结:心跳到达时复活被误判 offline 的前驱; + 全环无可达后继时保留 inflight,让 leader 超时重发令牌。 +- WebUI 窄屏适配:侧栅转底部 tab bar,各页响应式重排。 + * Fri Aug 28 2026 JianFeeeee - 0.1.0-1 - 首次发布:per-forward worker 模型、NIC 负载采样、审计 CSV 导出、 session 登录与三级角色。 diff --git a/packaging/windows/README.md b/packaging/windows/README.md index 7e3b01f..09ab245 100644 --- a/packaging/windows/README.md +++ b/packaging/windows/README.md @@ -72,8 +72,74 @@ rm -rf internal/httpapi/dist && cp -r web/dist internal/httpapi/dist cd web && npm run build && rm -rf internal/httpapi/dist && cp -r web/dist internal/httpapi/dist && go build -o webui4frpc ./cmd/webui4frpc ``` +## 安装 + +从 [Release 页](https://gitcode.com/JianFeeeee/webui4frpc/releases/latest) 下载对应平台的安装包。 + +### Linux (Debian / Ubuntu) + +```bash +sudo dpkg -i webui4frpc-0.1.1-linux-amd64.deb # 或 linux-arm64.deb +sudo nano /etc/webui4frpc/webui4frpc.env # 改掉默认密码 +sudo systemctl restart webui4frpc +``` + +### Linux (RHEL / Fedora / openEuler / 默认 / 龙蜥) + +```bash +sudo rpm -i webui4frpc-0.1.1-linux-x86_64.rpm +sudo vi /etc/webui4frpc/webui4frpc.env +sudo systemctl enable --now webui4frpc +``` + +安装后自动建 `webui4frpc` 系统账号、注册 systemd 单元,数据目录在 `/var/lib/webui4frpc`。 +服务以非 root 运行,并启用 `ProtectSystem=full` / `NoNewPrivileges` 等加固项。 + +### Windows + +双击 `webui4frpc-0.1.1-windows-amd64-setup.exe`(ARM 设备用 `windows-arm64-setup.exe`)。 +安装向导会询问监听地址与管理员凭据,完成后: + +- 程序装到 `C:\Program Files\webui4frpc` +- 开始菜单生成启动快捷方式与卸载项 +- 自动添加防火墙入站规则 + +### macOS + +```bash +sudo installer -pkg webui4frpc-0.1.1-darwin-arm64.pkg -target / # Apple Silicon +sudo installer -pkg webui4frpc-0.1.1-darwin-amd64.pkg -target / # Intel +``` + +或直接双击 `.pkg` 走图形安装器。安装后 launchd 开机自启,配置在 +`/usr/local/etc/webui4frpc/webui4frpc.env`,改完执行: + +```bash +sudo launchctl kickstart -k system/com.jianfeeeee.webui4frpc +``` + +> 该 `.pkg` 未经 Apple 公证(notarization)。首次打开若被 Gatekeeper 拦下, +> 在「系统设置 → 隐私与安全」选择仍要打开。 + +### 免安装(tar.gz / zip) + +不想装服务只想跑一下,用对应的 `.tar.gz` / `.zip`,解压即用: + +```bash +tar xzf webui4frpc-0.1.1-linux-amd64.tar.gz +./webui4frpc -addr 127.0.0.1:7500 -user admin -password 你的密码 -workdir ./data +``` + +下载后可用 `SHA256SUMS` 校验完整性: + +```bash +sha256sum -c SHA256SUMS --ignore-missing +``` + ## 运行 +从源码构建后直接跑: + ```bash ./webui4frpc -addr 127.0.0.1:7500 -user admin -password admin123 -workdir ./data ``` diff --git a/scripts/build_installers.sh b/scripts/build_installers.sh index 733420e..b84677b 100755 --- a/scripts/build_installers.sh +++ b/scripts/build_installers.sh @@ -12,7 +12,7 @@ # 在 release.sh 流程内被调用;依赖 dist/artifacts//bin/-/ 下的二进制。 set -euo pipefail -VERSION="${1:-0.1.0}" +VERSION="${1:-0.1.1}" VERSION="${VERSION#v}" ROOT="$(cd "$(dirname "$0")/.." && pwd)" OUT="$ROOT/dist/artifacts/$VERSION" diff --git a/scripts/release.sh b/scripts/release.sh index 8de8445..f3de524 100755 --- a/scripts/release.sh +++ b/scripts/release.sh @@ -3,7 +3,7 @@ # webui4frpc 多平台发布脚本 # # 用法: -# ./scripts/release.sh [version] # 默认 version=0.1.0 +# ./scripts/release.sh [version] # 默认 version=0.1.1 # # 行为: # 1. 构建前端 (web/dist) 并同步到 internal/httpapi/dist (go:embed 用) @@ -19,7 +19,7 @@ # NO_BUILD_FRONTEND 设为 1 跳过前端构建 (用现有 dist) set -euo pipefail -VERSION="${1:-0.1.0}" +VERSION="${1:-0.1.1}" VERSION="${VERSION#v}" # 去掉可能的前导 v ROOT="$(cd "$(dirname "$0")/.." && pwd)" OUT="$ROOT/dist/artifacts/$VERSION" @@ -77,7 +77,8 @@ for target in "${TARGETS[@]}"; do mkdir -p "$bindir" echo "==> 编译 $os/$arch" env $GOFLAGS_ENV CGO_ENABLED=0 GOOS="$os" GOARCH="$arch" \ - go build -trimpath -ldflags="-s -w" \ + go build -trimpath \ + -ldflags="-s -w -X webui4frpc/internal/version.Version=$VERSION" \ -o "$bindir/$bin" "$ROOT/cmd/webui4frpc" done @@ -126,16 +127,21 @@ done rm -rf "$OUT/.stage" # ---- 4. 校验和 ---- -echo "==> 生成 SHA256SUMS" -( cd "$OUT" && sha256sum *.tar.gz *.zip 2>/dev/null | tee SHA256SUMS ) +# 先生成免安装包的校验和;原生安装包构建完后在 4.6 统一重算, +# 保证 SHA256SUMS 覆盖 deb/rpm/setup.exe/pkg(否则用户校验会 "no file was verified")。 # ---- 4.5 原生安装包 (deb/rpm/setup.exe/pkg) ---- if [ "${NO_INSTALLERS:-0}" != "1" ]; then echo "" -echo "==> 构建原生安装包" + echo "==> 构建原生安装包" "$ROOT/scripts/build_installers.sh" "$VERSION" fi +# ---- 4.6 校验和(覆盖全部产物)---- +echo "" +echo "==> 生成 SHA256SUMS" +( cd "$OUT" && sha256sum *.tar.gz *.zip *.deb *.rpm *-setup.exe *.pkg 2>/dev/null | tee SHA256SUMS ) + # ---- 5. 汇总 ---- echo "" echo "==> 发布产物位于: $OUT"