2571 字
13 分钟
让你的Project Zomboid服务器初步自动化

1. 前言#

最近搭了个僵毁的服务器跟群友一起玩耍,有一个公网IP确实在这方面方便许多,不过也产生了一些痛点需要解决:

  • 家宽IP几天会重新拨号一次,IP不稳定。
  • 改配置需要机主在,虽然家庭电脑基本全年无休,但我不是24小时都在电脑面前。
  • 改动配置后还得手动重启一下服务器,这游戏并没有restart功能。

注意,本文本质上是一个备忘录,并不完全照顾于新手,不懂的地方请自行咨询LLM。

更好的解决方案应该是Docker里面部署服务器且实现以上一切功能,但如果你只求快速解决这个问题,按照下面的方式大概半小时内即可解决,本质上这是一坨胶水黏贴起来的糊糊工程,能用而已。

抽空做了个基于Docker的一键端,新增加了Web管理面板去管理配置以及解析模组。

2. 解决家宽IP问题#

市面上有很多种将IP与域名自动化绑定的工具,其实原理无外乎就是:

  1. 先使用云服务提供商给的Account_ID以及API_KEY与云服务提供商进行连接。
  2. 查询其DNS绑定的服务器地址。
  3. 轮询一些查询IP的网址,获取你当前的公网IP。
  4. 将获取到的公网IP与云服务提供商提供的DNS服务器地址做对比,如果发生改变则覆写。

大陆用户可以考虑直接使用:ddns-go 脚本来简化这一段操作。

根据它所需要的配置代入进去即可。

没有域名?参考:域名购买

3. 解决自动化的问题#

最快的方案是FileBrowser+Rcon+ps1/bash脚本,通过路由器暴露端口到公网。

解决了域名的问题自然可以解决Https问题,这些都会在后面提到,这样你暴露在公网的端口也会安全许多。

3.1 FileBrowser#

这是一个开源的跨平台的文件编辑与传输工具,用途很多,这里纯粹是开放给朋友编辑配置文件。

点击进入下载页,选择windows-amd64-filebrowser.zip

用法也十分简单,解压后进入你文件夹内,右键文件夹,选择使用终端(terminal)打开,这样你的terminal就能直接进入到当前文件夹。

Terminal window
.\filebrowser.exe config set --port 35088
.\filebrowser.exe config set --address 0.0.0.0
# 假设你的僵毁文件保存在如下目录,如果不是则自行输入你僵毁配置所在目录
.\filebrowser.exe config set --root "C:\Users\你的用户名\Zomboid\Server"
# 设置完后启动
.\filebrowser.exe

第一次启动时,默认的用户名为admin,且它会给你自动生成一个相对robust密码,自己找个地方记着。

嫌麻烦就干脆在目录下创建一个脚本start.bat,编辑如下:

Terminal window
@echo off
echo [INFO] 正在应用配置...
:: 假设你的僵毁文件保存在如下目录,如果不是则自行输入你僵毁配置所在目录
.\filebrowser.exe config set --root "C:\Users\你的用户名\Zomboid\Server"
.\filebrowser.exe config set --port 35088
.\filebrowser.exe config set --address 0.0.0.0
echo [INFO] 配置完成,正在启动服务器...
echo [INFO] 请访问 http://localhost:35088
:: 启动主程序 (这行命令会一直卡住运行,直到你关闭窗口)
.\filebrowser.exe
:: 防止意外关闭后看不到报错,启动后别关掉这个terminal哈,退出的话Filebrowser也退出了
pause

然后以管理员身份打开powershell,执行如下命令:

Terminal window
# 选A(全是) 回车。
Set-ExecutionPolicy RemoteSigned
# 开放35088端口
New-NetFirewallRule -DisplayName "FileBrowser (TCP 35088)" -Direction Inbound -LocalPort 35088 -Protocol TCP -Action Allow

现在你直接通过路由器暴露你的35088端口外网即可访问。

FileBrowser默认是不加密的Http传输,虽然直接暴露出去并没有什么问题,但现在终究是Https的天下,申请证书也是免费的,有了域名建议顺手将这件事做了。

3.1.1 开启HTTPS(推荐)#

Cloudflare申请一个API_Key以及获取Account_ID,具体操作在这里

关于Windows内执行acme.sh脚本的问题,请自行咨询LLM,或者下载个Git,通过其Bash执行如下命令,注意是在GitBash里头,而不是powershell或者terminal

Terminal window
# 下载并安装(把 my@example.com 换成你的邮箱,用于接收过期提醒)
curl https://get.acme.sh | sh -s email=my@example.com
export CF_Token="你的Token"
export CF_Account_ID="你的ID粘贴在这里"
# 执行证书申请
/c/Users/你的用户名/.acme.sh/acme.sh --issue --dns dns_cf -d 你的域名
# 等待完成后,使用它生成cert以及key,请在生成之前自行创建好cert目录,或者干脆自己改改路径直接生成在d盘/c盘都可以。
/c/Users/Meteo/.acme.sh/acme.sh --install-cert -d zomboid.astro777.cfd \
--key-file /d/cert/key.pem \
--fullchain-file /d/cert/cert.pem

将获取到的key.pem以及cert.pem放到FileBrowser的文件夹下,回顾一下之前的用法,自行键入或者将下面命令保存到start.bash中:

Terminal window
.\filebrowser.exe config set --cert "d:\cert\cert.pem"
.\filebrowser.exe config set --key "d:\cert\key.pem"

再执行.\filebrowser.exe即可开启Https

不管你有没有开启HttpsFileBrowser都已经是可用状态。

通过localhost:35088登录进网页客户端之后:

  • 点击admin

  • User Management

  • New

    • 自行设置Username/Password
    • Scope因为之前在启动的时候已经设置了base,你直接填/即可,指向的是僵毁的配置目录。
    • Language自己选简体中文
    • Permissions看你的需求,我只开放了Edit
  • 如果你想改admin密码的话也可以自行去更改。

这样,你的朋友就可以通过你设置的账号密码登录面板来改动文件的同时,你也不用担心他乱搞。

为了防止公网被扫描和暴力破解,建议在创建好给朋友的最小权限账户后,将默认的 admin 账户直接删除。

如果后续需要admin账户,你再让其重新生成即可,FileBrowser 设计了命令行工具,你只需要在服务器本机执行一条命令:

Terminal window
# 在文件所在目录下打开终端,执行下面这句话即可创建一个新的临时管理员
# 语法:users add <用户名> <密码> --perm.admin
.\filebrowser.exe users add 用户名 密码 --perm.admin

3.2 Rcon#

RCON (Remote Console) 是一种用于游戏服务器管理的远程控制协议和工具,允许管理员通过网络在远程位置执行服务器命令

这个没啥好说明的,感兴趣就自己去看看说明,没兴趣就直接点击进入下载页

或直接下载rcon-0.10.3-win64.zip

解压放一边备用。

3.3 编写自动化脚本#

首先,我们来改造一下启动的文件,将目光聚焦到僵毁独立服务器目录下面的StartServer64.bat

使用VS Code编辑,去掉PAUSE

然后我们在文件夹内新建一个AutoRestart.bat

当然,你也可以自己放在单独放脚本的地方,注意call ".\StartServer64.bat"的路径,按照个人实际情况修改。

Terminal window
@echo off
title PZ Server Watchdog
:loop
cls
echo [INFO] %date% %time% - 正在启动僵毁服务器...
echo [INFO] 服务器运行中。如需重启,请通过 RCON 发送 quit,或修改 RESTART.txt 触发。
:: ========================================================
:: 调用你的启动脚本 (确保里面的 PAUSE 已经被删掉了!)
:: ========================================================
call ".\StartServer64.bat"
:: ========================================================
:: 当上面的 call 结束时,说明服务器已经关闭了
:: ========================================================
echo.
echo [WARNING] 服务器进程已结束!
echo [INFO] 正在等待 10 秒后重新启动... (防止崩溃死循环)
echo [INFO] 如果你想彻底关服,请现在直接关闭这个窗口。
:: 等待 10
timeout /t 10
:: 回到开头,重新启动
goto loop

接下来就是监控配置文件修改以触发服务器重启。

因为僵毁独立服务器启动的时候会自动更改server.ini文件,不建议监控这个文件。

僵毁服务器配置目录下新建个RESTART.txt文件,我们去监控这个文件。

然后在你放脚本的地方,新建一个AutoReload.ps1的脚本文件,使用VS Code编辑,将下面配置Copy进去并按照个人实际情况修改:

Terminal window
Write-Host ">>> Initializing Monitor Script..." -ForegroundColor Cyan
# ================= Configuration =================
# 监控路径,如果你的僵毁配置文件路径在C盘且在你的个人目录下,可以不用改。
$watcherPath = "$env:USERPROFILE\Zomboid\Server"
# 只监控这个触发文件,忽略 ini 和 lua 的变动
$filter = "RESTART.txt"
# ================= Start Watcher =================
$watcher = New-Object System.IO.FileSystemWatcher
$watcher.Path = $watcherPath
$watcher.Filter = $filter
$watcher.IncludeSubdirectories = $false
$watcher.EnableRaisingEvents = $true
# ================= Define Action =================
$action = {
# --- RCON Config ---
# 刚刚让你备用的RCON在这里派上用场,你需要将目录指向那边。
$rconExe = "D:\project\rcon-0.10.3-win64\rcon.exe"
# 这里是rcon的端口,跟server.ini那边的rcon port要一一对应。
$rconAddr = "127.0.0.1:27015"
# 这里是rcon的密码,跟server.ini那边的rcon password要一一对应。
$rconPass = "xxx"
# 防抖时间,2秒内多次触发RESTART.txt改动只会发送一次rcon quit指令
$debounceTime = 2
$name = $Event.SourceEventArgs.Name
$changeType = $Event.SourceEventArgs.ChangeType
Write-Host "---------------------------------------------"
Write-Host "[TRIGGER DETECTED] Restart signal received via: $name" -ForegroundColor Yellow
Write-Host "Processing restart request..." -ForegroundColor Cyan
Start-Sleep -Seconds $debounceTime
Write-Host "Sending QUIT command to server..." -ForegroundColor Green
if (-not (Test-Path $rconExe)) {
Write-Host "[ERROR] rcon.exe not found!" -ForegroundColor Red
return
}
try {
$argList = "-a $rconAddr -p $rconPass quit"
$process = Start-Process -FilePath $rconExe -ArgumentList $argList -NoNewWindow -PassThru -Wait
if ($process.ExitCode -eq 0) {
Write-Host "[SUCCESS] Server is restarting..." -ForegroundColor Magenta
} else {
Write-Host "[WARNING] RCON failed. Is the server running?" -ForegroundColor Red
}
}
catch {
Write-Host "[EXCEPTION] $_" -ForegroundColor Red
}
}
# ================= Register Event =================
Unregister-Event -SourceIdentifier "FileChanged" -ErrorAction SilentlyContinue
Register-ObjectEvent $watcher "Changed" -SourceIdentifier "FileChanged" -Action $action
Write-Host ">>> TRIGGER MODE STARTED <<<" -ForegroundColor Green
Write-Host "Watching for changes in: RESTART.txt"
Write-Host "To restart server: Open RESTART.txt, make any change, and SAVE."
Write-Host "Press Ctrl+C to stop."
while ($true) { Start-Sleep -Seconds 1 }

然后打开这些脚本即可实现朋友改动配置文件后自动化重启服务器。

4. 一键启动#

嫌打开那么多脚本文件很麻烦,可以写一个总的脚本文件RunAll.bat囊概:

Terminal window
wt -w 0 new-tab --title "DDNS" -d "你放DDNSgo的路径" cmd /k ddnsgo.exe ; ^
new-tab --title "FileBrowser" -d "你放FileBrowser的路径" cmd /k fileBrowser.exe ; ^
new-tab --title "Monitor" -d "你放脚本的路径" powershell -NoExit -File AutoReload.ps1 ; ^
new-tab --title "PZ Server" -d "你放脚本的路径" cmd /k AutoRestart.bat

现在,双击 RunAll.bat,你就拥有了一个具备 DDNS 动态解析、网页端文件管理、全自动热重启的自动化僵尸毁灭工程服务器了。

让你的Project Zomboid服务器初步自动化
https://blog.astro777.cfd/posts/games/windows-project-zomboid-server-automation/
作者
ASTRO
发布于
2026-01-09
许可协议
CC BY-NC-SA 4.0