饥荒自建 Docker 专用服务器 折腾3天终于完美解决各种问题!
2023-02-10
阅读 {{counts.readCount}}
评论 {{counts.commentCount}}
## 前言
如题,最近沉迷饥荒捡垃圾无法自拔
但联机玩就会很卡,买加速器也会有其他小伙伴变卡顿
无意中看到可以自建服务器
这不巧了么,我刚好有服务器闲置中
百度出来的教程都是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小时有云服务器,大家连进来几秒钟,而且体验差不多,折腾半天为的就是这份稳定。