使用docker搭建游戏服务器

使用docker搭建服务器

前置条件:

  • 当然先要安装docker
  • 自己编译或其他地方获得的grasscutter.jar
  • resources

创建docker network

对docker统一管理,mongodb不对外提供端口,更加安全

1
2
3
4
#创建
docker network create genshin
#查看已创建的
docker net work ls

创建mongodb容器

1
2
3
4
5
6
7
8
9
10
11
12
docker pull mongo:latest

#在物理机创建目录
mkdir -p /mydocker/mongodb/data

# 创建容器,容器名mongodb;网络为创建的genshin;
# -v表示宿主机路径:容器路径;-h表示hostname;
# 最后指定镜像mongo
docker run -itd --name mongodb --network genshin -v /mydocker/mongodb/data:/data/db -h genshin_mongo mongo

#设置重启docker容器自动启动
docker update mongodb --restart=always

创建grasscutter

1
2
3
4
5
6
7
8
9
10
docker pull python                                # 拉取Python基础镜像
# 创建容器,容器名grasscutter;网络为创建的genshin;
# -p表示端口映射,这里将默认的443端口改为999或其他,避免占用;
# -h表示hostname;最后指定镜像python
docker run -itd --name grasscutter -v /mydocker/Grasscutter:/Grasscutter --network genshin -p 22102:22102/udp -p 999:999/tcp -h genshin_grasscutter python
iptables -I INPUT -p udp --dport 22102 -j ACCEPT # 放行22102端口的udp协议
iptables -I INPUT -p tcp --dport 999 -j ACCEPT # 放行666端口的tcp协议
docker update grasscutter --restart=always # 设置开机自启
docker exec -it grasscutter /bin/bash # 进入容器内部
cat /etc/issue # 查看系统版本(Debian GNU/Linux 11)

以下命令是在容器内执行的!

②「在该容器内安装常用软件包」

1
2
3
4
5
apt-get update                      # 更新apt-get
apt-get install sudo -y # 安装sudo
apt-get install wget -y # 安装wget
apt-get install curl -y # 安装curl
apt-get install vim -y # 安装vim

③「在该容器内安装 jdk-17」

1
2
3
4
sudo apt install openjdk-17-jdk -y  # 安装jdk17
sudo apt install openjdk-17-jre -y # 安装jre17
java -version # 检查版本
javac -version

我只安了jre也能启动

服务端资源

  • Grasscutter服务器仓库:

https://github.com/Grasscutters/Grasscutter

  • resource文件(来自第三方)

https://git.crepe.moe/grasscutters/Grasscutter_Resources

  • jar文件可以自己编译或者在仓库发布中找

将这些文件要放在grasscutter容器中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Grasscutter
├── src
├── lib
├── keystore.p12
├── plugin-schema.json
├── grasscutter-1.3.2-dev.jar
└── resources
├── BinOutput
├── ExcelBinOutput
├── Readable
├── Scripts
├── Subtitle
├── TextMap
└── QuestEncryptionKeys.json

初次执行,产生config.json

config.json含义说明:

  • 如果是本地运行,里面的两个 PublicIp 不用改;如果是在服务器运行,需要把两个 PublicIp 改为服务器的公网 IP。

  • server” 中的的 “bindPort”: 666 是用来处理登录、游戏更新的端口 (DispatchServer),默认的 443 服务器端口可能更容易出问题,比如国内可能需要备案才能使用,或者被 Nginx 等服务占用。且 Windows 服务器也可能会被 VMWare 的 Share 共享服务或者 Steam 占用,所以建议改为别的端口。改好后记得在安全组 / 防火墙放行该端口的 TCP 协议。

  • game” 中的 “bindPort”: 22102 是游戏服务器(GameServer)的端口,用来处理一些传送、伤害数值计算等信息,如果是在服务器部署的话记得在安全组 / 防火墙放开这个端口的 UDP 协议,防止出现 4206 错误无法进入游戏。

  • welcomeMessage”: “Welcome to Grasscutter!”, 这个是进服务器之后 Server 发给你的欢迎语句,可以改成 “欢迎来到 XXX 私服 “之类的。

  • KeystorePassword”: “123456”,证书文件的密码,不需要修改。

  • autoCreate”: true, 这个是控制自动创建账号的,改为 true 之后,如果登录私服的时候没有那个账号的话会自动创建一个并登录进去,然后分配默认的 uid,从 10001 开始往后顺延。

  • EXPERIMENTAL_RealPassword“: 实验性质的真・密码登录,在之前的版本中密码是形同虚设的

  • singlePlayerTeam”: 5 “multiplayerTeam”: 10, 联机队伍中最多角色数,更改之后可以切换联机数量。

  • mongodbip要改成monggo容器内的ip

1
2
#在宿主机使用以下命令获取
docker inspect 容器名 | grep IPAddress

配置文件例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
{
"folderStructure": {
"resources": "./resources/",
"data": "./data/",
"packets": "./packets/",
"scripts": "./resources/Scripts/",
"plugins": "./plugins/"
},
"databaseInfo": {
"server": {
"connectionUri": "mongodb://【mongodb容器内部IP】:27017",
"collection": "grasscutter"
},
"game": {
"connectionUri": "mongodb://【mongodb容器内部IP】:27017",
"collection": "grasscutter"
}
},
"language": {
"language": "zh_CN",
"fallback": "zh_CN",
"document": "CN"
},
"account": {
"autoCreate": true,
"EXPERIMENTAL_RealPassword": false,
"defaultPermissions": [],
"maxPlayer": -1
},
"server": {
"debugWhitelist": [],
"debugBlacklist": [],
"runMode": "HYBRID",
"logCommands": false,
"http": {
"bindAddress": "0.0.0.0",
"bindPort": 666,
"accessAddress": "【服务器IP】",
"accessPort": 666,
"encryption": {
"useEncryption": true,
"useInRouting": true,
"keystore": "./keystore.p12",
"keystorePassword": "123456"
},
"policies": {
"cors": {
"enabled": false,
"allowedOrigins": [
"*"
]
}
},
"files": {
"indexFile": "./index.html",
"errorFile": "./404.html"
}
},
"game": {
"bindAddress": "0.0.0.0",
"bindPort": 22102,
"accessAddress": "【服务器IP】",
"accessPort": 22102,
"loadEntitiesForPlayerRange": 100,
"enableScriptInBigWorld": true,
"enableConsole": true,
"kcpInterval": 20,
"logPackets": "NONE",
"gameOptions": {
"inventoryLimits": {
"weapons": 3000,
"relics": 3000,
"materials": 3000,
"furniture": 3000,
"all": 30000
},
"avatarLimits": {
"singlePlayerTeam": 5,
"multiplayerTeam": 10
},
"sceneEntityLimit": 1000,
"watchGachaConfig": false,
"enableShopItems": true,
"staminaUsage": false,
"energyUsage": false,
"fishhookTeleport": true,
"resinOptions": {
"resinUsage": true,
"cap": 160,
"rechargeTime": 1
},
"rates": {
"adventureExp": 1.0,
"mora": 1.0,
"leyLines": 1.0
}
},
"joinOptions": {
"welcomeEmotes": [
2007,
1002,
4010
],
"welcomeMessage": "欢迎来到<color=#66CCFF>青空的提瓦特</color>!",
"welcomeMail": {
"title": "欢迎来到 <color=#66CCFF>天空岛</color>服务器!",
"content": "你好,远渡星海的旅行者!\r\n这里是本白毛天理统治下的<color=red>提</color><color=green>瓦</color><color=blue>特</color>世界,所属<color=#66CCFF>天空岛</color>服务器。来体验一个特别的提瓦特吧!",
"sender": "白毛天理",
"items": [
{
"itemId": 13509,
"itemCount": 1,
"itemLevel": 1
},
{
"itemId": 201,
"itemCount": 99999,
"itemLevel": 1
},
{
"itemId": 11101,
"itemCount": 1000,
"itemLevel": 1
},
{
"itemId": 223,
"itemCount": 1000,
"itemLevel": 1
},
{
"itemId": 224,
"itemCount": 1000,
"itemLevel": 1
}
]
}
},
"serverAccount": {
"avatarId": 10000007,
"nameCardId": 210001,
"adventureRank": 60,
"worldLevel": 8,
"nickName": "白毛天理",
"signature": "天空岛之上,天理永存"
}
},
"dispatch": {
"regions": [],
"defaultName": "<color=#66CCFF>天空岛</color>服务器",
"logRequests": "NONE"
}
},
"version": 4
}

启动:

1
java -jar grasscutter

启动成功后直接关闭就行,不需要 nohup 指令,因为可能会造成性能和空间的消耗。
此时浏览器访问 https://ip:port 可以看到 Welcome to Grasscutter 的字样。

更新

覆盖grasscutter.jar和resource文件夹

config.json可能重新生成需要修改

服务器日常启动

1
2
3
4
#进入容器
docker exec -it grasscutter /bin/bash
#打开服务器
java -jar grasscutter.jar
1
2
3
4
#查看进程
ps -ef
#关闭服务器
kill [pid]

拓展:环境备份方法:

一、Docker 镜像备份法

生成本地镜像:

1
2
docker save -o [导出的镜像名.tar] [本地镜像名]:[镜像标签]
如:docker save -o /home/grasscutter-image.tar grasscutter:latest

使用本地镜像:

1
docker load -i [本地tar包文件] 

二、手动备份法

复制 Docker 内指定目录到宿主机:

1
docker cp grasscutter:/Grasscutter /Grasscutter

输出 MongoDB 数据库备份:

1
mongodump -o /home/mongodb/

恢复所有数据到数据库:

1
mongorestore /home/mongodb/

参考:https://air.moe/archives/803


使用docker搭建游戏服务器
https://www.kingdeworld.top/pages/2023/使用docker搭建游戏服务器
作者
Wanghzo
发布于
2023年1月14日
许可协议