一步步搭建星露谷物语服务器
实现和远方朋友的流畅联机
· 2 min read
最近小橙的空闲时间比较多,而我也想多和她玩耍,前两天一直在看owcs的总决赛,导致小橙有些心生不满。思前想后,还是找个游戏来玩吧,早就知道星露谷的大名,种田经营的题材可能也会感兴趣,那就来玩星露谷吧。
说干就干,在ios上花了5$买了一个游戏本体,当我打开的那一刻,发现联机之路苦难重重。
虽然说pc和主机早早就已经支持了局域网联机,并且可以依赖steam网络进行互联,但是移动端刚在1.6版本引入了局域网联机功能。并且由于当前代码还不是很完善,作者还将联机界面隐藏,只能通过触发「彩蛋」来解锁。
- 解锁方式如下:
在游戏主标题画面。 看到“Stardew Valley”的Logo上有几片叶子。 按以下顺序点击叶子(模拟手柄方向键): 上(↑):点击Logo右上角的叶子 上(↑):再次点击右上角 下(↓):点击左下角的叶子 下(↓):再次点击左下角 左(←):点击左上角的叶子 右(→):点击右下角的叶子 左(←):再次点击左上角 右(→):再次点击右下角 最后点击屏幕右下角的 “?” 问号按钮。 退出问号菜单后,主界面就会出现 “合作”(Co-op) 按钮!
解锁方式还是很有趣的,著名的「Konami Code」,记起了和我哥一起玩魂斗罗,通过这个菜单加了30条命但还是关卡没过去的故事。
到了联机的界面我又犯了愁:移动端只支持通过输入IP进行连接,也就是局域网联机,如何让远在五百公里外的小橙和我进行联机?
当然根据我的折腾史,不用想也可以通过打洞或者中转服务器建立一个虚拟局域网,但是这样做有一个弊端是很麻烦,每次都需要打开游戏外的一个软件才可以运行,并且十分不稳定!
还有另外一个方案是frp,暴露我本地pc的一个端口到公网这样也可以,但只是方便了小橙,我额外还需要保持pc开启,这显然也麻烦。
搭建服务器端 #
想想MC玩家是怎么做的:建立一个服务器端不就好了。
经过我了解,星露谷并没有像MC的服务端程序,本质上还是一个P2P游戏,存档必须绑定在房主这个角色身上。
最终,发现了社区大佬们给出的解决方案:通过 Docker 容器 来跑一个无头(Headless)客户端,并配合模组(Mod) 来接管逻辑。
实现原理 #
- 容器化: 使用 Docker 拉取一个集成了 Linux 版星露谷物语环境的镜像。
- 虚拟显示: 因为游戏必须要有图形输出才能运行,Docker 内部使用
Xvfb模拟一个虚拟显示器。 - 核心Mod - “Always On Server”: 这是一个至关重要的 Mod。
- 它让这个“机器人房主”自动接受连接。
- 最重要功能: 当没有真实玩家在线时,它会自动暂停时间。星露谷这个游戏的时间流逝很重要。
部署流程 #
项目地址:GitHub - truman-world/puppy-stardew-server: Stardew Server | 星露谷物语服务器一键搭建开服联机
服务器准备 #
这部分我不小心绕了一下圈子。
看到项目主页介绍需要一个2c2g的服务器,我心里暗喜:刚好我的2c8g的服务器可以用上了,当我根据部署流程部署完毕后,发现cpu一直是吃满(95%上下波动)的状态,因为这台vps上还有其他服务,担心有影响,故萌生萌生一台新vps的念头。
经过再三寻找,发现我的阿里云学生券刚好还没有使用,阿里云刚好有一个ECS配置是2c2g,网络刚好是在国内,延迟更低。
链接如下:学生用券中心-阿里云云工开物
经过开机,简单的安全配置之后,正式进入部署。
docker部署 #
- 一个 Steam 账户,并且已购买星露谷物语,steam账户的作用只是为了获取游戏本体文件,其实能搞到游戏本体文件也行。
- 最低 2GB 内存,推荐 4GB,内存要求不高。
- 2GB 可用磁盘空间
步骤 1:创建工作目录和配置文件 #
# 创建工作目录
mkdir -p ~/puppy-stardew && cd ~/puppy-stardew
# 直接创建 docker-compose.yml(使用 Docker Hub 镜像)
cat > docker-compose.yml << 'EOF'
version: '3.8'
services:
stardew-server:
image: truemanlive/puppy-stardew-server:latest
container_name: puppy-stardew
restart: unless-stopped
stdin_open: true
tty: true
environment:
- STEAM_USERNAME=${STEAM_USERNAME}
- STEAM_PASSWORD=${STEAM_PASSWORD}
- ENABLE_VNC=${ENABLE_VNC:-true}
- VNC_PASSWORD=${VNC_PASSWORD:-stardew123}
ports:
- "24642:24642/udp"
- "5900:5900/tcp"
volumes:
- ./data/saves:/home/steam/.config/StardewValley:rw
- ./data/game:/home/steam/stardewvalley:rw
- ./data/steam:/home/steam/Steam:rw
deploy:
resources:
limits:
cpus: '2.0'
memory: 2G
reservations:
memory: 1G
EOF
# 创建 .env 配置文件
cat > .env << 'EOF'
# Steam 账户信息(必填 - 请修改为您的真实账号)
STEAM_USERNAME=your_steam_username
STEAM_PASSWORD=your_steam_password
# VNC 配置(可选)
ENABLE_VNC=true
VNC_PASSWORD=stardew123
EOF
步骤 2:编辑配置文件,填入您的 Steam 凭证 #
# 使用文本编辑器修改 .env 文件
vim .env
重要:您必须在 Steam 上拥有星露谷物语。游戏文件通过您的账户下载。
步骤 3:初始化数据目录 #
# 创建数据目录并设置正确权限
mkdir -p data/{saves,game,steam}
chown -R 1000:1000 data/
步骤 4:启动服务器 #
# 启动服务器
docker compose up -d
# 查看日志
docker logs -f puppy-stardew
如果启用了 Steam 令牌,您需要输入验证码,推荐临时关闭 Steam 令牌,使用Email验证码,因为是异地登录,可能会触发风控:
docker attach puppy-stardew
# 粘贴您的 Steam 令牌代码并按回车
# 重要:不会显示任何内容 - 这是正常的!
# 等待几秒钟,游戏会自动开始下载
# 按 Ctrl+P Ctrl+Q 分离(不是 Ctrl+C!)
以上是官方给出的手动部署的流程,亲测在海外vps可用,但是在国内环境下有些困难。
- docker 镜像:dockerhub已经被阻断,使用docker镜像源:毫秒镜像源,只需要简单增加前缀
docker.1ms.run/即可 - 通过
SteamCMD下载更新文件:发现网络连接不畅,下载速率感人,最终选择迁移我JP服务器上的文件到BJ服务器上。
- 压缩文件
# c: create an archive (创建)
# z: compress with gzip (压缩)
# v: verbosely list files processed (显示过程)
# f: use archive file (指定文件名)
tar -czvf stardew_data.tar.gz data
- 传输文件
刚开始的思路是直接通过scp传输,因为为了安全已经更改了ssh端口以及无法通过passwd登录,通过创建密钥和指定端口解决。
scp stardew_data.tar.gz user@beijing_server_ip:/home/user/
更改后的命令:
scp -P 2025 -i ~/.ssh/id_rsa stardew_data.tar.gz user@beijing_server_ip:/home/user/
发现速度有所提高,但还是很慢。最终采用的方法是人工介入,我和JP之间的传输速率很高,我和Beijing的传输速率也很高,所以我先下载再上传完成迁移。
首次启动 #
需要一次性创建或加载存档:
- 连接到 VNC: 使用RealVNC®软件连接。
- 地址:
服务器IP:5900 - 密码:您在
.env文件中设置的VNC_PASSWORD
- 地址:
- 在 VNC 窗口中:
- 创建新农场,记得新增联机小屋
- 或加载现有存档
- 加载完成后:
- ServerAutoLoad 模组会记住您的存档
- 以后重启会自动加载此存档
- Always On Server 会自动启用 Auto Mode
- 可以断开 VNC 连接了
- 玩家现在可以连接了!
- 打开星露谷物语
- 点击"合作" → “加入局域网游戏”
- 服务器会自动出现在列表中
- 或手动输入服务器IP:
192.168.1.100(示例) - 重要说明:
- 只需输入IP地址,不需要加端口号(不是
192.168.1.100:24642) - 自动使用24642/UDP端口
- 如需内网穿透或端口转发,必须转发UDP协议(不是TCP)
- 只需输入IP地址,不需要加端口号(不是
bug 发现 #
- 季节活动:花瓣舞会,客机会卡在等待界面,主机反而会进入自由活动的情况。
- 地震后房主黑屏:临时跳过这一天的方法:
我今天试出来一个办法,把docker镜像内的/home/steam/preinstalled-mods和/home/steam/stardewvalley/Mods两个文件夹清空(可以重命名后新建一个同名文件夹,方便后续恢复),然后重启容器,这时候运行的就是没有mod的原版,vnc连接后就可以把这个剧情过了,保存退出,然后再把mod文件夹恢复回去,再重启容器就行了