写在前面

上一篇饥荒服务器的搭建教程写的不够详细,这篇文章将细节化服务器的搭建过程

准备工作

  • ssh工具
  • 配置不低于2C2G的服务器(带洞穴)
  • 一颗折腾的心

服务端搭建

添加用户

使用root登录服务器,用下面这行建立一个新用户,设置好密码后一路换行就行,后续管理服务器只会用到这个账户

1
adduser dstserver

安装sudo

1
apt install sudo

编辑sudo配置,让dstserver使用sudo时不需要输入密码

1
nano /etc/sudoers

方向键移动光标,找到root ALL=(ALL:ALL) ALL这一行,在下面插入一行dstserver ALL=(ALL) NOPASSWD:ALL,分别按Ctrl + x、y、换行保存退出。
现在可以将ssh登录信息改为dstserver了,以后都用这个用户登录服务器,这么做可以让sftp上传的文件都归属用户dstserver,可以规避一些文件权限造成的问题

安装依赖

使用用户dstserver登录服务器

1
2
3
sudo dpkg --add-architecture i386
sudo apt update
sudo apt install curl wget file tar bzip2 gzip unzip bsdmainutils util-linux ca-certificates binutils bc jq tmux lib32gcc-s1 lib32stdc++6 libcurl4-gnutls-dev:i386

安装DSTServer本体

通过steamcmd部署dst服务

使用用户dstserver登录服务器

1
2
3
4
5
6
7
8
9
cd ~
mkdir steamCMD && cd steamCMD
wget https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz
tar -xvzf steamcmd_linux.tar.gz && rm ./steamcmd_linux.tar.gz
./steamcmd.sh
force_install_dir /home/dstserver/dst_game_path
login anonymous
app_update 343050 validate
quit

游戏客户端生成地图配置

服务端不能直接生成,需要在客户端生成存档后移到服务器上
在客户端新建一个世界,类型选择本地存档,配好规则和mod设置,这将会是你的专用服务器设置。一切设置好后,开启服务器,进入人物选择界面后就可以退到游戏主界面了。

按照下面顺序进入账号设置生成一个以psd-g开头的服务器token,这个东西证明此服务器归属这个steam账号,保存一份,待会会用到





打开文件资源管理器,进入文档\Klei\DoNotStarveTogether{某一串数字,这个数字是你的steam好友id}
这个文件夹下的其中一个Cluster_x是你刚才创建的存档,根据创建时间区分。把这个文件夹拷贝一份,更名为Cluster_1。现在进入这个Cluster_1新建一个cluster_token.txt,一定要保证这个文件的编码方式为UTF-8,把刚才拿到的服务器token粘贴进来,保存退出

上传整合地图配置

使用用户dstserver登录服务器

使用ssh工具的sftp将Cluster_1上传到服务器的 ~/.klei/DoNotStarveTogether/

启用mod

如果存档没有使用服务端mod则可以跳过这一栏。

将所有服务端mod添加到一个合集里,获取合集id(合集链接末尾的一窜数字),

使用用户dstserver登录服务器,

修改 ~/dst_game_path/mods/dedicated_server_mods_setup.lua

在文件末尾增加一行,数字改为你自己的mod合集id

1
ServerModCollectionSetup("2776636182")

这样服务端每次启动都会对mod进行更新

关于mod不能下载的bug

最近Klei更新服务器后出现了一个服务端mod不能下载的bug,可以尝试下面方法进行修复:

将steamCMD目录下的steamclient.so文件拷贝到服务器目录,32位与64位拷哪个取决于你的服务端使用32位还是64位,建议都拷

1
cp ~/steamCMD/linux32/steamclient.so ~/dst_game_path/bin/lib32/ && cp ~/steamCMD/linux64/steamclient.so ~/dst_game_path/bin64/lib64/

创建启动脚本

使用用户dstserver登录服务器,

将下面内容保存为~/1.sh

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
#!/bin/bash
#######################################参数设置##########################################
NAME="dst" #screen名称
RUN64="0" #是否使用64位服务端
DIR="${HOME}/dst_game_path" #dontstarve_dedicated_server_nullrenderer位置
STEAMCMD="${HOME}/steamCMD" #steamCMD位置
STORAGE="${HOME}/.klei" #存档位置
CONFIGDIR="DoNotStarveTogether" #存档文件夹名字
PARAMS="-persistent_storage_root ${STORAGE} -conf_dir ${CONFIGDIR} -console -cluster Cluster_1" #启动参数
WAY=3 #关闭方式选择。1——screen指令关闭;2——screen获取pid后kill;3——ps获取pid后kill
#######################################详细代码##########################################

if [[ $RUN64 -eq 1 ]]; then
BINARYPATH="$DIR/bin64"
BINARYNAME="dontstarve_dedicated_server_nullrenderer_x64"

else
BINARYPATH="$DIR/bin"
BINARYNAME="dontstarve_dedicated_server_nullrenderer"
fi
BINARY="${BINARYPATH}/${BINARYNAME}"

#启动部分
function StartScreen(){
# 检查 dst1 和 dst2 是否已启动
StartNameList=$(screen -ls | grep ${NAME}1)
StartNameList2=$(screen -ls | grep ${NAME}2)
if [[ -z $StartNameList && -z $StartNameList2 ]]; then
# 两个会话都没有启动,开始启动
cd ${BINARYPATH}
echo -n "开启 ${NAME}1 服务器中......"
screen -dmS ${NAME}1 ./${BINARYNAME} $PARAMS -shard Master
echo -n "开启 ${NAME}2 服务器中......"
screen -dmS ${NAME}2 ./${BINARYNAME} $PARAMS -shard Caves
sleep 1
echo "已完成"
else
# 如果其中任何一个会话已经存在,提示用户
if [[ -n $StartNameList ]]; then
echo "已存在名为 ${NAME}1 的screen"
fi
if [[ -n $StartNameList2 ]]; then
echo "已存在名为 ${NAME}2 的screen"
fi
echo "启动中断,请尝试关闭后再启动服务端"
fi
return $?
}

#screen检查
function ScreenCheck(){
# 检查 dst1 和 dst2 的状态
CloseNameList=$(screen -ls | grep ${NAME}1)
CloseNameList2=$(screen -ls | grep ${NAME}2)

if [[ -n $CloseNameList || -n $CloseNameList2 ]]; then
echo -n "检查中..."
screen -wipe > /dev/null
screen -ls | grep ${NAME}1 > /dev/null
CloseNameList=$?
screen -ls | grep ${NAME}2 > /dev/null
CloseNameList2=$?

if [[ $CloseNameList -eq 0 || $CloseNameList2 -eq 0 ]]; then
echo "关闭异常"
else
echo "已关闭"
fi
else
echo "已关闭"
fi
}

#关闭部分
function CloseScreen(){
# 检查 dst1 和 dst2 是否运行
CloseNameList=`screen -ls | grep ${NAME}1`
CloseNameList2=`screen -ls | grep ${NAME}2`

if [[ ! -z $CloseNameList || ! -z $CloseNameList2 ]]; then
echo -n "关闭 ${NAME} 中......"
if [[ ! -z $CloseNameList ]]; then
echo "关闭 ${NAME}1"
# 根据选择的关闭方式关闭 dst1
if [ $WAY = 1 ]; then
screen -X -S ${NAME}1 quit
elif [ $WAY = 2 ]; then
screen -ls | grep ${NAME}1 | awk -F . '{print $1}' | awk '{print $1}' | xargs kill
elif [ $WAY = 3 ]; then
ps aux | grep -v grep | grep SCREEN | grep dontstarve_dedicated_server_nullrenderer | grep ${NAME}1 | awk '{print $2}' | xargs kill
else
echo "未指定关闭方式"
fi
fi

if [[ ! -z $CloseNameList2 ]]; then
echo "关闭 ${NAME}2"
# 根据选择的关闭方式关闭 dst2
if [ $WAY = 1 ]; then
screen -X -S ${NAME}2 quit
elif [ $WAY = 2 ]; then
screen -ls | grep ${NAME}2 | awk -F . '{print $1}' | awk '{print $1}' | xargs kill
elif [ $WAY = 3 ]; then
ps aux | grep -v grep | grep SCREEN | grep dontstarve_dedicated_server_nullrenderer | grep ${NAME}2 | awk '{print $2}' | xargs kill
else
echo "未指定关闭方式"
fi
fi
# 检查关闭状态
ScreenCheck
else
echo "未找到名为 ${NAME}1 或 ${NAME}2 的screen"
fi
return $?
}

#更新部分
function Update(){
cd $STEAMCMD
./steamcmd.sh +force_install_dir ${DIR} +login anonymous +app_Update 343050 validate +quit
return $?
}

#路径检查
function PathCheck(){
if [ -f ${BINARY} ];then
echo "${BINARY}路径正常"
else
echo "${BINARY}路径异常"
fi
if [ -f "$STEAMCMD/steamcmd.sh" ];then
echo "steamCMD路径正常"
else
echo "steamCMD路径异常"
fi
return $?
}

#交互部分
function MainBody(){
echo " "
echo "1——开启服务器"
echo "2——关闭服务器"
echo "3——重启服务器"
echo "4——查看服务器"
echo "5——更新游戏"
echo "6——路径检查"
echo " "
read -n 1 -p "请输入对应数字选择功能:" answer
echo
case $answer in
1 | s)
StartScreen;;
2 | c)
CloseScreen;;
3 | r)
echo "执行重启步骤"
CloseScreen
StartScreen;;
4 | l)
screen -ls
echo "以下为详细参数:"
ps aux | grep -v grep | awk '{print $1,$2,$11,$12,$13,$14,$15,$16,$17,$18,$19,$20,$21,$22,$23,$24,$25,$26,$27,$28,$29,$30,$31,$32,$33,$34,$35,$36,$37,$38}'| grep SCREEN --color
;;
5 | u)
echo "执行更新步骤"
CloseScreen
Update
StartScreen;;
6 | p)
PathCheck;;
*)
echo "未知指令,请重试";;
esac
return $?
}

MainBody

修改权限

1
chmod 775 ./1.sh

开启与关闭服务器

使用用户dstserver登录服务器,根据脚本提示输入对应的指令就行

1
./1.sh

第一次启动服务器需要花费时间下载mod,要查看进入可以用screen进去看,出现Sim Pause则代表服务器启动完毕。dst1是主世界,dst2是洞穴世界

1
screen -r dst1

感谢