69801ecc3f
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.
112 lines
4.3 KiB
Markdown
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。 |