Dstm项目完结
Dstm项目完结
Dstm全名Don’t Starve Together Manager,中文名饥荒联机版控制面板,基于docker实现,这个项目所有的内容由我独自一人完成,前前后后总共花费了接近三个月的时间,虽然钱有点少,但是收获还是蛮多的,于是写了这一篇文章记录一下。
历程
这个项目只是我在在校个人接的一个项目,所以没有严格的什么招标投标的流程。甲方是一个体量不算大的云服务商(注册资金100万左右),以前在他们那边买过云服务器,他们主营业务是《我的世界》面板服务器和VPS,本人也算是他们的一个老客户了。4月初的时候来找我谈这个项目,想要拓展饥荒这款游戏的业务,最初提出的是想要做一款类似翼龙的面板,由于老板本身不了解技术,需求提的很模糊(让我明白沟通的重要性),并且我对于这款游戏也是没有任何游玩经验,4月份大部分时间都是在熟悉游戏相关的内容以及模组拓展部分,并且花了两个星期写了一个前端的demo展示给甲方看,这之后才正式谈妥。4月末5月初算是真正明确了项目的方向,最开始前端挑选了一个相当优秀的开源脚手架(Vben),内置了丰富的功能和组件,让我节省了大量的时间和精力,让我能够专注于后端代码的编写,后端项目是完全从零开始的,没有用其他的脚手架,所以花费的时间会更多一些,难度自然也就更大。
对于前端而言,虽然我主要学习方向是后端,以前多多少少学过前端的内容,虽然界面做出来算不上多美观,但是至少界面简洁,功能正常。以前在编写mc插件的时候用的最多的就是js,有着脚手架的加持和开源的UI组件库,对我而言整个前端开发的过程并没有遇到太大的阻挠。
后端是这个项目难度最大的点,面板需要管理一群docker虚拟容器,此前对于docker还仅停留在使用的程度,这是我从未接触过的领域,并且还要熟悉饥荒这款游戏的内容,模组,脚本等等,饥荒的游戏脚本大部分都是由lua编写的(还好以前了解过)。面对一堆的陌生的内容,在初期可以说是花费了大量的时间去查资料和学习(不得不感慨中文互联网信息实在太匮乏了),docker这部分有docker官方提供的Docker Engine API,饥荒这部分的资料来源是克雷官方的fortum论坛和百度贴吧论坛(贴吧老哥是真的强),以及一些饥荒有关的开源项目(感谢开源)。
到了写这篇文章的时候,项目功能已经全部完成,总计125个接口,只剩下最后的一点测试。一路过来也是挺不容易的,在推进项目的过程中还要兼容学校的课程,期末了还要考试,不过到最后还是在暑假初期结束这个项目。
技术栈
项目本身是前后端分离的,前端主要采用的vue3框架,后端采用go作为开发语言。
结构
前端
- 框架:Vue3
- 构建工具:Vite
- 开发语言:TypeScript
- 脚手架:Vben-amdin Github 开源地址
- Ajax:Axios
- 状态管理:pinia
- 路由:Vue-Router-Next
- UI组件库:Ant-Design-Vue
后端
- 开发语言:Go 1.20.2
- Http框架:Gin
- 数据库:Mysql,Redis
- ORM:GORM
- 认证:JWT
- 配置管理:viper
- 权限管理:casbin
- 日志框架:zap
- 定时任务:robfig/cron
数据库
mysql主要是用于存放一些结构化的信息,例如api权限表,用户信息,实例信息,策略信息以及端口映射等等,这个项目的表结构并不复杂,就七张表,
因为大部分信息都是直接从dockerapi中读取的,系统本身并不需要存放什么过多的数据。
redis主要用于存放一些非结构化的信息,系统分发的token和密钥,用于主动过期处理,另外还会存放每一个实例的模组下载信息,以及系统设置。redis数据格式相对mysql而言较为松散,没有那么严格的结构,项目均是采用json格式存放的redis数据。
主要难点
下面这些难点是困扰我比较久的,虽然每一个点描述的比较少,但实际上为了解决它们,我花费了相当多的时间去试错和测试。
实例资源限制
容器即实例,资源限制这一块是docker利用docker提供的支持,在最开始了解时,发现有两种方法,一种是使用devicemapper驱动的LVM,另一种是使用overlay2驱动的xfs文件系统的quota功能。项目选择了devicemapper,因为了解的早一些,不过docker官方在后续版本声明devicemapper驱动可能会停止维护了。
创意工坊模组
模组是这个游戏相当重要的一块功能,这部分主要是借助steamcmd和SteamWebApi来解决的,一部分模组会直接提供url以供下载,另一部分则需要使用steamcmd来进行下载。
模组信息解析
饥荒的模组都是由lua脚本编写的,项目采用了一个开源的由go编写的lua虚拟机,通过lua虚拟机来解析模组信息,将lua信息解析成go对象。
世界设置解析
这一部分应该算得上是最繁杂的了,最初想的是一个个手动维护配置项,但是多大两百个的配置项让人望而却步。后来需要去读取游戏文件的中的tex文件,将其转换成图片格式的文件,然后再读取游戏脚本以获取文本翻译和世界配置的每一个配置项。
服务端管理
一个饥荒服务器有两个服务端,地面服务端与洞穴服务端,使用screen进行管理,通过将预先编写好的管理脚本打包到镜像中,后续的管理就变得相当方便。