我用 Docker + JunimoServer 搭了一个星露谷物语无头服,还顺手做了个本地管理面板

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

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

text 复制代码
StardewValleyServerKit

项目地址:

text 复制代码
https://github.com/wuxianggujun/StardewValleyServerKit

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

大概流程是:

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

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

为什么要折腾这个

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

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

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

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

快速启动

Windows 下可以直接执行:

powershell 复制代码
cd <repo-root>
.\setup.ps1 setup

Linux / macOS 下是:

bash 复制代码
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、管理面板和游戏直连地址。

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

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

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

powershell 复制代码
.\setup.ps1 join-info

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

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

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

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

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

powershell 复制代码
.\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 输入参数。项目里已经把默认参数补上了:

text 复制代码
-AcceptPointerEvents=1
-AcceptKeyEvents=1
-AcceptSetDesktopSize=1
-AlwaysShared=1
-DisconnectClients=0

也可以直接执行:

powershell 复制代码
.\setup.ps1 vnc-fix
.\setup.ps1 vnc-check

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

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

powershell 复制代码
.\setup.ps1 host-auto

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

powershell 复制代码
.\setup.ps1 host-visibility

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

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

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

实际不是这么回事。

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

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

powershell 复制代码
.\setup.ps1 vnc-resize

这个命令会按 .env 里的:

env 复制代码
DISPLAY_WIDTH=1280
DISPLAY_HEIGHT=800

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

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

text 复制代码
resize=remote

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

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

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

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

json 复制代码
"AllowIpConnections": true

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

text 复制代码
127.0.0.1

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

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

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

env 复制代码
GAME_PORT=24642

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

本地 Web 管理面板

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

启动方式:

powershell 复制代码
.\setup.ps1 admin

默认地址:

text 复制代码
http://127.0.0.1:8088

面板里可以看:

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

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

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

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

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

当前默认装了哪些 Mod

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

text 复制代码
ConsoleCommands
SaveBackup

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

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

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

挂机测试应该怎么测

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

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

我觉得至少要测这些:

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

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

text 复制代码
Kicking xxx because they aren't ready

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

常用命令

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

powershell 复制代码
.\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

更新前建议先备份:

powershell 复制代码
.\setup.ps1 backup

再更新:

powershell 复制代码
.\setup.ps1 update

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

最后总结

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

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

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

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

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

仓库地址:

text 复制代码
https://github.com/wuxianggujun/StardewValleyServerKit

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

复制代码
相关推荐
冬奇Lab19 分钟前
开源项目第166期:worldmonitor — 实时全球情报仪表盘,73k Star 的 AI 驱动地缘政治监控平台
人工智能·开源·资讯
零涂毕业设计20 分钟前
毕业设计模块开发-OLED显示屏(IIC协议0.96寸)STM32 ESP32 FPGA Linux驱动免费分享
linux·stm32·单片机·嵌入式·esp32·fpga·oled
tedcloud12331 分钟前
OmniRoute怎么部署?开源AI模型路由平台Linux部署教程
linux·服务器·人工智能·开源·音视频
SakitamaX1 小时前
LVS(Linux Virtual Server)概念详解
linux·运维·lvs
小张同学a.1 小时前
Linux系统管理
linux·运维
阿龙的工作记录1 小时前
深入理解Linux设备驱动模型
linux·嵌入式硬件·工作记录
代码村新手2 小时前
Linux的基本指令
linux·运维·服务器
撩得Android一次心动4 小时前
Linux编程笔记3【个人用】
linux·笔记
noipp4 小时前
推荐题目:洛谷 P6231 [JSOI2013] 公交系统
c语言·数据结构·c++·算法·游戏·洛谷·luogu
OpenPomeloxCommunity4 小时前
3. Linux 同步机制之 spinlock 设计与实现(一):通用层
linux