使用Docker搭建星露谷最新服务端(Steam下载版)
前言
前两天写了一篇《使用Docker搭建星露谷服务端》的文章,该文章稍微有些缺陷,就是不能随着星露谷的版本更新而更新。
为了解决这个问题,又开始研究起了cavazos-apps/stardew-multiplayer-docker这个仓库,跑起来后发现还是非常的简单,相较于之前的方法,就只多了Steam登录。
由于国内网络的问题,对仓库做了下优化,都记录到InsectMk/stardew-multiplayer-docker仓库了,接下来的步骤,都基于这个仓库。
开始
关于此项目的Docker容器编排全部都记录到InsectMk/stardew-multiplayer-docker仓库了,该项目源码来自于cavazos-apps/stardew-multiplayer-docker仓库,在此仓库上做修改,让在国内使用此方法部署星露谷服务器更加方便。
在开始之前默认服务器存在docker、docker-compose环境。
拉取仓库
1 | # 使用Github源仓库 |
SMAPI插件平台
由于原仓库构建镜像时,SMAPI在构建镜像的时候从Github下载的,拖慢了构建镜像的速度,现在改成了可预先下载,使用本地SMAPI构建。
到SMAPI-Releases页面下载你需要的插件平台版本,如:SMAPI-4.1.10-installer.zip,并放入到docker/smapi文件夹(需要新建)中。
(PS:之前在某个文章的评论区看到,Always On Server模组,在每日结算的时候没有自动确认,导致其他玩家一直在等待,需要手动点击服主机器人的OK,解决方案是将SMAPI降级到4.1.7以前的版本,这里使用的本项目原作者的版本->4.1.10,经测试一样有效。)
放入后,修改docker/Dockerfile-steam文件:
1 | # 修改这行,将SMAPI-4.1.10-installer.zip改为你对应的SMAPI Installer包 |
VNC密码
编辑docker-compose-steam.yml,修改NOVNC Web密码:
1 | services: |
Steam登录配置
你必须要在Steam上购买星露谷,构建镜像时,会使用steamcmd从Steam下载最新的星露谷。
需要配置Steam账户环境变量(镜像构建完成后就不需要了),修改.env文件,编辑以下内容
1 | ## 仅在首次构建或更新时设置这些变量 |
注意:如果你使用了Steam令牌验证码的话,构建编排的时候要及时修改.env的STEAM_GUARD为最新令牌,同时,手机上注意及时批准登录!!!
创建Docker编排
回到项目根目录,使用以下指令创建编排
1 | sudo docker compose -f docker-compose-steam.yml up |
- 编排会先创建镜像(下载各种环境以及游戏本体),请耐心等待,我的服务器构建花费了40分钟左右。
- 如果到Steam下载游戏时,令牌验证码已经失效,更新
.env中的STEAM_GUARD为最新验证码后,重新使用上面的指令创建编排。
开服
创建编排后,会在项目根目录生成一个valley_saves文件夹,这个文件夹就是你的存档目录,你可以将你的存档上传到这个目录下。
Windows存档地址C:\Users\你的用户名\AppData\Roaming\StardewValley\Saves,可以看到有很多文件夹,文件夹名称对应的就是你的农场名称。
开放端口
容器使用了5801和24642端口这两个端口,需要在云服务器控制台的安全组开放,防火墙也放行一下。
5801:NoVNC 的 Web端,不用下载VNC客户端,直接访问服务IP:5801就能访问星露谷桌面了24642:服务端端口,星露谷默认端口,在星露谷客户端点局域网连接的时候不用带上这个端口,直接给IP或者域名就行了
进入VNC Web
默认VNC Web端开放在5801端口,访问你的服务器IP:5801就能看到游戏页面了,跟你在电脑上玩的星露谷的UI一样。

这里演示从存档开服,直接建一个新档也是一样的:

现在已经开服成功了,现在就可以尝试连接服务器了,打开星露谷客户端,点击合作->加入局域网游戏->输入你的服务器IP->OK,就能进入了!



服务器默认功能
目前知道的有
- 主持机器人,默认晚上10点睡觉,想要跳过今天,需要在10点睡觉
- 当服务器只剩主持机器人后,主持机器人会暂停,防止时间流逝
到现在服务器已经正常启动了,现在就可以尝试连接服务器了,打开星露谷客户端,点击合作,加入局域网,输入你的ip,就能进入
为服务器添加Mod
有些Mod只需要装在本地即可使用,有些Mod需要本地、服务器都装上才生效,比如拖拉机模组。
源仓库作者对Mod的参数管理进行了封装,之前我们自定义模组参数都是在游戏设置里面,或者更高级一点,是在config.json文件中直接修改的Mod参数。
源仓库作者的逻辑是在docker-compose.yml文件中,使用环境变量定义每个Mod的参数,例如:开启or不开启,还有一些自定义的参数。
然后将模组的config.json改为config.json.template,想将其中的参数替换为docker-compose.yml中的参数,则需要将环境变量使用${}包裹对对应参数进行替换。
做完上述操作后,docker在编译镜像时,会根据docker-entrypoint-steam.sh脚本文件的逻辑,将config.json.template解析成替换环境环境变量后的config.json文件,以达到Docker Compose控制模组的目的。
(PS:如果你不希望使用模板,你可以直接使用config.json文件,当识别到此文件后,不会再生成config.json文件)
关于模组的开启/配置逻辑,可以查看项目根目录的docker-entrypoint-steam.sh脚本以进行研究。
示例
例如,我这里想要加一个拖拉机模组,这个模组是需要服务器和客户端都装的。
需要下载好这个模组,解压并上传到项目的
docker/mods中,这个文件夹的Mod最好直接放到docker/mods根目录,不要放到子文件夹,这样更利于使用Docker Compose控制Mod的参数(PS:我的文件夹命名为英文,避免不必要的麻烦)。查看模组文件夹里的
config.json文件,记录你需要调整的参数,为他们各取一个不重复的英文环境变量(一般使用<Mod文件夹名>_<原JSON层级>命名),取名后使用${你的英文环境变量名}替换这些参数,并将config.json重命名为config.json.template。编辑
docker-compose-steam.yml文件,追加环境变量(根据实际情况调整):开启Mod的环境变量命名以
ENABLE_<你的Mod文件夹名称>_MOD命名,变量值使用${ENABLE_<你的Mod文件夹名称>_MOD-true}如果要禁用该模组(其实就是Docker打包的时候不打包这个文件夹),变量值使用
${ENABLE_<你的Mod文件夹名称>_MOD-false}环境变量值的格式都是
${<你的环境变量名称>-<你需要设置的值>}1
2
3
4
5
6
7
8services:
valley:
environment:
# 开启拖拉机模组Tractor,
- ENABLE_TRACTOR_MOD=${ENABLE_TRACTOR_MOD-true}
# 拖拉机发动声音(由于Docker环境没有声音输出设备,这里需要设置为None,否则会报错)
- TRACTOR_SOUNDEFFECTS=${TRACTOR_SOUNDEFFECTS-None}
检查
docker/mods/<模组文件夹>/config.json.template,是否使用的是正确的配置重建docker-compose,进入项目根目录,执行以下步骤重新构建镜像并启动容器:
1
2
3
4
5
6
7
8# 停掉容器
sudo docker compose -f docker-compose-steam.yml stop
# 删除容器,默认是stardew,根据实际情况修改参数
sudo docker rm stardew
# 删除镜像,根据实际情况修改参数
sudo docker rmi stardew-valley:latest
# 重启编排
sudo docker compose -f docker-compose-steam.yml up进入
<服务器IP>:5801,访问NoVNC Web端
安卓端联机方法
星露谷是多端互通的,可以到这里下载安卓学习版。
默认移动端是没有开放联机入口的,处于测试阶段,可以参考星露谷物语 (Stardew Valley) 联机指南 | SakuraFrp 帮助文档进行开启。
下面复制一下该网站的文章内容,以防止内容丢失:
目前移动版星露谷物语的联机功能仍可能不稳定,因此作为测试版功能存在,
您需要使用下面的秘籍来开启多人游戏功能。
首先,您应当点击右下角的语言列表,并将游戏切换到英文(English)语言。
目前这个秘籍只能在英文版界面使用,在您开启之后即可切换回中文。
现在我们有英文版的游戏主界面,在这个界面中可以看到招牌上有四个叶子,
在下面图中圈出并以 ↑ ↓ ← → 来表示这四个叶子,
依次点击 ↑ ↑ ↓ ↓ ← → ← →,然后点击右下角的问号按钮,即可解锁多人模式。




