饥荒私服搭建

饥荒私服搭建

SYuan03 Lv4

参考

  1. https://leanote.zzzmh.cn/blog/post/admin/63e46785da7405001301c7f5 (docker版)
  2. https://blog.csdn.net/HoewDec/article/details/139900715 (普通版)
  3. https://code-killerr.github.io/2021/10/17/buildDonNotStarveServe/
  4. https://www.yeatsj.com/2022/11/04/20221104DST-01/ (一部分内容/图片源自该博客,主要参考)
  5. https://www.bilibili.com/read/cv14798689/

Part One(失败篇,docker版

拉去镜像,由于要搭在国内服务器上,能配置下

要么代理(我有点懒,不想搞),所以找了个能用的镜像源

1
2
3
4
5
6
{
"registry-mirrors": [
"https://mirror.ccs.tencentyun.com",
"https://registry.dockermirror.com"
]
}

改完后重新启动下

1
2
sudo systemctl daemon-reload
sudo systemctl restart docker

然后再拉取镜像

1
2
docker pull jamesits/dst-server:nightly
docker pull jamesits/dst-server:latest

以下是对不同版本的一个解释

这个描述解释了不同 Docker 镜像版本之间的区别,主要是 latestvanillanightlysteamcmd-rebase。让我逐步解释一下每个版本的意义,特别是你提到的 nightly

  1. latestvanilla:
    • 这两个版本更新频率较低,通常是较为稳定的版本,推荐用于日常使用。
    • 它们不会经常更新,意味着这个版本的代码和功能不会每天都变化,更加可靠。
    • 这些镜像适合不需要紧跟最新开发版本的用户。
  2. nightly:
    • 这是一个 “夜间构建” 的版本,意味着它每天自动构建一次,并尝试包含最新的服务器代码。
    • 因为是自动化构建的版本,所以可能会包含最新的功能或者修复,但也有可能因为代码不稳定而出现问题。
    • 如果你希望每天都使用最新的开发版本,并且能够接受潜在的不稳定性,那么你可以选择这个版本。
    • 这个版本的重点在于 “最新”,所以对于开发者或者测试者来说非常合适,但可能不适合生产环境使用。
  3. steamcmd-rebase:
    • 这个版本和 latest 类似,但它是基于另一个镜像 (cm2network/steamcmd:root) 来构建的。
    • 它会提供相同的功能,但底层基础镜像有所不同,可能会影响容器的大小或依赖的配置。
    • 如果你需要基于 steamcmd 镜像的环境,可以选择这个版本。
  4. -slim 版本:
    • 所有版本(除了 nightly)都有一个 -slim 标签的版本。
    • 这些版本没有预先安装 DST 服务器文件,每次启动容器时都需要重新下载所需的文件。
    • -slim 版本体积更小,但不能在离线环境下运行,因为启动时需要从网络下载文件。
  5. 构建方式
    • latest 是通过 Docker Hub 的自动构建(autobuild)生成的。
    • 其他版本(如 nightlysteamcmd-rebase 等)是通过 Azure DevOps CI(持续集成工具)构建的,意味着它们的构建过程可能更加灵活且集成了持续开发的代码更新。

总结:

  • latest/vanilla:稳定且较少更新的版本,推荐日常使用。
  • nightly:每天自动更新的最新代码版本,可能更不稳定,但包含最新的功能和修复,适合开发或测试。
  • steamcmd-rebase:类似 latest,但基于不同的底层镜像。
  • -slim 版本:没有预安装服务器文件,每次启动都需要下载文件,无法离线运行。

如果你在测试最新功能,nightly 版本适合你;如果你需要稳定性,latest 是更好的选择。

数据目录

1
/home/yuan/dock/dst

启动

1
2
3
4
5
6
7
8
docker run -d\
-p 10999-11000:10999-11000/udp\
-p 12346-12347:12346-12347/udp\
-v /home/yuan/dock/dst:/data\
-m 1024M --oom-kill-disable --memory-swap=-1\
-e "TZ=Asia/Shanghai"\
--name dstserver\
jamesits/dst-server

有点麻烦,不想搞docker的网络,感觉出问题了,于是换个教程


Part Two(再次失败篇

1. 安装依赖

1
2
3
4
sudo add-apt-repository multiverse
sudo dpkg --add-architecture i386
sudo apt update
sudo apt install libstdc++6 libgcc1 libcurl4-gnutls-dev:i386 lib32z1

2. 安装SteamCMD

1
2
3
4
mkdir ~/steamcmd
cd ~/steamcmd
wget https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz
tar -zxvf steamcmd_linux.tar.gz

3. 安装饥荒联机版

1
2
3
4
steam> force_install_dir ../xxx # 注意这步是设定下载或者以后验证的位置的
steam> login anonymous
steam> app_update 343050 validate
steam> quit

image-20241003230415792

似乎还是遭遇了网络问题qwq,无奈只好挂上了代理

参考

https://v2raya.org/en/docs/prologue/introduction/

放两张设置截图记录下

image-20241003235335067

image-20241003235344047

Continue…

image-20241004000145912

类目

image-20241004000427138

增加虚拟内存swap(也不知道对不对,看着gpt的弄弄的

image-20241004154056771

4. 本地创建世界

image-20241004161325349

mod什么的也选上

5. 创建私服获取token

image-20241004161410024

image-20241004161424787

不过为了不影响本地的配置,感觉不如传到服务器上再新建,而且Linux下新建文件什么的方便点

6. 上传整个cluster

image-20241004161712591

allworlds/iGotSmoke是我自己新建的,其他的都是之前steamcmd下载的

新建之前说的adminlist.txt和cluster_token.txt,并且把内容放进去

image-20241004162224734

7. 服务器添加mods

找到电脑上Master或者Caves目录下的 modoverrides.lua 文件(这俩似乎是一样的,也许有专门mod?不确定),找到形如 workshop-xxxxxxxx 的内容,后面的xxxxx就是mod的代码,创意工坊内mod界面网址后的数字就是这个。

将这些纯数字代码复制出来写成 ServerModSetup(“xxxxxxx”) 格式,写入服务器上的 /home/yuan/dst/mods/dedicated_server_mods_setup.lua 文件中。可以直接用vim命令写入,也可以借助第三方工具。

image-20241004163138997

这是为了让服务器在setup的时候去(检查)下载这些Mods

重要的事情(补充)
这个 dedicated_server_mods_setup.lua 文件只是代表服务器会下载,具体开启MOD以及设置MOD,需要进入/home/steam/module/DST/allworlds/world/Master,里面修改 modoverrides.lua 文件,由于刚刚电脑中已经配置过了,所以这个文件是准确OK的,但是如果后期添加MOD, dedicated_server_mods_setup.lua 和 modoverrides.lua 都需要修改保存。

8. 创建启动脚本

image-20241004163415735

据说bin64下的也行,占用的内存可能多一点,就没用

1
./dontstarve_dedicated_server_nullrenderer -console -persistent_storage_root /home/yuan/dst -conf_dir allworlds -cluster iGotSmoke -shard Caves
1
./dontstarve_dedicated_server_nullrenderer -console -persistent_storage_root /home/yuan/dst -conf_dir allworlds -cluster iGotSmoke -shard Master

这里就相当于是填写了cluster(iGotSmoke)内容所在的路径

启动,新建一个master的screen启动脚本,经典报错;

image-20241004164515403

find了一下

image-20241004164917204

ldd看了下确实找不到

使用 ldd 命令检查程序依赖的共享库是否都能找到:

1
ldd ./dontstarve_dedicated_server_nullrenderer

这将列出程序所依赖的所有库,并标明哪些库未找到。

image-20241004165047541

ln -s到了/usr/lib然后发现似乎有32位和64位的问题

image-20241004165534002

于是尝试装了一下32位的库

1
2
3
sudo dpkg --add-architecture i386
sudo apt update
sudo apt install libstdc++6:i386

再启动,似乎是成功了

image-20241004170019088

再启动下cave

由于某些操作失误,未能成功,打算重整目录结构再来一遍

Part Three

1. 目录结构准备

image-20241005004338231

client准备存放steamcmd下载的东西

storage则是持久化目录

myscripts则是放各种脚本

2. 运行steamcmd进行下载

1
2
3
4
Steam> force_install_dir /home/yuan/dst/client
Steam> login anonymous
Steam> app_update 343050 validate
Steam> quit

3. 脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#!/bin/bash
steamcmd_dir="/home/yuan/steamcmd"
install_dir="/home/yuan/dst/client"
doc_dir="/home/yuan/dst/storage" # Note that No need to add path DoNotStarveTogether
cluster_name="iGotSmoke"

# Get the current timestamp to use for log directory naming
timestamp=$(date +"%Y%m%d_%H%M%S")

# Create a log directory using the current timestamp
log_dir="/home/yuan/dst/logs/$timestamp"
mkdir -p "$log_dir" # Create the log directory if it doesn't exist

cd "$install_dir/bin" # Change the current directory to the DST installation's bin directory

# Define the base command that will run the DST server
run_shared=(./dontstarve_dedicated_server_nullrenderer) # Executable for DST server
run_shared+=(-console) # Run in console mode
run_shared+=(-cluster "$cluster_name") # Specify the cluster name
run_shared+=(-monitor_parent_process $$) # Monitor the parent process to prevent orphan processes
run_shared+=(-persistent_storage_root "$doc_dir") # Set the location for persistent storage (game data)

# Run the Master shard and redirect its output to a log file in the newly created timestamped log directory
# "${run_shared[@]}" -shard Master | sed 's/^/Master: /' > "$log_dir/master.log" 2>&1 &
"${run_shared[@]}" -shard Master | sed 's/^/Master: /' &

# Wait for 1 minute (60 seconds) before running the Caves shard
sleep 60

# Run the Caves shard and redirect its output to a separate log file in the same timestamped log directory
# "${run_shared[@]}" -shard Caves | sed 's/^/Caves: /' > "$log_dir/caves.log" 2>&1
"${run_shared[@]}" -shard Caves | sed 's/^/Caves: /'

一开始自作主张弄了日志重定向,感觉有点问题,因为本身也有一套日志机制,发现在下面这个目录下就有

image-20241005004620031

4. 关于模块

感觉这个模块问题很大,自己传了本地的上去(本地的其实也会有多个路径存储,有的是workshop+id,有的在一个content目录下直接以id为目录

我把本地所有Mod能找到的都扔在了mods目录下,统一用workshop开头(不确定对不对)

建议不装最好…

image-20241005004908128

ugc这个目录也是自己会生成的

理论上加mod只要修改/home/yuan/dst/client/mods/dedicated_server_mods_setup.lua

image-20241005005012295

总结

感觉还是网络的问题,多试试吧

image-20241005005112042

这是最终的结构,看起来把我有两个workshop传上去的又修改了位置(应该是网络畅通就能改正,不容易)

Final

终于成功了

image-20241005004416516

结果第二天起床发现根本连接不了

一直显示

1
2
3
4
Master: [00:02:44]: [P2P] Session request for '76561199345187771'
Master: STEAMPS3 - AsyncTCPSocket created
Master: STEAMPS3 - AsyncTCPSocket created
Master: [00:02:59]: [P2P] Connection failed for '76561199345187771' because of error code 4(The connection timed out because the target user didn't respond.).

又是处理防火墙又是判断端口,最后发现不知为何公网ip和curl ifconfig.me显示的不一样

(感觉可能是1.代理 2.服务器的问题)重启了下服务没开代理就正常了,附上一些常用命令

1
2
3
4
telnet 111.229.109.44 <ip>
curl ifconfig.me
curl cip.cc
# 第二个curl更详细些
  • 标题: 饥荒私服搭建
  • 作者: SYuan03
  • 创建于 : 2024-09-30 20:53:29
  • 更新于 : 2024-10-05 14:49:44
  • 链接: https://bblog.031105.xyz/posts/杂记/饥荒私服搭建.html
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论