# 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`) ## 编译 ```bash 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 运行: ```cmd frpc-client.exe install frpc-client.exe start ``` 服务名:`frpc-client`,显示名:`FRPC Client Service`,启动类型:自动。 ### 2. 导入配置文件 将客户提供的 `frpc.ini` 放到 EXE 同目录即可,服务启动时会自动检测。 若无 ini,可在控制台运行: ```cmd frpc-client.exe import ``` 按提示拖入配置文件路径回车即可。脚本会自动按扩展名分发到 `frpc.ini` 或 `frpc.toml`。 ### 3. 控制台前台运行(调试用) ```cmd frpc-client.exe -d ``` 或 `frpc-client.exe console`,Ctrl+C 退出。日志同时输出到控制台和 `logs/service.log`。 ### 4. 卸载服务 ```cmd 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 上跑一遍 `install` → `start` → 看 `logs/service.log` + Event Viewer。