独立服务器可以用来独立的运行饥荒联机版(Don’t Strave Together Dedicated Server),而不使用图形化界面,从而节约客户端资源或者便于与他人联机。独立服务器可以搭建在 Windows/Linux 上,本教程用的是Ubuntu 20.04.4 LTS Linux服务器。

服务器基本要求

至少一个可以正常游玩饥荒联机版的帐号。

一台向公网(或者至少向面向的玩家)开放了端口,可以使用 UDP 协议发送数据,能够访问 klei 服务器的设备。 如果没有公网 ip 地址,可以拿端口转发凑合(增加延迟)。服务器默认以 UDP 11000 端口开放。

运行一台稳定的服务器,你的系統必須满足以下条件:

  • 上行速度: 每个玩家 8 Kb/s, 游戏后期实体增多可能需要更高带宽
  • RAM:每个玩家 65Mb, 游戏后期实体增多需要提高内存配置或使用 Mod 降低卡顿
  • CPU:性能越强越好,但与游戏体验无直接关联,详见"UNIX Bench多台VPS主机性能测试"
  • GPU:无所谓
  • VCRedist_2008 (x86)(Windows 下时)

注意:饥荒联机版服务器版只能调用CPU的单核性能,因此多核心并不能提升游戏体验。单核性能过差的服务器可能在人多以及需要复杂渲染场景的情况下,出现卡顿、瞬移等不佳等游戏体验,强烈建议在开始部署前测试一下服务器CPU的单核性能!

安裝服务器本体

目前 Steam 提供两种方法下载服务器:steamcmd 和 steam 本体,后者只需在“库”中选择工具,并找到 "Don't Starve Together Dedicated Server" 即可安装。但是对于独立服务器可能没有配置图形界面,因此也可以使用 steamcmd 来完成下载(和更新)。

打开必要的端口

  • TCP 22 (SSH默认端口)
  • TCP 8080 (管理前端的默认端口,Nginx反向代理开启后可以关闭)
  • TCP 80 (Nginx反向代理HTTP默认端口)
  • TCP 443 (Nginx反向代理HTTPS默认端口)
  • TCP&UDP 10888,10999,10998 (饥荒服务端的默认端口,TCP也要开,否则会连不上)

我们推荐在搭建服务器的过程中开启所有端口,避免不必要的报错。待安装完成后仅开启需要的端口(端口全开会增加服务器被攻击的风险),上述列出的4个端口必开,否则服务无法正常被连接!

安装依赖包

以下命令请使用root运行

安装系统环境,以下内容由官方提供:

第一步:

# Ubuntu/Debian 64-Bit
sudo apt-get install lib32gcc1 screen

第二步:

sudo apt-get install libstdc++6:i386 libgcc1:i386 libcurl4-gnutls-dev:i386

如果安装失败,请先执行以下命令

dpkg --add-architecture i386
apt-get update

新增用户

不推荐直接使用root账户直接运行游戏,因此我们需要新建一个普通账户,用户名为dst

sudo adduser dst

你会看到以下选项依次弹出,请设置好dst用户的密码

Enter new UNIX password: 
Retype new UNIX password: 
passwd: password updated successfully
Changing the user information for username
Enter the new value, or press ENTER for the default
    Full Name []: 
    Room Number []: 
    Work Phone []: 
    Home Phone []: 
    Other []: 
Is the information correct? [Y/n] 

请在最后的Is the information correct? [Y/n] 输入y确认信息正确。

安装游戏本体

请确保使用dst用户,可以通过su dst切换至dst用户

开始下载并解压安装,默认目录选用户 home 目录

新建一个名为steamcmd的文件夹

mkdir ~/steamcmd

进入文件夹

cd ~/steamcmd

下载饥荒官网提供的精简版SteamCMD

wget https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz

解压压缩文件

tar -xvzf steamcmd_linux.tar.gz

通过 force_install_dir 指定了 DST 的安装路径,这里取 ~/dst 作为安装目录,若有需要可自行更改,不指定则默认安装至 ~/Steam/steamapps/common/Don't Starve Together Dedicated Server

./steamcmd.sh +login anonymous +force_install_dir ~/dst +app_update 343050 validate +quit

或者一条条命令输也行

./steamcmd.sh
login anonymous
force_install_dir ~/dst
app_update 343050 validate
quit

等待安装完成

运行游戏

进入文件夹

cd ~/dst/bin

临时运行服务端

./dontstarve_dedicated_server_nullrenderer

如果出现以下提示,证明安装成功,按Ctrl+C终止进程

[200] Account Failed (6): "E_INVALID_TOKEN"
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!! Your Server Will Not Start !!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

如果出现报错,请使用以下命令检查缺少哪个必要的运行库,并补上

ldd dontstarve_dedicated_server_nullrenderer

游戏升级

由于饥荒服务器与客户端版本不一致会导致无法正常在游戏列表中搜索到,手动更新过于繁琐。因此我写了一个自动更新/备份的脚本,有需要的请去GitHub自取。代码可能比较乱,请见谅!

~/steamcmd/steamcmd.sh +login anonymous +force_install_dir ~/dst +app_update 343050 validate +quit

注意这是之前安装的命令,如果有修改路径的话,记得用实际路径

安装管理前端

到此为止,游戏已经可以正常使用命令运行,但是对普通人来说难度系数较大。因此最好有一套GUI来管理游戏本身。我们可以使用dst-admin这个前端面板。

dstAdmin

dstAdmin1

安装JDK

由于面板是用Java构建,我们需要安装JDK(Java Development Kit)

sudo apt-get install -y openjdk-8-jdk

查看JDK版本

java -version

显示 "openjdk version "1.8.0_252"就表示安装完成

下载安装最新版dst-admin安装包

wget http://clouddn.tugos.cn/release/dst-admin-1.4.0.jar -O dst-admin.jar

启动dst-admin

java -jar dst-admin.jar

此时使用[服务器IP]:8080就能正常访问

默认用户名/密码 admin/123456

使用dstStart.sh脚本管理dst-admin服务

执行dstStart.sh脚本按照指示进行

./dstStart.sh

设置Linux系统时间

由于dst-admin面板或用到一些计划任务,比如定时备份、定时升级等。很多服务商或默认将Linux时间设置为UTC(国际协调时间)。这样或许你跟小伙伴们玩着玩着,服务器就开始自动更新了起来

检查当前时间

timedatectl

输出:

               Local time: Wed 2020-05-06 19:33:20 UTC
           Universal time: Wed 2020-05-06 19:33:20 UTC
                 RTC time: Wed 2020-05-06 19:33:22    
                Time zone: UTC (UTC, +0000)           
System clock synchronized: yes                         
              NTP service: active                      
          RTC in local TZ: no   

查找所有可用的时区

timedatectl list-timezones

输出:

...
America/Montevideo
America/Nassau
America/New_York
America/Nipigon
America/Nome
America/Noronha
...

设置时区

格式:

sudo timedatectl set-timezone your_time_zone

如果你要设置为北京时间:

sudo timedatectl set-timezone Asia/Shanghai

如果你要设置为凤凰城时间:

sudo timedatectl set-timezone America/Phoenix

最后,请重启!很多系统服务的时间必须要重启后才能生效!

使用Nginx反向代理

为了让Web服务访问起来更容易(不用输端口号),可以开启Nginx反向代理并开启HTTPS。参考配置文件如下:

server
    {
        listen 443 ssl;
        # 开启IPv6
        listen [::]:443 ssl;
        server_name dst.game.nwdan.com;
        ssl_certificate /etc/nginx/cert/dst.game.nwdan.com.crt;
        ssl_certificate_key /etc/nginx/cert/dst.game.nwdan.com.key;

        location / {
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $http_host;
            proxy_redirect off;
            proxy_pass http://127.0.0.1:8080;
        }
    }

准备配置文件

配置文件可以手动,也可以使用dst-admin前端面板自动生成,这里简单介绍一下手动配置的方法。

获取Token

  1. 打开游戏客户端,在游戏主界面,在左下角找到 Account 图标,打开。
  2. 在打开的页面下部,找到 Generate Server Token 按钮,在右侧的输入框内输入相应描述,比如输入 DST Dedi Server Token,然后点击 Generate Server Token 按钮,即生成了一个不会失效的 token。可以在按钮上方找到相应描述的 token,复制备用。
  3. 之后,将复制的 token 粘贴到 cluster_token.txt 文件中
  4. 生成该 token 的用户将默认带有管理员权限

配置世界地图

文件分为地上部分和洞穴部分

地上部分

地上部分,将文件保存为 worldgenoverride.lua,并放进 Master 文件夹中

    return {
  ["desc"]="标准《饥荒》体验。",
  ["hideminimap"]=false,
  id="SURVIVAL_TOGETHER",
  ["location"]="forest",
  ["max_playlist_position"]=999,
  ["min_playlist_position"]=0,
  ["name"]="默认",
  ["numrandom_set_pieces"]=4,
  ["override_level_string"]=false,
  ["overrides"]={
    ["alternatehunt"]="often",
    ["angrybees"]="rare",
    ["antliontribute"]="default",
    ["autumn"]="default",
    ["bearger"]="default",
    ["beefalo"]="default",
    ["beefaloheat"]="default",
    ["bees"]="default",
    ["berrybush"]="default",
    ["birds"]="default",
    ["boons"]="often",
    ["branching"]="default",
    ["butterfly"]="default",
    ["buzzard"]="default",
    ["cactus"]="default",
    ["carrot"]="default",
    ["catcoon"]="default",
    ["chess"]="default",
    ["day"]="default",
    ["deciduousmonster"]="default",
    ["deerclops"]="default",
    ["disease_delay"]="none",
    ["dragonfly"]="default",
    ["flint"]="default",
    ["flowers"]="default",
    ["frograin"]="never",
    ["goosemoose"]="default",
    ["grass"]="default",
    ["has_ocean"]=true,
    ["houndmound"]="default",
    ["hounds"]="default",
    ["hunt"]="default",
    ["keep_disconnected_tiles"]=true,
    ["krampus"]="often",
    ["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",
    ["no_joining_islands"]=true,
    ["no_wormholes_to_disconnected_tiles"]=true,
    ["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"]="winters_feast",
    ["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"]="rare",
    ["winter"]="default",
    ["world_size"]="default",
    ["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" },
  ["required_setpieces"]={ "Sculptures_1", "Maxwell5" },
  ["substitutes"]={  },
  ["version"]=4 
}

洞穴部分

洞穴部分,将文件保存为 worldgenoverride.lua,并放进 Caves 文件夹中

    return {
  ["background_node_range"]={ 0, 1 },
  ["desc"]="探查洞穴…… 一起!",
  ["hideminimap"]=false,
  id="DST_CAVE",
  ["location"]="cave",
  ["max_playlist_position"]=999,
  ["min_playlist_position"]=0,
  ["name"]="洞穴",
  ["numrandom_set_pieces"]=0,
  ["override_level_string"]=false,
  ["overrides"]={
    ["banana"]="default",
    ["bats"]="default",
    ["berrybush"]="default",
    ["boons"]="often",
    ["branching"]="default",
    ["bunnymen"]="default",
    ["cave_ponds"]="default",
    ["cave_spiders"]="default",
    ["cavelight"]="default",
    ["chess"]="default",
    ["disease_delay"]="none",
    ["earthquakes"]="rare",
    ["fern"]="default",
    ["fissure"]="default",
    ["flint"]="default",
    ["flower_cave"]="often",
    ["grass"]="default",
    ["layout_mode"]="RestrictNodesByKey",
    ["lichen"]="default",
    ["liefs"]="rare",
    ["loop"]="default",
    ["marshbush"]="default",
    ["monkey"]="default",
    ["mushroom"]="default",
    ["mushtree"]="default",
    ["prefabswaps_start"]="default",
    ["reeds"]="default",
    ["regrowth"]="default",
    ["roads"]="never",
    ["rock"]="default",
    ["rocky"]="default",
    ["sapling"]="default",
    ["season_start"]="default",
    ["slurper"]="default",
    ["slurtles"]="default",
    ["specialevent"]="winters_feast",
    ["start_location"]="caves",
    ["task_set"]="cave_default",
    ["tentacles"]="default",
    ["touchstone"]="default",
    ["trees"]="default",
    ["weather"]="default",
    ["world_size"]="small",
    ["wormattacks"]="default",
    ["wormhole_prefab"]="tentacle_pillar",
    ["wormlights"]="default",
    ["worms"]="default" 
  },
  ["required_prefabs"]={ "multiplayer_portal" },
  ["substitutes"]={  },
  ["version"]=4 
}

配置通用配置文件

[MISC]
max_snapshots = 6                  # 最大快照数,决定了可回滚的天数
console_enabled = true             # 是否开启控制台
 
[SHARD]
shard_enabled = true               # 服务器共享,要开启洞穴服务器的必须启用
bind_ip = 127.0.0.1                # 服务器监听的地址,当所有实例都运行在同一台机器时,可填写 127.0.0.1,会被 server .ini 覆盖
master_ip = 127.0.0.1              # master 服务器的 IP,针对非 master 服务器,若与 master 服务器运行在同一台机器时,可填写 127.0.0.1,会被 server.ini 覆盖
master_port = 10888                # 监听 master 服务器的 UDP 端口,所有连接至 master 服务器的非 master 服务器必须相同
cluster_key = dst                  # 连接密码,每台服务器必须相同,会被 server.ini 覆盖
 
[STEAM]
steam_group_only = false           # 只允许某 Steam 组的成员加入
steam_group_id = 0                 # 指定某个 Steam 组,填写组 ID
steam_group_admins = false         # 开启后,Steam 组的管理员拥有服务器的管理权限
 
[NETWORK]
offline_server = false             # 离线服务器,只有局域网用户能加入,并且所有依赖于 Steam 的任何功能都无效,比如说饰品掉落
tick_rate = 15                     # 每秒通信次数,越高游戏体验越好,但是会加大服务器负担
whitelist_slots = 0                # 为白名单用户保留的游戏位
cluster_password =                 # 游戏密码,不设置表示无密码
cluster_name = ttionya test        # 游戏房间名称
cluster_description = description  # 游戏房间描述
lan_only_cluster = false           # 局域网游戏
cluster_intention = madness        # 游戏偏好,可选 cooperative, competitive, social, or madness,随便设置,没卵用
 
[GAMEPLAY]
max_players = 16                   # 最大游戏人数
pvp = true                         # 能不能攻击其他玩家,能不能给其他玩家喂屎
game_mode = survival               # 游戏模式,可选 survival, endless or wilderness,与玩家死亡后的负面影响有关
pause_when_empty = false           # 没人服务器暂停,刷天数必备
vote_kick_enabled = false          # 投票踢人

配置下载的 Mod 文件

饥荒通过一个名为 dedicated_server_mods_setup.lua 的文件确认需要下载哪些 Mod。

首先去创意工坊找些 Mod,并获得其 id,或者找些 Mod 合集,将 Mod id 按以下形式(换行复制粘贴)保存在文件中。以下是完整文件内容:

                return {
  ["workshop-1651623054"]={
    ["configuration_options"]={
      ["ddon"]=true,
      ["hbcolor"]="dynamic",
      ["hblength"]=10,
      ["hbpos"]=1,
      ["hbstyle"]="heart",
      ["value"]=true 
    },
    ["enabled"]=true 
  },
  ["workshop-375850593"]={ ["configuration_options"]={  }, ["enabled"]=true },
  ["workshop-378160973"]={
    ["configuration_options"]={
      ["ENABLEPINGS"]=true,
      ["FIREOPTIONS"]=2,
      ["OVERRIDEMODE"]=false,
      ["SHAREMINIMAPPROGRESS"]=true,
      ["SHOWFIREICONS"]=true,
      ["SHOWPLAYERICONS"]=true,
      ["SHOWPLAYERSOPTIONS"]=2 
    },
    ["enabled"]=true 
  },
  ["workshop-501385076"]={ ["configuration_options"]={ ["quick_harvest"]=true }, ["enabled"]=true },
  ["workshop-666155465"]={
    ["configuration_options"]={
      ["chestB"]=-1,
      ["chestG"]=-1,
      ["chestR"]=-1,
      ["food_estimation"]=-1,
      ["food_order"]=0,
      ["food_style"]=0,
      ["lang"]="auto",
      ["show_food_units"]=-1,
      ["show_uses"]=-1 
    },
    ["enabled"]=true 
  },
["workshop-1216718131"]={
    ["configuration_options"]={ ["clean"]=true, ["lang"]=true, ["stack"]=true },
    ["enabled"]=true 
  } 
}

推荐在Windows电脑通过GUI配置好后直接上传配置文件,手动配置会比较复杂!

文件夹结构

/home/dst/.klei/DoNotStarveTogether\MyDediServer
|
|   adminlist.txt(/adminlist.txt)
|   blocklist.txt(/blocklist.txt)
|   cluster.ini(/cluster.ini)
|   cluster_token.txt(/cluster_token.txt)
|   whitelist.txt(/whitelist.txt)
|
|---Master
|   |   modoverrides.lua(/Master/modoverrides.lua)
|   |   server.ini(/Master/server.ini)
|   |   worldgenoverride.lua(/Master/worldgenoverride.lua)
|   |   其他文件
|   |
|   |---其他文件夹
|
|---Caves
    |   modoverrides.lua(/Caves/modoverrides.lua)
    |   server.ini(/Caves/server.ini)
    |   worldgenoverride.lua(/Caves/worldgenoverride.lua)
    |   其他文件
    |
    |---其他文件夹
 
/home/dst/dst/mods
|
|   dedicated_server_mods_setup.lua(/dedicated_server_mods_setup.lua)

参考