vate
GameHelm(游舵):让游戏服务器真正按需运行
如果一台机器上部署了《幻兽帕鲁》《泰拉瑞亚》等多套游戏服务器,你大概遇到过这样的矛盾:服务器需要随时能开,但并不需要全天候运行;想节省内存和 CPU,又不想每次都登录终端敲一遍 systemctl。
GameHelm(游舵)就是为这件小而具体的事情准备的。它将同一台 Linux 主机上的多个 systemd --user 游戏服务集中到一个 Web 控制台中,让你可以用手机或电脑查看状态、手动启停,并通过自动关服倒计时避免忘记关闭服务器。


为什么需要 GameHelm
游戏服务器通常有两种运行方式:一直开着,省心但持续占用资源;需要时通过 SSH 手动启动,用完后再手动关闭,节省资源但操作繁琐,而且很容易忘记关服。
GameHelm 选择了第三种方式:保留手动决定何时开服的自由,同时把状态查看、倒计时提示和到期关闭交给控制台。
它尤其适合下面三类使用场景。
1. 云服务器资源有限,按游玩计划切换不同游戏
一台云服务器可能同时安装了多套游戏服务,但 CPU 和内存不足以让它们长期并行运行。你可以将每套游戏配置成独立的 systemd user service,再统一接入 GameHelm。
今晚玩《幻兽帕鲁》,就在网页中启动帕鲁服务;周末换《泰拉瑞亚》,关闭前者后再开启后者。控制台不会强制服务互斥,也支持多项服务同时运行,实际如何分配资源完全由你决定。
2. 在本地电脑部署服务器,无人值守时远程控制
有些玩家会把闲置电脑、家庭服务器或小主机用作游戏服务器。主机可以保持开机且不进入休眠,而高负载的游戏进程只在需要时运行。只要能通过局域网、组网工具或 VPN 访问 GameHelm,就可以在另一台电脑或手机上完成启停,不必守在主机旁边。
安装脚本会为运行用户启用 systemd linger,使用户退出登录后,GameHelm 和相关 user services 仍可继续运行。需要注意的是,GameHelm 控制的是游戏服务,并不能唤醒已经关机或休眠的主机。
3. 不想让游戏服务器长时间空转,需要时再手动开服
临时联机往往只持续几个小时,却可能因为忘记关服让进程空转一整晚。通过 GameHelm 启动服务后,系统会自动建立一个 4 小时运行周期,并在页面上实时显示剩余时间和计划关闭时间。
如果游戏还没结束,进入最后 1 小时后可以点击“延长 1 小时”。续时会在原计划关闭时间上增加 1 小时;等倒计时再次进入最后 1 小时后,还可以继续续时。无人续时且倒计时结束后,GameHelm 会请求 systemd 停止服务。游戏是否能保存存档并优雅退出,取决于对应 unit 的停止信号和启动脚本配置。
它是怎样工作的
GameHelm 本身不安装游戏、不直接承载游戏进程,也不接管游戏存档。它通过 systemd 管理已经存在的 user services:
- 在
config.json中登记服务的显示名称与 systemd unit 名称。 - GameHelm 定期读取每个 unit 的加载状态和运行状态。
- 用户在 Web 页面发起启动、停止或续时操作。
- GameHelm 调用
systemctl --user执行操作,并将最新状态同步到页面。 - 服务到达运行时限后,GameHelm 自动执行停止操作。
即使某个游戏服务从命令行或其他途径启动,GameHelm 也会检测到它,并自动接管为一个新的 4 小时运行周期。因此,网页控制台和原有运维方式可以共存。
核心特点
- 多服务统一管理:通过配置文件添加任意数量的游戏服务,各服务独立控制,也可以同时运行。
- 自动关闭与续时:每次启动默认运行 4 小时;每次进入最后 1 小时后可续时一次,增加 1 小时。
- 近实时状态展示:每 2 秒同步运行、启动中、停止中、失败、未安装等状态,以及倒计时和计划关闭时间。
- 自动接管外部启动:通过命令行等方式启动的受管服务也会进入计时。
- 适合手机操作:响应式简体中文界面,在手机和桌面浏览器中都能完成控制。
- 轻量部署:后端仅使用 Go 标准库构建,页面资源嵌入单一二进制,不需要数据库或额外的 Web 运行时。
- 基础安全防护:提供密码登录、浏览器会话、CSRF 防护和安全响应头;同一 IP 连续登录失败 5 次后会锁定 15 分钟。
- 日志集中管理:应用日志写入 systemd user journal,可直接使用
journalctl查看。
快速开始
GameHelm 运行在 Linux 和 systemd 环境中,安装构建要求 Go 1.26.5。它与受管游戏服务必须属于同一个普通用户,不能使用 root 作为运行用户。
首先获取项目并准备配置:
git clone https://github.com/vatebur/gamehelm.git
cd gamehelm
cp config.example.json config.json
nano config.json示例文件的默认密码是公开的 changeme,复制后必须立即改为强密码。实际密码会明文保存在 config.json 中,安装脚本会将该文件权限设置为 0600。
示例配置如下:
{
"listen": "0.0.0.0:8231",
"password": "请替换为强密码",
"services": {
"palworld": {
"display_name": "帕鲁世界",
"unit": "palworld.service"
},
"terraria": {
"display_name": "泰拉瑞亚",
"unit": "terraria.service"
}
}
}其中,unit 必须是同一用户下已经存在的 systemd service。请删除或替换本机不存在的示例服务,否则安装前的检查会失败。确认配置后执行安装:
sudo ./gamehelm.sh安装脚本会构建二进制、验证受管 user services、安装并启动 gamehelm.service,同时启用 linger。安装完成后,在浏览器中访问:
http://服务器IP:8231进入控制台后即可查看并控制所有已配置服务。新增游戏时,先为同一普通用户创建对应的 systemd user unit,然后重新加载并验证:
systemd-analyze --user verify ~/.config/systemd/user/palworld.service
systemctl --user daemon-reload
systemctl --user start palworld.service
systemctl --user status palworld.service
systemctl --user stop palworld.service试运行正常后,将 unit 加入 config.json,再检查并重启 GameHelm:
./gamehelm -config config.json -check
systemctl --user restart gamehelm.service使用前需要了解的边界
GameHelm 的目标是保持简单,因此有几项设计边界值得提前说明:
- 它管理的是同一台主机、同一普通用户下的 systemd user services,不是跨多台主机的集群管理平台。
- 它控制的是游戏进程,不负责启动云主机、物理电脑,也不提供 Wake-on-LAN。
- 倒计时保存在内存中。GameHelm 重启后,会重新发现仍在运行的游戏服务,并从发现时开始新的 4 小时计时。
- 如果 GameHelm 自身停止运行,已经启动的游戏服务不会因此立即停止,也无法在控制台离线期间按倒计时自动关服。
config.json中的密码以明文保存;应限制文件权限、及时更换默认密码,并避免共享该文件。- 当前服务仅提供 HTTP。密码和会话数据会以明文 HTTP 传输,因此应只在可信局域网或 VPN 中访问;如需通过公网使用,应在前方配置 HTTPS 反向代理并做好访问控制。
写在最后
GameHelm 没有试图成为复杂的游戏服务器运维平台。它解决的是一个很日常的问题:让开服足够方便,也让关服不再依赖记性。
对于资源有限的云服务器、家里的无人值守主机,或只在朋友约好后才开放的私人服务器,这样一个轻量控制台就足以把重复的 SSH 操作变成几次清晰的点击,并在控制台在线期间为每次游戏会话提供明确的计划关闭时间。