How to setup dedicated server with cave on Linux
How to install,configure and update mods on Dedicated Server
$ uname -a
···Linux test-server 3.10.0-862.3.3.el7.x86_64 #1 SMP Fri Jun 15 04:15:27 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
$ cat /etc/redhat-release
···CentOS Linux release 7.5.1804 (Core)
# yum install wget screen glibc.i686 libstdc++.i686 libcurl.i686
# 开头表示root执行,$ 开头表示普通用户
// root添加运行用户,不推荐用root运行服务
# useradd dstuser
// 切换用户
# su - dstuser
// 下载steamCMD
$ wget https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz
// 解压到 steamcmd文件夹下
$ mkdir steamcmd && tar -C steamcmd -zxvf steamcmd_linux.tar.gz
// 执行命令以安装饥荒,注意执行权限 "$ chmod +x steamcmd.sh"
$ cd steamcmd && ./steamcmd.sh +login anonymous +force_install_dir ~/dst_server +app_update 343050 validate +quit
# 注释:或者进入交互安装
$ cd steamcmd && ./steamcmd.sh
> login anonymous
> force_install_dir /home/dst/server_dst
> app_update 343050 validate
> quit
# 注释--------
# login 登陆用户名
# force_install_dir 安装路径
# app_update 343050 validate 安装/更新饥荒 343050为游戏id
# quit 退出
# 安装完成输出
··· Success! App '343050' fully installed.
// 进入游戏执行文件目录,查看缺失依赖 ldd: list dynamic dependencies
$ cd ~/dst_server/bin && ldd dontstarve_dedicated_server_nullrenderer
··· 省略 ...
··· libcurl-gnutls.so.4 => not found
··· 省略 ...
// 切换回root,处理libcurl-gnutls.so.4缺失,从/usr/lib/libcurl.so.4 软连接一个 libcurl-gnutls.so.4
# ln -s /usr/lib/libcurl.so.4 /usr/lib/libcurl-gnutls.so.4
// 切回普通用户,再次执行之后会报无可用版本信息,但是不影响服务运行
$ ./dontstarve_dedicated_server_nullrenderer
··· ./dontstarve_dedicated_server_nullrenderer: /lib/libcurl-gnutls.so.4: no version information available (required by ./dontstarve_dedicated_server_nullrenderer)
// 写个启动脚本,不能直接用绝对路径,会报找不到文件
$ vim start.sh
#! /bin/bash
# 启动主服务器
cd /home/dstuser/dst_server/bin
./dontstarve_dedicated_server_nullrenderer -cluster MyDediServer -shard Master
$ vim start2.sh
#! /bin/bash
# 启动地下洞穴服务器
cd /home/dstuser/dst_server/bin
./dontstarve_dedicated_server_nullrenderer -cluster MyDediServer -shard Caves
// 参数说明
-persistent_storage_root:
修改存储的根目录,应该用绝对路径,默认.klei
-conf_dir:
修改配置文件目录,不应该包含/,存储路径为<persistent_storage_root>/<conf_dir>
-cluster:
设置使用的集群名字,配置文件会在 <persistent_storage_root>/<conf_dir>/<cluster>/cluster.ini,默认Cluster_1
-shard:
设置使用的分片目录,配置文件会在<persistent_storage_root>/<conf_dir>/<cluster>/<shard>/server.ini,默认Master
-offline:
离线,只有本地网络用户能加入服务器,与steam相关的功能都不起作用
-console:
允许输入lua命令,不推荐,使用[MISC]下的console_enabled替代
--bind_ip <bind_ip>:
修改监听位置
-port <port_number>:
监听UDP连接的端口,会覆盖server.ini中[NETWORK]下的server_port设置,10998-110108
-players <max_players>:
允许加入游戏的最大玩家数,会覆盖cluster.ini中[GAMEPLAY]下的max_players设置,1-64
-steam_master_server_port <port_number>:
steam使用的内部端口,覆盖server.ini中[STEAM]下的master_server_port设置
-steam_authentication_port <port_number>:
steam使用的内部端口,覆盖server.ini中[STEAM]下的authentication_port设置
-backup_logs:
每次运行时创建以前的日志备份
-tick <tick_rate>:
服务器向客户端发送更新的每秒的次数,覆盖cluster.ini中[NETWORK]下的tick_rate设置,15-60
// 服务器token文件,必须,内容为你账号生成的token
$ vim ~/.klei/DoNotStarveTogether/MyDediServer/cluster_token.txt
打开饥荒游戏 -> 开始游戏 -> 个人资料 -> Generate Server Token
-> 将生成的token复制到cluster_token.txt
文件内
// 地上世界配置文件,文件名用 leveldataoverride.lua
,不是worldgenoverride.lua
$ vim ~/.klei/DoNotStarveTogether/MyDediServer/Master/leveldataoverride.lua
--获取配置可以自己用主机在饥荒开一个世界,设置好,然后在`C:\Users\<username>\Documents\Klei\DoNotStarveTogether\Cluster_<num>\Master\`下找到这个文件
--<username>为自己用户名,<num>为创建世界选项里的第几个世界,从上往下1,2,3,4,5
return {
desc="The standard Don't Starve experience.",
hideminimap=false,
id="SURVIVAL_TOGETHER",
location="forest",
max_playlist_position=999,
min_playlist_position=0,
name="Default",
numrandom_set_pieces=4,
ordered_story_setpieces={ "Sculptures_1", "Maxwell5" },
override_level_string=false,
overrides={
alternatehunt="default",
angrybees="default",
antliontribute="default",
autumn="default",
bearger="default",
beefalo="default",
beefaloheat="default",
bees="default",
berrybush="default",
birds="default",
boons="default",
branching="default",
butterfly="default",
buzzard="default",
cactus="default",
carrot="default",
catcoon="default",
chess="default",
day="default",
deciduousmonster="default",
deerclops="default",
disease_delay="default",
dragonfly="default",
flint="default",
flowers="default",
frograin="default",
goosemoose="default",
grass="default",
houndmound="default",
hounds="default",
hunt="default",
krampus="default",
layout_mode="LinkNodesByKeys",
liefs="default",
lightning="default",
lightninggoat="default",
loop="default",
lureplants="default",
marshbush="default",
merm="default",
meteorshowers="default",
meteorspawner="default",
moles="default",
mushroom="default",
penguins="default",
perd="default",
petrification="default",
pigs="default",
ponds="default",
prefabswaps_start="default",
rabbits="default",
reeds="default",
regrowth="default",
roads="default",
rock="default",
rock_ice="default",
sapling="default",
season_start="default",
specialevent="default",
spiders="default",
spring="default",
start_location="default",
summer="default",
tallbirds="default",
task_set="default",
tentacles="default",
touchstone="default",
trees="default",
tumbleweed="default",
walrus="default",
weather="default",
wildfires="default",
winter="default",
world_size="huge",
wormhole_prefab="wormhole"
},
random_set_pieces={
"Sculptures_2",
"Sculptures_3",
"Sculptures_4",
"Sculptures_5",
"Chessy_1",
"Chessy_2",
"Chessy_3",
"Chessy_4",
"Chessy_5",
"Chessy_6",
"Maxwell1",
"Maxwell2",
"Maxwell3",
"Maxwell4",
"Maxwell6",
"Maxwell7",
"Warzone_1",
"Warzone_2",
"Warzone_3"
},
required_prefabs={ "multiplayer_portal" },
substitutes={ },
version=3
}
// 地下世界的配置文件
$ vim ~/.klei/DoNotStarveTogether/MyDediServer/Caves/leveldataoverride.lua
--获取配置可以自己用主机在饥荒开一个世界,设置好,然后在`C:\Users\<username>\Documents\Klei\DoNotStarveTogether\Cluster_<num>\Caves\`下找到这个文件
--<username>为自己用户名,<num>为创建世界选项里的第几个世界,从上往下1,2,3,4,5
return {
background_node_range={ 0, 1 },
desc="Delve into the caves... together!",
hideminimap=false,
id="DST_CAVE",
location="cave",
max_playlist_position=999,
min_playlist_position=0,
name="The Caves",
numrandom_set_pieces=0,
override_level_string=false,
overrides={
banana="default",
bats="default",
berrybush="default",
boons="default",
branching="default",
bunnymen="default",
cave_ponds="default",
cave_spiders="default",
cavelight="default",
chess="default",
disease_delay="default",
earthquakes="default",
fern="default",
fissure="default",
flint="default",
flower_cave="default",
grass="default",
layout_mode="RestrictNodesByKey",
lichen="default",
liefs="default",
loop="default",
marshbush="default",
monkey="default",
mushroom="default",
mushtree="default",
petrification="default",
prefabswaps_start="default",
reeds="default",
regrowth="default",
roads="never",
rock="default",
rocky="default",
sapling="default",
season_start="default",
slurper="default",
slurtles="default",
start_location="caves",
task_set="cave_default",
tentacles="default",
touchstone="default",
trees="default",
weather="default",
world_size="huge",
wormattacks="default",
wormhole_prefab="tentacle_pillar",
wormlights="default",
worms="default"
},
required_prefabs={ "multiplayer_portal" },
substitutes={ },
version=3
}
# 注释 cluster.ini配置参数
[MISC]
max_snapshots:
默认6,保存的存档数
[SHARD]
shard_enabled:
默认false,是否启用分片,多级服务器必须true
bind_ip:
默认127.0.0.1,在server.ini覆盖,如果shard_enabled=true和is_master=true则必须
master_ip:
默认none,在server.ini覆盖,如果shard_enabled=true和is_master=false则必须
master_port:
默认10888,server.ini覆盖,UDP
cluster_key:
默认none,在server.ini覆盖,如果shard_enabled=true则必须,同一台计算机上的服务器只需设置一次,不同的则都需要设置
[STEAM]
steam_group_only:
默认false,是否只允许steam组的成员连接
steam_group_id:
默认0,上述为true时使用
steam_group_admins:
默认false,为true时steam_group_id中的管理员也将是服务器的管理员
[NETWORK]
offline_server:
默认false,离线服务器,steam功能不可用
tick_rate:
默认15,每秒服务器向客户端更新次数
whitelist_slots:
默认0,保留用户空位,将用户id放入与cluste.ini同级目录whitelist.txt中
cluster_password:
默认none,玩家加入时要输入的密码
cluster_name:
集群名,会显示在饥荒搜结果索里
cluster_description:
默认empty,集群介绍
lan_only_cluster:
默认false,是否仅本地模式
cluster_intention:
默认依据游戏模式,游戏风格,[cooperative | competitive | social | madness] 合作|竞争|社交|疯狂
[GAMEPLAY]
max_players:
默认16,最大玩家数量
pvp:
默认false,是否可以pvp
game_mode:
默认survival,游戏模式,[survival | endless | wilderness] 生存|无尽|荒野
pause_when_empty:
默认false,没有玩家时暂停服务器
vote_kick_enabled:
默认false,是否开启投票替人
# ================================================================
# 注释 server.ini配置参数
[SHARD]
is_master:
默认none,如果shard_enabled=true则必须,是否为集群的主服务器,只能有一个true,其余false
name:
默认none,如果shard_enabled=true和is_master=false则必须,会显示在日志中的分片名
id:
默认随机数字,内部唯一标识
[STEAM]
authentication_port:
默认8766,steam用的端口,同一台计算机上每个服务器需要不同
master_server_port:
默认27016,steam用的端口,同一台计算机上每个服务器需要不同
[NETWORK]
server_port:
默认10999,UDP,10998-11018,同一台计算机上每个服务器需要不同
// 通用配置文件,可以在C:\Users\<username>\Documents\Klei\DoNotStarveTogether\Cluster_<num>\
下找到这个文件
$ vim ~/.klei/DoNotStarveTogether/MyDediServer/cluster.ini
[GAMEPLAY]
game_mode = endless
max_players = 6
pvp = false
pause_when_empty = true
[NETWORK]
lan_only_cluster = false
cluster_intention = social
cluster_password = <your_password>
cluster_description = lazy, no description
cluster_name = <display_name>
offline_cluster = false
cluster_language = en
autosaver_enabled = true
enable_vote_kick = false
[MISC]
console_enabled = true
[SHARD]
shard_enabled = true
bind_ip = 127.0.0.1
master_ip = 127.0.0.1
master_port = 11001
cluster_key = dstuser
// 地上世界配置文件
$ vim ~/.klei/DoNotStarveTogether/MyDediServer/Master/server.ini
[NETWORK]
server_port = 10999
[SHARD]
is_master = true
[ACCOUNT]
encode_user_path = false
[STEAM]
master_server_port = 12346
authentication_port = 12345
// 地下世界配置文件
$ vim ~/.klei/DoNotStarveTogether/MyDediServer/Caves/server.ini
[NETWORK]
server_port = 11000
[SHARD]
is_master = false
name = Caves
[ACCOUNT]
encode_user_path = false
[STEAM]
master_server_port = 12348
authentication_port = 12347
// 配置mod,一行一个,"--"双横线开头为注释
$ vim ~/dst_server/mods/dedicated_server_mods_setup.lua
--Global Position
ServerModSetup("378160973")
// mod的启用和配置,Master和Caves文件夹各一份,内容参考mod自身文件夹下的modinfo.lua
文件的写法
$ vim ~/.klei/DoNotStarveTogether/MyDediServer/Master/modoverrides.lua
$ vim ~/.klei/DoNotStarveTogether/MyDediServer/Caves/modoverrides.lua
return {
["workshop-378160973"]={
configuration_options={
ENABLEPINGS=true,
FIREOPTIONS=2,
OVERRIDEMODE=false,
SHAREMINIMAPPROGRESS=true,
SHOWFIREICONS=true,
SHOWPLAYERICONS=true,
SHOWPLAYERSOPTIONS=2
},
enabled=true
}
}
与cluster.ini
同级的目录下建立文件adminlist.txt
,内容为用户id,即KU_
开头的一串标识符,一行一个
KU_xxxxxxxxx
KU_xxxxxxxxx
与cluster.ini
同级的目录下建立文件whitelist.txt
,内容为用户id,即KU_
开头的一串标识符,一行一个。并在cluster.ini
中的whitelist_slots
设置占位数量。之后服务器实际能进人数量为 最大数量 减去 whitelist_slots数值
KU_xxxxxxxxx
KU_xxxxxxxxx
与cluster.ini
同级的目录下建立文件blocklist.txt
,内容为用户Steamid,是一串数字,不是KU开头的id,一行一个
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
$ ./start.sh
$ ./start2.sh
如果一切顺利,就可以打开游戏,浏览游戏中搜索到了。
// 等同于安装命令
$ cd steamcmd && ./steamcmd.sh +login anonymous +force_install_dir ~/dst_server +app_update 343050 validate +quit
可以使用 cron
的定时任务配合 bash
脚本实现服务器的重启与自动更新
可以使用 screen
防止终端操作掉线时任务中断
screen start.sh
启动任务
分离任务,后台运行 Ctrl + a
后按d
或者直接 screen -dmS <a_name> start.sh
启动一个有名字的分离的后台任务
使用 screen -r <a_name>
连接