1. 前言
最近搭了个僵毁的服务器跟群友一起玩耍,有一个公网IP确实在这方面方便许多,不过也产生了一些痛点需要解决:
家宽IP几天会重新拨号一次,IP不稳定。- 改配置需要机主在,虽然家庭电脑基本全年无休,但我不是24小时都在电脑面前。
- 改动配置后还得手动重启一下服务器,这游戏并没有
restart功能。
注意,本文本质上是一个备忘录,并不完全照顾于新手,不懂的地方请自行咨询LLM。
更好的解决方案应该是Docker里面部署服务器且实现以上一切功能,但如果你只求快速解决这个问题,按照下面的方式大概半小时内即可解决,本质上这是一坨胶水黏贴起来的糊糊工程,能用而已。
抽空做了个基于Docker的一键端,新增加了Web管理面板去管理配置以及解析模组。
2. 解决家宽IP问题
市面上有很多种将IP与域名自动化绑定的工具,其实原理无外乎就是:
- 先使用云服务提供商给的
Account_ID以及API_KEY与云服务提供商进行连接。 - 查询其
DNS绑定的服务器地址。 - 轮询一些查询IP的网址,获取你当前的公网IP。
- 将获取到的公网IP与云服务提供商提供的DNS服务器地址做对比,如果发生改变则覆写。
大陆用户可以考虑直接使用:ddns-go 脚本来简化这一段操作。
根据它所需要的配置代入进去即可。
没有域名?参考:域名购买
3. 解决自动化的问题
最快的方案是FileBrowser+Rcon+ps1/bash脚本,通过路由器暴露端口到公网。
解决了域名的问题自然可以解决Https问题,这些都会在后面提到,这样你暴露在公网的端口也会安全许多。
3.1 FileBrowser
这是一个开源的跨平台的文件编辑与传输工具,用途很多,这里纯粹是开放给朋友编辑配置文件。
点击进入下载页,选择windows-amd64-filebrowser.zip
用法也十分简单,解压后进入你文件夹内,右键文件夹,选择使用终端(terminal)打开,这样你的terminal就能直接进入到当前文件夹。
.\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,编辑如下:
@echo offecho [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,执行如下命令:
# 选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执行如下命令,注意是在Git的Bash里头,而不是powershell或者terminal。Terminal window # 下载并安装(把 my@example.com 换成你的邮箱,用于接收过期提醒)curl https://get.acme.sh | sh -s email=my@example.comexport 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
不管你有没有开启Https,FileBrowser都已经是可用状态。
通过localhost:35088登录进网页客户端之后:
-
点击
admin -
User Management -
New- 自行设置
Username/Password Scope因为之前在启动的时候已经设置了base,你直接填/即可,指向的是僵毁的配置目录。Language自己选简体中文Permissions看你的需求,我只开放了Edit
- 自行设置
-
如果你想改
admin密码的话也可以自行去更改。
这样,你的朋友就可以通过你设置的账号密码登录面板来改动文件的同时,你也不用担心他乱搞。
为了防止公网被扫描和暴力破解,建议在创建好给朋友的最小权限账户后,将默认的 admin 账户直接删除。
如果后续需要admin账户,你再让其重新生成即可,FileBrowser 设计了命令行工具,你只需要在服务器本机执行一条命令:
# 在文件所在目录下打开终端,执行下面这句话即可创建一个新的临时管理员# 语法:users add <用户名> <密码> --perm.admin.\filebrowser.exe users add 用户名 密码 --perm.admin3.2 Rcon
RCON (Remote Console) 是一种用于游戏服务器管理的远程控制协议和工具,允许管理员通过网络在远程位置执行服务器命令
这个没啥好说明的,感兴趣就自己去看看说明,没兴趣就直接点击进入下载页。
或直接下载rcon-0.10.3-win64.zip。
解压放一边备用。
3.3 编写自动化脚本
首先,我们来改造一下启动的文件,将目光聚焦到僵毁独立服务器目录下面的StartServer64.bat
使用VS Code编辑,去掉PAUSE。
然后我们在文件夹内新建一个AutoRestart.bat
当然,你也可以自己放在单独放脚本的地方,注意
call ".\StartServer64.bat"的路径,按照个人实际情况修改。
@echo offtitle PZ Server Watchdog
:loopclsecho [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进去并按照个人实际情况修改:
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 SilentlyContinueRegister-ObjectEvent $watcher "Changed" -SourceIdentifier "FileChanged" -Action $action
Write-Host ">>> TRIGGER MODE STARTED <<<" -ForegroundColor GreenWrite-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囊概:
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 动态解析、网页端文件管理、全自动热重启的自动化僵尸毁灭工程服务器了。