Files
frpc-client-win/README.md
T
cnbugs 69801ecc3f Initial commit: frpc-client-win v1.0
Single-file Windows frpc service wrapper.

Features:
- Embeds frpc v0.70.1 (16.7MB) into one 18.9MB EXE
- Registers as Windows Service (auto-start, no login required)
- Auto-detects frpc config by three-tier search:
  1. frpc.ini  2. frpc.toml  3. any *.ini/*.toml in exe dir
- Self-healing supervisor: frpc crashes are restarted with
  exponential backoff (2s..60s), capped to avoid log spam
- Console subsystem so install/start show feedback
- FreeConsole on SCM start to suppress console window
- Logs to <exe-dir>/logs/service.log

Subcommands:
  install  start  stop  remove  import  -d

Smoke test (smoke_linux.go) covers all config detection paths
including the custom-name (e.g. frpc-mike.ini) use case.
2026-08-10 22:11:43 +08:00

4.3 KiB

frpc-client-win

单文件 Windows 后台 frpc 服务包装程序。Go 编写,frpc.exe 嵌入进二进制,部署只需一个 EXE。

特性

  • 单文件部署:frpc.exe 通过 embed.FS 嵌入主程序,最终产物一个文件即可
  • Windows Service:注册为系统服务,开机自启,无需登录用户
  • 配置兼容:同时支持 frpc.ini (旧版) 和 frpc.toml (新版) 两种配置格式,优先 .ini
  • 交互式导入:启动时若无配置文件,可在交互会话里 frpc-client.exe import 拖入客户提供的 ini/toml
  • 服务管理子命令:install / start / stop / remove + import + -d 控制台前台
  • 完整日志:本服务日志写 logs/service.log,frpc 输出统一进 logs/frpc.log(实际是 service.log),便于集中取证
  • Windows 事件日志:同时写 Windows Event Log(source=frpc-client)

编译

GOOS=windows GOARCH=amd64 go build -ldflags "-s -w -H windowsgui" -o frpc-client.exe .
  • -H windowsgui:编译为 GUI subsystem,服务运行时无控制台窗口
  • -s -w:去除调试信息,减小体积
  • 当前内嵌 frpc v0.70.1,最终产物约 18.9 MB(frpc.exe 16.7MB + Go runtime 2.1MB + 业务代码)
  • 若只想验证 Go 业务逻辑不实际打包 frpc,可用空文件占位 assets/frpc.exe(代码会正确处理缺失并报错)

内嵌的 frpc 版本

默认内嵌 v0.70.1(frp 最新稳定版)。如需升级:

  1. https://github.com/fatedier/frp/releases 下载对应 frp_X.Y.Z_windows_amd64.zip
  2. 解压,取出 frpc.exe
  3. 替换 assets/frpc.exe,重新编译

用法

1. 安装并启动服务

以管理员 CMD 运行:

frpc-client.exe install
frpc-client.exe start

服务名:frpc-client,显示名:FRPC Client Service,启动类型:自动。

2. 导入配置文件

将客户提供的 frpc.ini 放到 EXE 同目录即可,服务启动时会自动检测。 若无 ini,可在控制台运行:

frpc-client.exe import

按提示拖入配置文件路径回车即可。脚本会自动按扩展名分发到 frpc.inifrpc.toml

3. 控制台前台运行(调试用)

frpc-client.exe -d

frpc-client.exe console,Ctrl+C 退出。日志同时输出到控制台和 logs/service.log

4. 卸载服务

frpc-client.exe stop
frpc-client.exe remove

目录结构

frpc-client.exe        # 本程序(已嵌入 frpc.exe)
frpc.ini               # frpc 配置(优先)/ frpc.toml (备选)
logs/
  service.log          # 本服务日志 + frpc 输出(混合)

服务运行后,logs/service.log 会混合记录 frpc 子进程的所有输出 + 本服务的状态日志。

设计概览

┌─────────────────────────────────────────────────────────────┐
│  Windows SCM                                                │
│    │ Start/Stop/Control                                     │
│    ▼                                                        │
│  Run() -> svc.Run("frpc-client", &handler{cfg})             │
│    │                                                        │
│    ▼                                                        │
│  handler.Execute() -> supervisor.Start() -> exec frpc.exe   │
└─────────────────────────────────────────────────────────────┘
  • main.go 入口,根据子命令分派
  • internal/config:frpc.exe/ini 路径与释放逻辑
  • internal/logger:简易文件日志器
  • internal/service:svc.Handler 实现 + frpc 子进程 supervisor + 服务安装/卸载/启停

验证状态

检查项 状态 备注
Windows vet GOOS=windows GOARCH=amd64 go vet ./... 干净
Windows 编译 18.9 MB, GUI EXE
embed 验证 strings frpc-client.exe 含 fatedier/frp
Linux smoke config 包行为正确(frpc 释放/ini 检测/优先级)

Windows 服务真实运行测试需要 Windows 环境或 wine,本机未做。建议你在 Windows 上跑一遍 installstart → 看 logs/service.log + Event Viewer。