# servy-go
**Repository Path**: aprilyu/servy-go
## Basic Information
- **Project Name**: servy-go
- **Description**: No description available
- **Primary Language**: Go
- **License**: MulanPSL-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2026-10-30
- **Last Updated**: 2026-11-05
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# Servy Go
**把任意程序作为原生 Windows 服务运行**
*Go 重写 · 中文界面 · 无运行时依赖 · 单个 10.8 MB 的 exe*
[](https://go.dev)



[特性](#features) · [快速开始](#quickstart) · [升级](#upgrade) · [架构文档](docs/architecture.md)
---
## 为什么做这个
[Servy](https://github.com/aelassas/servy)(C#)把"任意程序变成 Windows 服务"做得很好,但二选一:
要么用 2 MB 的 net48 包(依赖 .NET Framework 4.8),要么用 118 MB 的自包含包。
Servy Go 用 Go 重写了它最核心的能力,一个 **~10.8 MB 的 exe 同时承担图形界面、命令行
和服务宿主**,不需要任何运行时。
| | Servy 10.7(C#) | Servy Go |
|---|---|---|
| 运行时依赖 | .NET Framework 4.8 / 自包含包 118 MB | 无 |
| 产物体积 | 2 MB(需运行时)/ 118 MB | ~10.8 MB |
| 界面 | WPF(英文) | Win32 原生控件(中文) |
| 配置载体 | SQLite + 常驻 Host 服务 + 命名管道 | SQLite,**无额外常驻服务** |
| 数据位置 | `%ProgramData%` | exe 同级 `data\` 与 `logs\` |
## ✨ 特性
- 🎯 **托管任意程序** — 工作目录、启动参数、环境变量(支持 `%VAR%` 展开)、进程优先级、CPU 亲和性、启动类型(自动/延迟/手动/禁用)
- 🛡 **进程树守护** — Job Object 整树清理,杜绝孤儿进程;故障自动重启(次数/间隔可配),SCM 层崩溃恢复兜底
- 📝 **日志** — stdout/stderr 重定向 + 按大小轮转;中文 Windows 下 GBK 输出自动转 UTF-8
- 📊 **资源监控** — 列表实时显示 CPU 与内存占用(与任务管理器同口径),默认不自动刷新,可选 10 秒
- 🔍 **搜索与批量** — 服务名/显示名模糊过滤;勾选多行批量启动、停止、重启、卸载
- 🖥 **原生 GUI + CLI** — walk(comctl32 原生控件),无 webview;CLI 支持 `--json` 供 CI/脚本消费
- 📦 **绿色部署** — 配置、日志全部在 exe 同级目录,换机器拷目录即迁移
## 🚀 快速开始
### 安装第一个服务
从 [Releases](../../releases) 下载 `servy.exe`,以管理员身份运行:
```powershell
.\servy.exe install -name MyWeb -path "C:\apps\web\server.exe" -args="--port 8080"
```
完成——服务已注册并启动。配置在 `data\servy.db`,日志在 `logs\`。
也可以直接双击 `servy.exe` 打开图形界面操作。
### 常用命令
| 命令 | 说明 |
|---|---|
| `servy` | 打开图形界面 |
| `servy list` / `status <名>` | 查看服务(`--json` 可选) |
| `servy install / update / uninstall` | 注册、修改、移除 |
| `servy start / stop / restart <名>` | 运行控制 |
| `servy debug <名>` | 前台运行,不装服务即可验证配置 |
完整选项见 `servy help`;界面上的每个输入框都有悬停提示。
### 从源码构建
```powershell
git clone <本仓库>
cd servy-go
.\build.ps1 # 测试 → 生成图标 → 编译到 dist\servy.exe
```
需要 Go 1.21+;无需 cgo / gcc / Node / .NET。
## ⬆️ 升级
Windows 会锁定正在运行的 exe,直接覆盖会提示"文件正在使用"。
把新 exe 和 `upgrade.ps1` 放到服务器上,以管理员身份运行:
```powershell
.\upgrade.ps1 -NewExe D:\download\servy.exe
```
脚本会自动停止依赖该文件的服务、替换文件、再按原状态重启,失败自动回滚。
依赖的服务会短暂中断几秒。详见 [upgrade.ps1](upgrade.ps1)。
## 📖 文档
- [架构与实现](docs/architecture.md) — 模块地图、服务生命周期、状态机、关键设计决策与踩坑记录
## ⚠️ 已知限制
- 被托管的 GUI 程序运行在 Session 0,桌面上看不到窗口——Windows 服务模型的限制,原版同样如此
- 服务账户固定 LocalSystem;自定义账户暂未支持
- 停止为强制终止进程树,无优雅协商(`WM_CLOSE`)
- 未实现:pre/post 钩子、心跳 URL、事件日志上报、配置导入导出、PowerShell 模块
- 未签名的 Go 服务类程序容易被杀软误报,生产部署建议做代码签名
## 致谢
架构思路与功能设计受 [Servy](https://github.com/aelassas/servy)(MIT)启发,代码为独立实现。
## License
[木兰宽松许可证 第2版(MulanPSL-2.0)](LICENSE)