写在前面 上一篇饥荒服务器的搭建教程写的不够详细,这篇文章将细节化服务器的搭建过程
准备工作
ssh工具
配置不低于2C2G的服务器(带洞穴)
一颗折腾的心
服务端搭建 添加用户 使用root登录服务器,用下面这行建立一个新用户,设置好密码后一路换行就行,后续管理服务器只会用到这个账户
安装sudo
编辑sudo配置,让dstserver 使用sudo时不需要输入密码
方向键移动光标,找到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 steamCMDwget 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" RUN64="0" DIR="${HOME} /dst_game_path" STEAMCMD="${HOME} /steamCMD" STORAGE="${HOME} /.klei" CONFIGDIR="DoNotStarveTogether" PARAMS="-persistent_storage_root ${STORAGE} -conf_dir ${CONFIGDIR} -console -cluster Cluster_1" WAY=3 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 (){ 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 $? } function ScreenCheck (){ 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 (){ 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" 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" 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
修改权限
开启与关闭服务器 使用用户dstserver登录服务器,根据脚本提示输入对应的指令就行
第一次启动服务器需要花费时间下载mod,要查看进入可以用screen进去看,出现Sim Pause则代表服务器启动完毕。dst1是主世界,dst2是洞穴世界
感谢