饥荒自建 Docker 专用服务器 私服 学习笔记 Don't Starve dst-server home 编辑时间 2023/02/09 ![](/api/file/getImage?fileId=63e46797da7405001301c7f6) ## 前言 如题,最近沉迷饥荒捡垃圾无法自拔 但联机玩就会很卡,买加速器也会有其他小伙伴变卡顿 无意中看到可以自建服务器 这不巧了么,我刚好有服务器闲置中 百度出来的教程都是windows,用自己电脑建服务器,不推荐这个方案 直觉来说这是有问题的,因为你没有公网IP,一般运营商端口都是锁死的,如果搞内网穿透成本只有更高! 你之所以卡是因为你和你小伙伴IP连科雷服务器IP太遥远才慢,你用自己电脑开服务器,你实际承担了算力的工作,IP没有,还是没解决卡的问题。内网穿透比加速器贵比云主机贵。 经过研究发现最合适的是云主机加docker的方式,可以在保证流畅的前提下,最低成本的把游戏玩起来!虽然有点折腾,但折腾的原因是没有一篇文章或视频,把流程全部讲清楚,有头没尾的。我虽然写的啰嗦看起来长,但我是完完整整折腾到能玩的,而且我常年薅羊毛,有充分的省钱经验! 那么看到这里防止大家以为要钱的很贵的就跑路了 前面先插播讲下薅羊毛的方案 所有云主机都有免费薅羊毛,也就是试用,然后新人优惠一般是100/年最低配,我随便贴2个地址,按照划算程度排序. - 七牛云免费体验 [https://s.qiniu.com/YzARZf](https://s.qiniu.com/YzARZf) - 天翼云免费体验 [https://www.ctyun.cn/h5/activity/trial/personal](https://www.ctyun.cn/h5/activity/trial/personal) - 腾讯免费体验 [https://cloud.tencent.com/act/free?from=19067](https://cloud.tencent.com/act/free?from=19067) - 腾讯轻量云 [https://url.cn/l7xCIRZy](https://url.cn/l7xCIRZy) - 阿里云 [https://www.aliyun.com/activity/new/inde?userCode=sxc2wjx7](https://www.aliyun.com/activit/new/index?userCode=sxc2wjx7) 还有很多一口气说不完,你们可以自行百度关键字 `云主机 免费` 一说到薅羊毛就激动 多说两句 首先有docker加持,不用特别在意配置,内存大于1G,其他眼睛闭起来选,只要便宜就行。除非你是土豪,直接盲选阿里云高配。 然后推荐纯新人先薅羊毛领免费云主机,2个月免费用完再用新人优惠买一台1~3年的最低配长期用,到时候可以转移存档没关系,当然你要是够闲可以一家一家的薅羊毛,一年也能撑下来。 ## 折腾 这里省略了安装docker我觉得你已经至少会一点了,如果完全不会请参考我之前的docker入门笔记 <br> 一共就几个命令打在最前面 后面都只用得上这几个 ```shell # 创建容器(首次启动) docker run xxxxxx # 启动容器 docker start dstserver # 停止容器 docker stop dstserver # 删除容器 docker rm dstserver # 查看控制台 docker logs -f dstserver ``` <br> dockerhub 有很多饥荒镜像 (关键字搜索dst) 我最终选择的是这个镜像,这个作者更新勤快 [https://github.com/Jamesits/docker-dst-server](https://github.com/Jamesits/docker-dst-server) [https://hub.docker.com/r/jamesits/dst-server/](https://hub.docker.com/r/jamesits/dst-server/) <br> 先读了下说明书 理论最低配置 (英语机翻的将就看看 我文盲更一窍不通) * Linux x86_64并运行Docker(18.05.0-ce或更高版本)。 * 您可能需要一个公共IP,使您的服务器可以从互联网访问。 * 您需要4个暴露于公共网络的UDP端口。(See常见问题解答了解详情。) * CPU:对于小型服务器来说,1个核心已经足够了(但是不要尝试60个时钟周期,从15或30个开始)。 * 内存:我们建议为服务器预留1GiB内存,另外为每个活动用户预留60MiB内存。 * 磁盘大小:Docker映像需要1.5GiB,您还需要至少5MiB用于地图、配置和日志。建议使用4GiB可用磁盘空间。 **说重点,1c1g1m20G都绰绰有余了,可以理解为就是没有任何要求,只是利用他的公网IP和24小时不断电** <br> **首次启动** 1. 自建一个文件夹用来存放数据,我这里是 `/root/docker/dstserver` 2. 服务器防火墙必须打开10999-11000和12346-12347的外网请求,一般是在云平台的管理后台的安全组或防火墙里设置 3. 之所以是叫首次启动,就是因为需要先生成一下文件目录,这次必报错,但不必在意后面会说 ```shell // /root/docker/dstserver 需要提前新建好文件夹 // 4个udp端口需要提前的打开防火墙和安全组的外网请求限制 // -m 1024M是最大内存限制,建议设置为母机的75% 比如你买的2G内存主机,这里设置为1536M docker run -d\ -p 10999-11000:10999-11000/udp\ -p 12346-12347:12346-12347/udp\ -v /root/docker/dstserver:/data\ -m 1024M --oom-kill-disable --memory-swap=-1\ -e "TZ=Asia/Shanghai"\ --name dstserver\ jamesits/dst-server ``` 首次启动会进行游戏本体下载,解压,更新等漫长的操作 5~10分钟左右会停在这里 ```shell [00:00:05]: [00:00:05]: Alternatively generate a cluster_token you can [00:00:05]: open the console from a logged-in game [00:00:05]: client with the tilda key (~ / ù) and type: [00:00:05]: TheNet:GenerateClusterToken() [00:00:05]: This will create 'cluster_token.txt' in [00:00:05]: your client settings directory. Copy this [00:00:05]: into your cluster settings directory. [00:00:05]: [Connect] PendingConnection::Reset(true) [00:00:06]: [200] Account Failed (6): "E_INVALID_TOKEN" [00:00:06]: !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! [00:00:06]: !!!! Your Server Will Not Start !!!! [00:00:06]: !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! [00:00:06]: No auth token could be found. [00:00:06]: Please visit https://accounts.klei.com/account/game/servers?game=DontStarveTogether [00:00:06]: to generate server configuration files [00:00:06]: [00:00:06]: Alternatively generate a cluster_token you can [00:00:06]: open the console from a logged-in game [00:00:06]: client with the tilda key (~ / ù) and type: [00:00:06]: TheNet:GenerateClusterToken() [00:00:06]: This will create 'cluster_token.txt' in [00:00:06]: your client settings directory. Copy this [00:00:06]: into your cluster settings directory. [00:00:06]: [Connect] PendingConnection::Reset(true) [00:00:07]: ... FilesExistAsyncThread complete [00:00:07]: ... FilesExistAsyncThread complete 2023-02-09 08:12:42,223 INFO success: dst-server-cave entered RUNNING state, process has stayed up for > than 40 seconds (startsecs) 2023-02-09 08:12:42,223 INFO success: dst-server-master entered RUNNING state, process has stayed up for > than 40 seconds (startsecs) ``` <br> 抓重点! `Your Server Will Not Start ` `This will create 'cluster_token.txt' in your client settings directory. Copy this into your cluster settings directory.` 意思是没读到token <br> 根据说明书提示,下一步是私服必须的去官网申请token <br> **申请TOKEN步骤!!!** 1 首先打开steam商店,必须可以看到中间页面,否则后续会一直卡118错误代码,如果你看不到商店中间内容,推荐你退出steam,先下载安装个加速器,这里推荐网易uu,因为加速steam商店是免费的,如下图说明好了 ![](/api/file/getImage?fileId=63e4ae05da7405001301c89b) <br> 2 启动游戏,点击左下角 `账号` , 点击中间的 `游戏` , 点击 `《饥荒:联机版》的游戏服务器` ![](/api/file/getImage?fileId=63e4af70da7405001301c89e) <br> ![](/api/file/getImage?fileId=63e4af70da7405001301c89f) <br> 3 点击 `添加新服务器` , 随便输入一个名字(建议全英文) , 点击 `添加新服务器` , **然后如下图就会出现TOKEN**,复制出来有用! ![](/api/file/getImage?fileId=63e4b076da7405001301c8a7) <br> ![](/api/file/getImage?fileId=63e4b076da7405001301c8a6) <br> 4 顺便在账户首页复制一下**科雷ID (KLEI ID)** ![](/api/file/getImage?fileId=63e5ec4eda7405001301ca6b) <br> **服务器配置** 先停下容器 ```shell docker stop dstserver ``` 找到目录 `/root/docker/dst-server/DoNotStarveTogether/Cluster_1` 在 `adminlist.txt` 文件中输入你的科雷ID 在 `cluster_token.txt` 中输入你的TOKEN 再改下房间配置文件 `cluster.ini` ```ini ; Here is all the server configs you will ever want to change [NETWORK] ; DO change the name and description please! cluster_name = 房间名 cluster_description = 房间描述 cluster_password = 密码 不填则为空 offline_cluster = false lan_only_cluster = false whitelist_slots = 1 cluster_intention = social autosaver_enabled = true ; 支持中文 cluster_language = zh ;tick_rate = 30 [GAMEPLAY] ; 游戏模式 game_mode = survival ; 同时上线人数 max_players = 100 ; 是否能痛击队友 pvp = false ; 没人世界自动暂停 pause_when_empty = true vote_kick_enabled = false [STEAM] steam_group_only = false steam_group_id = 0 steam_group_admins = false [MISC] ; 控制台开 console_enabled = true ; 回档最大天数 30天 max_snapshots = 30 ; 这里后面的全部别动 ; ==================================================================== ; STOP! Don't change configs below unless you know what you are doing. ; ==================================================================== [SHARD] shard_enabled = true bind_ip = 127.0.0.1 master_ip = 127.0.0.1 master_port = 10998 cluster_key = MsAhBOXhhnElO5IPKr4G ``` 至此可以再次启动了,你可以删除当前容器从头再创建,我这里简单点直接重启 ```shell # 启动容器 docker start dstserver # 查看日志 docker logs -f dstserver ``` 如果日志的最后停在这里,就说明成功了 ```shell [00:00:41]: [SyncWorldSettings] applying temperaturedamage = nonlethal from master shard. [00:00:41]: [SyncWorldSettings] applying spawnmode = fixed from master shard. [00:00:41]: [SyncWorldSettings] applying lessdamagetaken = always from master shard. [00:00:41]: [SyncWorldSettings] applying ghostenabled = always from master shard. [00:00:41]: [SyncWorldSettings] applying shadowcreatures = rare from master shard. [00:00:41]: [SyncWorldSettings] applying resettime = none from master shard. [00:00:41]: [SyncWorldSettings] applying krampus = default from master shard. [00:00:41]: [SyncWorldSettings] applying ghostsanitydrain = none from master shard. [00:00:41]: [SyncWorldSettings] applying healthpenalty = none from master shard. [00:00:41]: [SyncWorldSettings] applying dropeverythingondespawn = default from master shard. [00:00:41]: [SyncWorldSettings] applying darkness = nonlethal from master shard. [00:00:41]: [SyncWorldSettings] applying portalresurection = always from master shard. [00:00:41]: component hauntable already exists on entity 103713 - multiplayer_portal! scripts/prefabs/multiplayer_portal.lua:47 in (upvalue) OnGetPortalRez (Lua) <45-54> [00:00:41]: [SyncWorldSettings] applying brightmarecreatures = rare from master shard. [00:00:41]: [SyncWorldSettings] applying hunger = nonlethal from master shard. [00:00:41]: [SyncWorldSettings] applying basicresource_regrowth = none from master shard. [00:00:42]: [Shard] secondary shard LUA is now ready! [00:00:42]: Sim paused ``` <br> **恭喜第一阶段大胜利!!!** 到游戏里搜你自己房间名即可开始游戏 <br> 接下来讲讲存档和mod 估计有的小伙伴已经有一个玩了很久的世界,不想因为搭私服从头在玩,想移植旧存档到私服,这是可以实现的,就是坑略多,索性我已经解决了 **恢复存档** **强调!存档环节,无论线上线下的存档,都必须操作一步备份一步,否则万一你操作失误,存档丢了,就很可能找不到了,备份的方法就是复制一份到别的地方,万一乱了, 就粘贴回来覆盖** 正式开始 首先你需要找到旧存档位置 `steam云存档`一般在这里 `C:\Users\用户名\Documents\Klei\DoNotStarveTogether\一串数字\CloudSaves\一串字母加数字\` 如果你很多存档,那 `CloudSaves` 下面就有多个 `一串字母加数字` 进入文件夹打开 `cluster.ini` 就可以看到世界名称,就知道你要恢复哪个存档了(本教程仅限1个) 本地存档我这里也妹油啊,你自己百度下存档位置找找吧 云存档需要把`Caves.zip`和`Master.zip`解压缩到xxx文件夹 最终得到2个文件夹1个文件 其中Caves是地下世界存档,Master是地上世界存档,ini是配置文件 ```shell 目录/ ├── Caves/ ├── Master └── cluster.ini ``` 到云主机的这个目录也能看到这3个文件文件夹 `/root/docker/dstserver/DoNotStarveTogether/Cluster_1` 先移植 `cluster.ini` 对比2边的自己合并下,模板我前文发过了不重复发了 就叫 房间配置文件 然后Caves和Master思路是一样的,对比里面的`server.ini`和服务器分别地上地下里的`server.ini`对比合并,可能有人会问,怎么对比,哪些用docker里默认房间的,哪些用我本地存档的?这个答案只能是临场发挥加反复调试,根据我的经验,应该是这样的。 端口号相关的,比如 `server_port = 10999` 再比如 `master_server_port = 12347` 这些带port端口的,一律用线上默认的docker里默认的那个配置,其余用你自己电脑里的steam云存档解压出来的配置。 合并完,保存到你本地的2个`server.ini` 最终把服务器的Caves和Master文件夹删掉 把本地的同名文件夹上传替换掉 <br> **到这里存档就恢复好了 大功告成!!** **记得所有操作开始之前都要备份!!** **数据无价!!** PS MOD部分往后翻 最后会说 <br> 再补充错误示范: 这一步我整整调试了2天,我当时是直接删服务器的Caves和Master,直接把本地的2个对应文件夹放线上了里面配置一点没改 **然后游戏是能进,但地洞被封条封住了,点了也下不去地下世界,而且还不能暂停,点暂停1秒后世界时间会继续走,烦死** 查看控制台报错如下 `Connection to master failed. Waiting to reconnect...` 重复这一段报错 ```shell [00:02:09]: About to start a shard with these settings: [00:02:09]: ShardName: Caves [00:02:09]: ShardID: 3621669375 [00:02:09]: ShardRole: SECONDARY [00:02:09]: MasterHost: 127.0.0.1 [00:02:09]: MasterBind: (null) [00:02:09]: MasterPort: 10998 [00:02:09]: [Shard] Connecting to master... [00:02:19]: [Shard] Connection to master failed. Waiting to reconnect... [00:02:24]: About to start a shard with these settings: [00:02:24]: ShardName: Caves [00:02:24]: ShardID: 3621669375 [00:02:24]: ShardRole: SECONDARY [00:02:24]: MasterHost: 127.0.0.1 [00:02:24]: MasterBind: (null) [00:02:24]: MasterPort: 10998 [00:02:24]: [Shard] Connecting to master... ``` 百度一下午,某404网站,github都找了,很多很多人遇到,没有一个人给有效的解决方案,都说是配置文件错了。。。 根据我自己测试发现,就是2个server.ini文件,中的端口不能改,如果要改就大改了,因为本地的2个server.ini的port是steam里的,其余代码又是docker的,肯定对不上了。 所以答案就是保留docker生成的Caves和Master中的server.ini中的port字段的端口号,其余字段和其余文件都可以用本地steam存档里的,合并线上和本地的server.ini,多调试几次到不报错为止。 **服务器MOD** 到服务器这个位置 `/root/docker/dst-server/DoNotStarveTogether/Cluster_1/mods` 有个lua文件 `dedicated_server_mods_setup.lua` 就是自动安装配置服务器mod 打开以后里面已经有一个例子了 `ServerModSetup("350811795")` 这里的数字就是 mod ID ID获取方法 到创意工坊 已订阅的MOD 进详情页 右击 复制URL 找地方粘贴URL 就可以看到末尾的数字 数字就是id **注意这里最好只放服务器MOD,别把本地MOD也安装到服务器** 如果有多个就回车继续写 我最终写出来是这样的 ```lua ServerModSetup("666155465") ServerModSetup("1185229307") ServerModSetup("1595631294") ServerModSetup("1898292532") ServerModSetup("1216718131") ServerModSetup("2577742416") ServerModSetup("1207269058") ServerModSetup("2823530744") ``` 到此MOD也大功告成了 记得换存档和装MOD都需要先停止docker容器,进行操作,完了再启动docker ```shell docker stop dstserver docker start dstserver # 再查看下启动控制台 docker logs -f dstserver # 看完日志想退出按ctrl + c强制退出logs ``` 最终效果如图,云主机可以24小时开机,只要世界有人就会启动时间,所有人退出时间自动暂停 ![](/api/file/getImage?fileId=63e60372da7405001301cab1) 如需回档则需要房主用饥荒内的控制台输入命令 ```shel # 房主在饥荒内 按 ~ 键 进入控制台 # 1代表天数 往前倒数第一个存档就是当天早上 就是1 昨天就是2 前天就是3 以此类推 c_rollback(1) ``` 如果只想回当天早上,按暂停,然后房间命令里也有一个回档按钮,是只能回当天早上 ## END 至此折腾完成 如果你已经决定用专服玩下去了,请注意没了steam的云存档,没了你自己本地的存档,所有存档就在你这台云主机里继续下去,如果出现灾难性问题(概率0.001%),会永久失去存档,解决方法就是写个shell脚本每天压缩备份一份存档到服务器指定位置,再自己定期去复制出来到一个可靠的地方长期保存! <br> 到这里估计已经没人看了 讲点无关紧要乱七八糟的东西 <br> 我必须吐槽一下 百度你个ZZ! 一搜一大堆,看着都挺像,点进去99.99%TMD都是假的,故弄玄虚,说话说一半,一堆饥荒内容缝合成一篇文章,缝合的时候还丢失了大量关键内容,浪费我大半天时间。 同样的关键字拿到某404网站搜,相关性就高了很多,至少是真人在问问题,真人在想办法解决问题,虽然最后也没解决血压飙升,但大概确定了问题的解决方向和思路,至少有点进度 <br> 所以做这个专服的意义是什么呢 对我来说最大的意义就是折腾!生命在于折腾!玩饥荒和写代码都是为了折腾!乐此不疲! 其实到底网速快了没呢?答:体感差不多,腾讯'轻量云'没有'标准云'主机网好,更不如贵出血的阿里云,所以玩1小时也有一两次忽然卡一下。只能说稳定了不少,以前进地洞还会失败,4个小伙伴就永远有1~2人说卡的没法玩,每次要花1小时找人凑人数花1小时调试到大家都能玩,最后都没多少时间玩了。现在24小时有云服务器,大家连进来几秒钟,而且体验差不多,折腾半天为的就是这份稳定。 送人玫瑰,手留余香 赞赏 Wechat Pay Alipay 关于利用 Github 实现 Jsdelivr 免费 CDN 教程 JavaScript CSV 下载 IP Long转字符串 天数转日期等