前言

前两天写了一篇《使用Docker搭建星露谷服务端》的文章,该文章稍微有些缺陷,就是不能随着星露谷的版本更新而更新。

为了解决这个问题,又开始研究起了cavazos-apps/stardew-multiplayer-docker这个仓库,跑起来后发现还是非常的简单,相较于之前的方法,就只多了Steam登录。

由于国内网络的问题,对仓库做了下优化,都记录到InsectMk/stardew-multiplayer-docker仓库了,接下来的步骤,都基于这个仓库。

开始

关于此项目的Docker容器编排全部都记录到InsectMk/stardew-multiplayer-docker仓库了,该项目源码来自于cavazos-apps/stardew-multiplayer-docker仓库,在此仓库上做修改,让在国内使用此方法部署星露谷服务器更加方便。

在开始之前默认服务器存在dockerdocker-compose环境。

拉取仓库

1
2
3
4
# 使用Github源仓库
git clone https://github.com/insectmk/stardew-multiplayer-docker.git
# 使用Gitee镜像仓库(网络不好使用)
git clone https://gitee.com/insectmk/stardew-multiplayer-docker.git

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
2
# 修改这行,将SMAPI-4.1.10-installer.zip改为你对应的SMAPI Installer包
COPY smapi/SMAPI-4.1.10-installer.zip /data/nexus.zip

VNC密码

编辑docker-compose-steam.yml,修改NOVNC Web密码:

1
2
3
4
5
services:
valley:
environment:
# VNC
- VNC_PASSWORD=<你的密码>

Steam登录配置

你必须要在Steam上购买星露谷,构建镜像时,会使用steamcmd从Steam下载最新的星露谷。

需要配置Steam账户环境变量(镜像构建完成后就不需要了),修改.env文件,编辑以下内容

1
2
3
4
## 仅在首次构建或更新时设置这些变量
STEAM_USER=<你的Steam用户名>
STEAM_PASS=<你的Steam密码>
STEAM_GUARD=<最新的Steam令牌验证码> # 如果你的账户没有启用Steam令牌保护,则无需设置

注意:如果你使用了Steam令牌验证码的话,构建编排的时候要及时修改.envSTEAM_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,可以看到有很多文件夹,文件夹名称对应的就是你的农场名称。

开放端口

容器使用了580124642端口这两个端口,需要在云服务器控制台的安全组开放,防火墙也放行一下。

  • 5801:NoVNC 的 Web端,不用下载VNC客户端,直接访问服务IP:5801就能访问星露谷桌面了
  • 24642:服务端端口,星露谷默认端口,在星露谷客户端点局域网连接的时候不用带上这个端口,直接给IP或者域名就行了

进入VNC Web

默认VNC Web端开放在5801端口,访问你的服务器IP:5801就能看到游戏页面了,跟你在电脑上玩的星露谷的UI一样。

image-20251021172341469

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

image-20251021172828064

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

image-20251021173412392

image-20251021173423518

image-20251021173431008

服务器默认功能

目前知道的有

  • 主持机器人,默认晚上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脚本以进行研究。

示例

例如,我这里想要加一个拖拉机模组,这个模组是需要服务器和客户端都装的。

  1. 需要下载好这个模组,解压并上传到项目的docker/mods中,这个文件夹的Mod最好直接放到docker/mods根目录,不要放到子文件夹,这样更利于使用Docker Compose控制Mod的参数(PS:我的文件夹命名为英文,避免不必要的麻烦)。

  2. 查看模组文件夹里的config.json文件,记录你需要调整的参数,为他们各取一个不重复的英文环境变量(一般使用<Mod文件夹名>_<原JSON层级>命名),取名后使用${你的英文环境变量名}替换这些参数,并将config.json重命名为config.json.template

  3. 编辑docker-compose-steam.yml文件,追加环境变量(根据实际情况调整):

    开启Mod的环境变量命名以ENABLE_<你的Mod文件夹名称>_MOD命名,变量值使用${ENABLE_<你的Mod文件夹名称>_MOD-true}

    如果要禁用该模组(其实就是Docker打包的时候不打包这个文件夹),变量值使用${ENABLE_<你的Mod文件夹名称>_MOD-false}

    环境变量值的格式都是${<你的环境变量名称>-<你需要设置的值>}

    1
    2
    3
    4
    5
    6
    7
    8
    services:
    valley:
    environment:
    # 开启拖拉机模组Tractor,
    - ENABLE_TRACTOR_MOD=${ENABLE_TRACTOR_MOD-true}
    # 拖拉机发动声音(由于Docker环境没有声音输出设备,这里需要设置为None,否则会报错)
    - TRACTOR_SOUNDEFFECTS=${TRACTOR_SOUNDEFFECTS-None}

  4. 检查docker/mods/<模组文件夹>/config.json.template,是否使用的是正确的配置

  5. 重建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
  6. 进入<服务器IP>:5801,访问NoVNC Web端

安卓端联机方法

星露谷是多端互通的,可以到这里下载安卓学习版。

默认移动端是没有开放联机入口的,处于测试阶段,可以参考星露谷物语 (Stardew Valley) 联机指南 | SakuraFrp 帮助文档进行开启。

下面复制一下该网站的文章内容,以防止内容丢失

目前移动版星露谷物语的联机功能仍可能不稳定,因此作为测试版功能存在,
您需要使用下面的秘籍来开启多人游戏功能。

首先,您应当点击右下角的语言列表,并将游戏切换到英文(English)语言。
目前这个秘籍只能在英文版界面使用,在您开启之后即可切换回中文。

现在我们有英文版的游戏主界面,在这个界面中可以看到招牌上有四个叶子,
在下面图中圈出并以 ↑ ↓ ← → 来表示这四个叶子,
依次点击 ↑ ↑ ↓ ↓ ← → ← →,然后点击右下角的问号按钮,即可解锁多人模式。

mobile-multiplayer-CsyGKyRF

参考文档

stardew-multiplayer-docker

利用雨云和Docker创建星露谷物语服务器

星露谷物语 (Stardew Valley) 联机指南 | SakuraFrp 帮助文档

星露谷Linux下载