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

112 lines
4.3 KiB
Markdown

# 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。