写在之前

网上确实有很多饥荒服务器的搭建教程,之所以会写这篇文章是因为网上很多教程都有瑕疵,按照知乎上的来最后会出现这样那样的问题,所以才会写这一篇博客,按照这篇博客来百分百成功,希望能帮到大家。

服务器选择

可以选择云服务器:阿里云、腾讯云等,推荐配置2核2G(1-2个mod),安装CentOS7.9 64位。正好最近两家服务器都在做活动,2核2G 99一年,可以4-6人流畅运行。如果多mod的话要4G内存。购买服务器网上一搜一大堆。

如果你自己有服务器或者nas并且有公网就可以省去这笔费用,使用docker安装steamcmd。

安装专用服务器

本篇博客以CentOS7.9为例进行搭建。

连接终端

根据服务器厂商提供的公网地址,复制后在SSH连接工具上输入,推荐finalshell

更新软件包

1
yum -y update
1
yum -y update

如果是Ubuntu或者debian就是apt update

安装依赖项

1
yum -y install glibc.i686 libstdc++.i686 screen libcurl.i686

创建steam用户

1
2
useradd steam
passwd steam

接下来要设置密码,按照提示来就行了,Linux输入密码是不会显示的,输完了直接回车就行。

安装steamcmd

1
2
3
su - steam
mkdir ~/Steam && cd ~/Steam
curl -sqL "https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz" | tar zxvf -

这一步会访问steam的网络,可能会比较慢,如果长时间没反应或者失败就再试几次。一直不行的话建议安装shellclash,自行配置订阅文件。这边建议安装,后续steam本体下载还是会比较慢,有clash会好一点。

安装游戏

1
./steamcmd.sh

确保目录在Steam文件夹下,启动steamcmd,等待steam安装更新,这一步没有魔法会比较慢。

等到右边出现Steam>时就说明steam更新完成了。

1
2
3
force_install_dir ../dontstarvetogether_dedicated_server
login anonymous
app_update 343050 validate

这一步在获取专用服务器文件,稍等片刻,完成后输入quit

获取存档

生成存档

如果是已有的存档上传直接看下面的内容就行了

在Windows上打开《饥荒联机版》,在选单界面点击【创建游戏】对联机需要创建的世界进行配置,服务器模式选择【公共】,配置好密码,并勾选要使用的MOD(只勾选“服务器模组”)。

配置完成后,点击“生成世界”,等待世界创建完成,在进入选择人物界面后,就可以退出了。

踩坑点一:直接创建.klei文件夹导致专用服务器无存档访问权限

_避免上述问题,需要先让服务器运行一次!!!_本人亲自踩坑!这也是很多教程没说的地方。具体启动服务器方法见下面,为了保持结构的结构完整性这里先假设你已经运行了一次服务器,并且服务器也已经在home里面创建了.klei文件夹。

踩坑点二:在root登录的状态下将存档文件上传.klei里面导致专用服务器无存档访问权限

如果使用finalshell需要用steam用户登陆,winscp也是一样更换成steam用户登录再上传文件。

上传存档

Windows游戏存档在C://User/xxx/文档/klei/DoNotStarveTogether里面,将对应的世界文件夹(一般是一串数字)上传到.klei/DoNotStarveTogether/Cluster_1里面,cluster_token.txt没有没关系,后面会创建。

获取token以及添加管理员权限

这些操作没有坑,建议上网搜,或者参照这篇文章

订阅mod(可选)

还是参照上面的文章来

启动脚本

1
2
cd ~
vim boot.sh

复制下段代码到终端中,粘贴前先按i,粘贴后按esc,再输入:wq(英文输入法的冒号)回车

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/steamcmd"
install_dir="$HOME/dontstarvetogether_dedicated_server"
cluster_name="Cluster_1"
dontstarve_dir="$HOME/.klei/DoNotStarveTogether"

function fail() {
echo Error: "$@" >&2
exit 1
}

function check_for_file() {
if [ ! -e "$1" ]; then
fail "Missing file: $1"
fi
}

cd "$steamcmd_dir" || fail "Missing $steamcmd_dir directory!"
check_for_file "steamcmd.sh"
check_for_file "$dontstarve_dir/$cluster_name/cluster.ini"
check_for_file "$dontstarve_dir/$cluster_name/cluster_token.txt"
check_for_file "$dontstarve_dir/$cluster_name/Master/server.ini"
check_for_file "$dontstarve_dir/$cluster_name/Caves/server.ini"
check_for_file "$install_dir/bin"
cd "$install_dir/bin" || fail
run_shared=(./dontstarve_dedicated_server_nullrenderer)
run_shared+=(-console)
run_shared+=(-cluster "$cluster_name")
run_shared+=(-monitor_parent_process $$)
run_shared+=(-shard)
"${run_shared[@]}" Caves | sed 's/^/Caves: /' &
"${run_shared[@]}" Master | sed 's/^/Master: /'

脚本中默认启动的是32位服务器,如果想启动64位服务(会用更大的内存,相对也会更流畅一些),只需要更改这两行:

1
2
cd "$install_dir/bin" || fail
run_shared=(./dontstarve_dedicated_server_nullrenderer)

为:

1
2
cd "$install_dir/bin64" || fail
run_shared=(./dontstarve_dedicated_server_nullrenderer_x64)

踩坑点三:启动脚本在win端创建上传服务器导致出现所有者问题而提示没有该文件

一定要vim boot.sh,不能直接上传。

赋予boot.sh执行权限

1
sudo chmod u+x boot.sh

注意,这里如果是在steam用户下使用sudo要先把steam添加到sudors

1
2
su root
usermod -G sudo steam

好了之后再su - steam切换回来,再执行上面的指令

开放端口

udp:10888、10999、10998、8767、27017

tcp:8767、27017

踩坑点四:未开启CentOS自带的防火墙使得无法连通

虽然不知道为什么,但是确实如此,必须开启防火墙端口才能通。

默认防火墙是关着的,开启输入指令

1
2
3
systemctl start firewalld
systemctl enable firewalld
systemctl status firewalld

如果有绿色的active就说明成功了

接着一个个输入

1
firewall-cmd --zone=public --add-port=端口/协议类型 --permanent

例如开放10888udp则输入

1
firewall-cmd --zone=public --add-port=10888/udp --permanent

udp\tcp都要放行,全部搞完了重载一下防火墙

1
sudo firewall-cmd --reload

输入以下指令查看是否成功

1
firewall-cmd --permanent --list-ports

ports右边如果有刚才添加的就成功了,之后别忘了在阿里云的安全组或者腾讯的防火墙也放行一下。

启动饥荒服务器

直接./boot.sh就行了,或者套一个screen在里面启动也可以

如果提示启动成功但是搜不到是因为没有更新到最新版本

1
2
3
su - steam
cd ~/Steam
./steamcmd.sh +force_install_dir ../dontstarvetogether_dedicated_server +login anonymous +app_update 343050 validate +quit