前因:在尝试搭建grasscutter过程中,网上的教程要么太旧了,要么就是采集别人,甚至图片都没采集上。再要么就是不符合我的使用情况,故在结合教程以及摸索的过程中,记下自己linux宝塔面板部署grasscutter的过程。并列出我出现的问题
至于grasscutter是什么,我就不多说了,dddd
一、安装必备软件
我的系统是centos7.9,默认python好像是2.5.x,需要安装3以上的,就直接在宝塔python项目安装了python3.9.20

安装完成后需将默认python命令从python2替换成python3,具体python路径旁边的命令行管理版本,然后在终端执行下列命令,同时pip命令也需要从2替换成3。
说实话,我也不知道python是不是必须安装的,只知道java和mongodb是必装的,在尝试部署的时候可以跳过安装python试试
sudo ln -s /www/server/pyporject_evn/versions/3.9.20/bin/python3.9 /usr/bin/python
ln: 无法创建符号链接"/usr/bin/python": 文件已存在 ##中间可能会提醒文件已存在
[root@VM-12-8-centos 2.8-Grasscutter]# rm -rf /usr/bin/python ##删除掉即可
[root@VM-12-8-centos 2.8-Grasscutter]# sudo ln -s /www/server/pyporject_evn/versions/3.9.20/bin/python3.9 /usr/bin/python
sudo ln -s /www/server/pyporject_evn/versions/3.9.20/bin/pip3.9 /usr/bin/pip
替换完成后输入 python -V以及pip -V 查看版本替换成功没
[root@VM-12-8-centos 2.8-Grasscutter]# python -V
Python 3.9.20
[root@VM-12-8-centos 2.8-Grasscutter]# pip -V
pip 24.3.1 from /www/server/pyporject_evn/versions/3.9.20/lib/python3.9/site-packages/pip (python 3.9)
我的对我yum命令有影响,就又恢复成python2了
ln -sf /usr/bin/python2 /usr/bin/python
安装jdk-17,宝塔面板内置java环境一键安装,在宝塔面板--网站--java项目安装即可,如下图
这里我不记得我java有没有做单独的环境变量了,如果直接输入java报错或者提示没有这个命令,则需要执行下列命令
sudo ln -s /www/server/java/jdk-17.0.8/bin/java /usr/bin/java ##前面的路径根据你java安装的实际路径来,别一股脑照抄

安装mongodb,直接在应用市场搜索就行,这里就不截图了。安装完成之后,也需要设置下变量,具体如下。不需要设置安全认证,免得过于麻烦,还容易出一些不必要的bug
sudo ln -s /www/server/mongodb/bin/mongosh /usr/bin/mongo
二、安装项目文件
前往github@grasscutter项目下载关键文件,我下载了grasscutter-1.7.4.jar,keystore.p12,然后前往@opencommand-plugin下载opencommand-1.7.0.jar。这个opencommand好像是远程控制插件,但是跟grasscutter1.7.4好像不兼容,用不了,不强制要求安装。
前往gitlab@GC Resources下载里面的4.0Resources,记得根据你grasscutter的游戏版本下载对应的resources,我之前就是缺少resource导致的报错,因为Resource资源得自己找,官网提供的好像都已经失效了,所以这一步我卡了好久。具体报错内容如下
[root@VM-12-8-centos Grasscutter]# java -jar grasscutter-1.7.0.jar
19:42:46 <INFO:Grasscutter> Loading Grasscutter...
19:42:49 <INFO:ResourceLoader> 正在加载 resources...
19:42:49 <WARN:DataLoader> Failed to create gacha mappings.
com.google.gson.JsonSyntaxException: java.lang.NumberFormatException: For input string: "Value_OnceCount"
19:42:50 <INFO:Grasscutter> 正在启动 Grasscutter...
19:42:50 <INFO:Grasscutter> 游戏版本:4.0.0
19:42:50 <INFO:Grasscutter> Grasscutter 版本:1.7.0-89efa35f8
19:42:51 <WARN:PluginManager> 🇺🇸Plugin opencommand-1.7.0.jar is using API version 2, while the server is using API version 3.
19:42:51 <INFO:ResourceLoader> 正在加载 resources...
19:42:51 <WARN:HttpServer> [Dispatch] 无法连接路由
java.lang.Exception: Script loader already initialized
at emu.grasscutter.scripts.ScriptLoader.init(ScriptLoader.java:45)
at emu.grasscutter.data.ResourceLoader.loadAll(ResourceLoader.java:87)
at emu.grasscutter.utils.lang.Language.loadTextMaps(Language.java:369)
at emu.grasscutter.utils.lang.Language.loadTextMaps(Language.java:322)
at emu.grasscutter.utils.lang.Language.getTextMapKey(Language.java:312)
at emu.grasscutter.utils.lang.Language.getTextMapKey(Language.java:317)
at emu.grasscutter.tools.Tools.createGachaMappingJsons(Tools.java:217)
at emu.grasscutter.server.http.documentation.GachaMappingRequestHandler.<init>(GachaMappingRequestHandler.java:14)
at emu.grasscutter.server.http.documentation.DocumentationServerHandler.applyRoutes(DocumentationServerHandler.java:11)
at emu.grasscutter.server.http.HttpServer.addRouter(HttpServer.java:146)
at emu.grasscutter.Grasscutter.main(Grasscutter.java:140)
19:42:51 <INFO:ResourceLoader> 正在加载 resources...
Exception in thread "main" java.lang.Exception: Script loader already initialized
at emu.grasscutter.scripts.ScriptLoader.init(ScriptLoader.java:45)
at emu.grasscutter.data.ResourceLoader.loadAll(ResourceLoader.java:87)
at emu.grasscutter.Grasscutter.main(Grasscutter.java:157)

在下载完必须的文件之后,具体存放目录如下,我新建了一个4.0-Grasscutter文件夹,专门用于存放相应项目文件。
| keystore.p12
| grasscutter-1.7.4.jar
├─plugins
| opencommand-1.7.0.jar
└─Resources
三、修改配置文件并执行
第一次执行命令
java -jar grasscutter-1.7.4.jar
执行命令后会自动生成一些文件和目录,重点是其中的config.json文件,修改其中部分内容,注意配置文件未完整举例,不要直接复制并覆盖自己的配置文件
{
"folderStructure": {
"resources": "./resources/",
"data": "./data/",
"packets": "./packets/",
"scripts": "resources:Scripts/",
"plugins": "./plugins/",
"cache": "./cache/"
},
"databaseInfo": {
"server": {
"connectionUri": "mongodb://localhost:27017",
"collection": "grasscutter_4_0" ##数据库名,我搭了多个版本,就标记了
},
"game": {
"connectionUri": "mongodb://localhost:27017",
"collection": "grasscutter_4_0" <strong>##数据库名,我搭了多个版本,就标记了</strong>
}
},
"language": {
"language": "zh_CN",
"fallback": "en_US",
"document": "EN"
},
"account": {
"autoCreate": false,
"EXPERIMENTAL_RealPassword": false,
"defaultPermissions": [],
"maxPlayer": -1
},
"server": {
"debugWhitelist": [],
"debugBlacklist": [],
"runMode": "HYBRID",
"logCommands": false,
"fastRequire": true,
"http": {
"startImmediately": false,
"bindAddress": "0.0.0.0",
"bindPort": 4433, ##对外端口,因为我443在用,就改成了别的
"accessAddress": "43.153.194.149", ##改成自己的外网ip,到时候客户端连接要用
"accessPort": 0,
"encryption": {
"useEncryption": false, ##原本是TRUE,改成false
"useInRouting": false, ##原本是TRUE,改成false
"keystore": "./keystore.p12",
"keystorePassword": "123456"
},
"policies": {
"cors": {
"enabled": true,
"allowedOrigins": [
"*"
]
}
},
"files": {
"indexFile": "./index.html",
"errorFile": "./404.html"
}
},
"game": {
"bindAddress": "0.0.0.0",
"bindPort": 22102,
"accessAddress": "43.153.194.149", ##改成外网ip
"accessPort": 0,
"useUniquePacketKey": true,
"loadEntitiesForPlayerRange": 300,
"enableScriptInBigWorld": true,
"enableConsole": true,
"kcpInterval": 20,
"logPackets": "NONE",
"isShowPacketPayload": false,
"isShowLoopPackets": false,
"cacheSceneEntitiesEveryRun": false,
"gameOptions": {
"inventoryLimits": {
"weapons": 2000,
"relics": 2000,
"materials": 2000,
"furniture": 2000,
"all": 30000
},
改完保存之后,第二次执行
java -jar grasscutter-1.7.4.jar
如果正常运行,会有如下提示,如果不正常,就自行百度吧,我也没遇到过其他报错
[root@VM-12-8-centos 4.0-Grasscutter]# java -jar grasscutter-1.7.4.jar
10:18:52 Loading Grasscutter…
10:18:53 正在启动 Grasscutter…
10:18:53 游戏版本:4.0.0
10:18:53 Grasscutter 版本:1.7.4-5ebad71e9
10:18:54 正在加载插件:opencommand-plugin
10:18:55 正在加载 resources…
10:19:06 完成加载 resources
10:19:06 [Dispatch] Dispatch 服务器启动于 43.153.194.149:4433
10:19:06 Grasscutter 是免费开源软件,遵循 AGPL-3.0 license。
如果你是付费购买的,那你已经被骗了。
项目地址:https://github.com/Grasscutters/Grasscutter
10:19:06 游戏服务器启动于 43.153.194.149:22102
10:19:06 启用插件:opencommand-plugin
10:19:06 [OpenCommand] Enabled. https://github.com/jie65535/gc-opencommand-plugin
10:19:06 加载完成!输入 "help" 查看命令列表
这个时候就可以通过客户端访问43.153.194.149:4433来连上服务器了,同时在浏览器访问43.153.194.149:4433也会提示“欢迎使用 Grasscutter!”
注意:这里可以输入stop和退出命令行关闭私服。下一步就是account create <name> <UID> 创建玩家。如果想要长期保持活动和在线状态,可以在宝塔面板里面新建java项目将这个项目长期保持在后台,就不用命令行一直保持着,具体如下

注意要用root执行,www用户权限不够。这样也有一个缺点。就是无法通过控制台执行命令,建议在命令行执行创建用户命令,然后用宝塔挂后台。然后其他命令用GrasscutterCommandGenerator在游戏内执行命令来获取物品啥的,GrasscutterCommandGenerator界面如下图

四、总结
grasscutter部署说简单也简单,说复杂也复杂,简单的是不用啥开发基础,难的是容易出现一些报错并且不知道该怎么处理,该问谁,只能自己一点点摸索,下一步就是windows客户端食用教程,后面会写。再后面就是卡池编辑,活动编辑之类一些高阶的了,我暂时也不会,后面再看吧
最后附上几个在我服务器能够运行的几个版本,可以下载下来自测,配置文件中的ip地址记得改
阿里云盘2.6:https://www.alipan.com/s/xSVtVrxvWDx 密码:am94
阿里云盘2.8:https://www.alipan.com/s/dwFdKpdw5CP 密码:sa51
阿里云盘4.0:https://www.alipan.com/s/4wsBxCmYi4Q 密码:2b9u
哦对,grasscutter好像就更新到4.0,如果需要玩高版本比如5.0的,就得再找其他的,比如@Kei-Luna的LunaGC_5.0.0和@XeonSucksLAB的UnknownAnimeGamePS
鸣谢:
@荼蘼博客
grasscutter官方频道@discord
叨叨几句... NOTHING