一步步搭建星露谷物语服务器

实现和远方朋友的流畅联机

Author Avatar

ghung

  ·  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,网络刚好是在国内,延迟更低。

链接如下:学生用券中心-阿里云云工开物

Image_2025-12-01_11-27-28_5bt3h2oo.rlo.png

经过开机,简单的安全配置之后,正式进入部署。

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可用,但是在国内环境下有些困难。

  1. docker 镜像:dockerhub已经被阻断,使用docker镜像源:毫秒镜像源,只需要简单增加前缀docker.1ms.run/即可
  2. 通过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的传输速率也很高,所以我先下载再上传完成迁移。

首次启动 #

需要一次性创建或加载存档:

  1. 连接到 VNC: 使用RealVNC®软件连接。
    • 地址:服务器IP:5900
    • 密码:您在 .env 文件中设置的 VNC_PASSWORD
  2. 在 VNC 窗口中:
    • 创建新农场,记得新增联机小屋
    • 或加载现有存档
  3. 加载完成后:
    • ServerAutoLoad 模组会记住您的存档
    • 以后重启会自动加载此存档
    • Always On Server 会自动启用 Auto Mode
    • 可以断开 VNC 连接了
  4. 玩家现在可以连接了!
    • 打开星露谷物语
    • 点击"合作" → “加入局域网游戏”
    • 服务器会自动出现在列表中
    • 或手动输入服务器IP:192.168.1.100(示例)
    • 重要说明
      • 只需输入IP地址,不需要加端口号(不是192.168.1.100:24642
      • 自动使用24642/UDP端口
      • 如需内网穿透或端口转发,必须转发UDP协议(不是TCP)

bug 发现 #

  1. 季节活动:花瓣舞会,客机会卡在等待界面,主机反而会进入自由活动的情况。
  2. 地震后房主黑屏:临时跳过这一天的方法:
我今天试出来一个办法,把docker镜像内的/home/steam/preinstalled-mods和/home/steam/stardewvalley/Mods两个文件夹清空(可以重命名后新建一个同名文件夹,方便后续恢复),然后重启容器,这时候运行的就是没有mod的原版,vnc连接后就可以把这个剧情过了,保存退出,然后再把mod文件夹恢复回去,再重启容器就行了