先说一下这个项目是干什么的

我这次做的是一个星露谷物语无头服务器搭建包,仓库叫:

StardewValleyServerKit

项目地址:

https://github.com/wuxianggujun/StardewValleyServerKit

它的目标很简单:尽量让开服这件事不要每次都靠手工折腾。

大概流程是:

  1. 用 Docker 启动服务端容器。
  2. 用自己的 Steam 账号下载正版 Stardew Valley 文件。
  3. 通过 JunimoServer / SMAPI 让游戏以无头房主的方式跑起来。
  4. 玩家通过局域网 IP 或邀请码加入。
  5. 用 noVNC 或本地 Web 面板查看状态、日志和配置。

这里要先说清楚:这个项目不分发游戏文件,也不是破解服。你还是需要自己拥有正版星露谷物语,Steam 授权和游戏下载都走你自己的账号。

为什么要折腾这个

星露谷物语多人联机有一个很现实的问题:房主不在线,其他人就玩不了。

如果只是几个人偶尔玩,那问题不大。但如果想让农场像一个小服务器一样常驻,房主就要一直开着游戏,电脑也要一直挂着。这样挺麻烦,而且窗口、输入、保存、掉线都容易出问题。

所以我最后选了“无头房主”方案。

简单说,就是让一个容器里的游戏客户端一直作为房主运行。它不一定需要你真的坐在屏幕前操作,但它本质上还是一个房主,只是被自动托管起来了。

快速启动

Windows 下可以直接执行:

cd <repo-root>
.\setup.ps1 setup

Linux / macOS 下是:

cd StardewValleyServerKit
chmod +x ./scripts/sdv-server.sh
./scripts/sdv-server.sh setup

脚本会做几件事:

  1. 生成本地 .env
  2. 生成 VNC 密码和 API Key。
  3. 拉 Docker 镜像。
  4. 处理 Steam 登录和游戏文件下载。
  5. 启动无头服务端。
  6. 打印 noVNC、HTTP API、管理面板和游戏直连地址。

启动后常用入口是这几个:

noVNC:          http://localhost:5800
HTTP API:       http://localhost:8080
本地管理面板:   http://localhost:8088
游戏 UDP 端口:  24642
查询 UDP 端口:  27015

如果不确定游戏里应该填哪个 IP,可以执行:

.\setup.ps1 join-info

这个命令会把当前可以尝试的局域网地址和端口打印出来。

我踩的第一个坑:Steam 下载不一定一次成功

刚开始我以为只要 Steam 登录成功,游戏下载就肯定没问题。实际不是。

有时候授权是成功的,账号也确实拥有游戏,但下载 manifest 的时候会遇到 403 (Forbidden),或者 SteamCMD 出现类似 state is 0x402 after update job 的错误。

这个时候不要一直重复普通下载命令,直接换备用流程更省时间:

.\setup.ps1 steamcmd-download -Retries 5

这个流程会通过 SteamCMD 下载 Stardew Valley 本体和 Steamworks SDK。后者很关键,如果 SDK 缺了,JunimoServer 的 Steam GameServer / SDR 相关功能可能会不完整,邀请码也容易出问题。

第二个坑:VNC 能看到画面,但点不动

这个问题我卡了挺久。

一开始我看到 noVNC 有画面,但鼠标点游戏按钮没反应,键盘也没反应。我以为是 VNC 输入链路坏了,后来反复查才发现有几类情况要分开看。

如果只是 RealVNC 点不动,但浏览器 noVNC 可以点,那大概率是 RealVNC 客户端设置问题,比如开了 View-only。

如果 noVNC 和原生 VNC 都点不动,再去检查容器里的 Xvnc 输入参数。项目里已经把默认参数补上了:

-AcceptPointerEvents=1
-AcceptKeyEvents=1
-AcceptSetDesktopSize=1
-AlwaysShared=1
-DisconnectClients=0

也可以直接执行:

.\setup.ps1 vnc-fix
.\setup.ps1 vnc-check

还有一个很容易误判的点:如果画面里显示 PausedAuto Mode On,按 Esc 没反应不一定是 VNC 坏了,可能是 JunimoServer 自动托管模式在接管。

这个时候要按 F9,或者执行:

.\setup.ps1 host-auto

F10 对应的是可见性切换,也可以用命令:

.\setup.ps1 host-visibility

这个坑非常容易让人怀疑人生,因为你看得到画面,也能连上 VNC,但游戏就是不像普通窗口那样响应。

第三个坑:VNC 窗口放大,不代表游戏窗口会跟着变大

我之前也以为 VNC 客户端窗口拖大以后,游戏窗口就会自动跟着变大。

实际不是这么回事。

resize=scale 只是浏览器本地缩放,远程桌面大小不变。你把浏览器窗口放大,只是把画面拉大了,游戏本身的分辨率没有变。

如果远程桌面尺寸已经乱了,比如出现黑边、大块空白,或者 Stardew 窗口没有铺满,可以执行:

.\setup.ps1 vnc-resize

这个命令会按 .env 里的:

DISPLAY_WIDTH=1280
DISPLAY_HEIGHT=800

重新调整 X11 / VNC 桌面和 Stardew 窗口。

如果临时希望浏览器窗口变化时同步改远程桌面,可以把 noVNC 地址里的参数改成:

resize=remote

但我自己更倾向于日常用 resize=scale,远程尺寸固定,画面更稳定。

第四个坑:邀请码不稳定时,优先用 IP 直连

很多人习惯看 Steam 邀请码,但这个东西依赖 Steam / Galaxy P2P 链路。只要那边状态不稳定,就可能出现“有邀请码,但加入失败”的情况。

所以项目默认开启了 IP 直连:

"AllowIpConnections": true

本机测试时,在游戏里输入:

127.0.0.1

同一个局域网里的其他电脑,则输入服务器主机的 WLAN / Ethernet IPv4 地址。

不要填 Docker、WSL、VMware、VirtualBox 那些虚拟网卡地址。

如果你改过端口,就看 .env 里的 GAME_PORT。默认是:

GAME_PORT=24642

公网部署的话,还要放行 UDP 端口和云服务器安全组,这个不能只看 Docker 是否启动。

本地 Web 管理面板

后面我又加了一个本地 Web 管理面板,主要是因为每次手改 .envserver-settings.json 太麻烦。

启动方式:

.\setup.ps1 admin

默认地址:

http://127.0.0.1:8088

面板里可以看:

  1. 容器健康状态。
  2. 加入地址和端口。
  3. 最近玩家活动。
  4. 最近服务端日志。
  5. 常用开服配置。

也可以保存一些配置,比如:

  1. 农场地图。
  2. 最大人数。
  3. 初始小屋数量。
  4. 进服密码。
  5. 游戏端口。
  6. 管理员 Steam64 ID。

这里也有一个注意点:保存配置不是热更新。

端口、人数、IP 直连这类配置一般要重启服务端才生效。农场地图、农场名、初始小屋数量、利润比例这些,通常只对新建农场更可靠,已经存在的存档不一定会被改掉。

当前默认装了哪些 Mod

我当前只保留了两个工具类 Mod:

ConsoleCommands
SaveBackup

ConsoleCommands 主要是为了执行一些 SMAPI 控制命令。

SaveBackup 负责每日备份,至少在测试和折腾 Mod 的时候会安心很多。

暂时没有一上来就塞一堆玩法 Mod。无头服最怕的是“能启动,但过几天存档或者事件坏了”。所以我的建议是先跑稳,再一个一个加 Mod。

挂机测试应该怎么测

这个地方也不能只看“容器有没有运行”。

容器运行只能说明进程还活着,不代表农场里的日程推进、事件、保存、玩家重连都没问题。

我觉得至少要测这些:

  1. 第一天能不能正常过夜保存。
  2. 多人加入后能不能一起睡觉。
  3. 玩家断线重连是否正常。
  4. 第 5 天矿洞是否开启。
  5. 第 3 天地震、铁路开启这类自然事件是否正常。
  6. 雷雨、节日、特殊天气是否能正常进入和离开地图。
  7. 长时间没人操作时,房主是否仍然保持在可用状态。
  8. 重启 Docker 后,存档能否正常加载。

我之前遇到过日志里出现类似:

Kicking xxx because they aren't ready

这种不一定代表服务端崩了,更像是玩家加入流程里没有完成就绪状态,被 JunimoServer 踢掉。真正要看的是容器状态、SMAPI 红字、保存日志、玩家加入和退出记录。

常用命令

日常维护我主要用这几个:

.\setup.ps1 status
.\setup.ps1 logs
.\setup.ps1 restart
.\setup.ps1 backup
.\setup.ps1 join-info
.\setup.ps1 admin
.\setup.ps1 vnc-resize
.\setup.ps1 host-auto
.\setup.ps1 host-visibility

更新前建议先备份:

.\setup.ps1 backup

再更新:

.\setup.ps1 update

如果要加 Mod,我建议一次只加一个。加完之后先跑过夜、节日、重启、重连这些测试,不要一次性堆很多,不然后面出问题很难定位。

最后总结

这次折腾下来,我最大的感受是:星露谷物语所谓“无头服”,本质上并不是传统意义上的 dedicated server。

它更像是把一个房主自动托管起来。

所以很多问题不能按普通服务器思路理解,比如:

  1. VNC 看得到画面,不代表输入一定能进游戏。
  2. VNC 窗口变大,不代表远程游戏窗口变大。
  3. 邀请码失败,不代表服务端一定没启动。
  4. 容器运行中,不代表游戏内事件一定已经正常推进。
  5. Web 面板保存配置,不代表所有字段都能热更新。

目前这个项目已经能完成基本的一键搭建、noVNC 管理、IP 直连、本地管理面板、日志查看和常用配置保存。后面如果继续做,比较值得推进的方向是多实例管理、多存档切换、更多健康检查,以及把测试流程做得更自动化一点。

仓库地址:

https://github.com/wuxianggujun/StardewValleyServerKit

如果你也想搭一个长期在线的星露谷农场,可以先从 README 的快速开始跑一遍。建议第一次不要急着加 Mod,先把原版无头服跑过夜、重启、重连都测稳定,再慢慢扩展。


Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐