blob: dfadbc39ff627cd7505ecc57005ec85d161a1b1f [file] [log] [blame]
Sergiusz Bazanskid1ccdcf2020-05-06 20:34:06 +02001local kube = import "../../../kube/kube.libsonnet";
Rafał Hirsz12ab93a2020-05-16 21:02:52 +02002local defaultWorldguardConfig = import "worldguard.libsonnet";
Sergiusz Bazanskid1ccdcf2020-05-06 20:34:06 +02003
4{
5 local minecraft = self,
6 versions:: {
Serge Bazanskibbb16232020-08-01 12:04:04 +02007 "spigot-1.16.1": "registry.k0.hswaw.net/q3k/minecraft:spigot-1.16.1-r2",
8 "paper-1.16.1": "registry.k0.hswaw.net/q3k/minecraft:paper-1.16.1-r2",
Serge Bazanski91733332020-12-06 18:57:51 +01009 "paper-1.16.4": "registry.k0.hswaw.net/q3k/minecraft:paper-1.16.4-r1",
Serge Bazanski4afed982021-07-21 14:40:49 +000010 "paper-1.16.5": "registry.k0.hswaw.net/q3k/minecraft:paper-1.16.5-r2",
Sergiusz Bazanskid1ccdcf2020-05-06 20:34:06 +020011 },
12 server(name, version):: {
13 local server = self,
14 name:: name,
15 version:: version,
16 image:: minecraft.versions[server.version],
Serge Bazanski4afed982021-07-21 14:40:49 +000017 worldedit:: true,
18 overviewer:: true,
Sergiusz Bazanskid1ccdcf2020-05-06 20:34:06 +020019
20 metadata:: {
21 namespace: "minecraft",
22 },
23
24 componentName(component):: "%s-%s" % [server.name, component],
25
26 properties:: {
27 "spawn-protection": 16,
28 "max-tick-time": 60000,
29 "query.port": 25565,
30 "generator-settings": "",
31 "force-gamemode": false,
32 "allow-nether": true,
33 "enforce-whitelist": false,
34 "gamemode": "survival",
35 "broadcast-console-to-ops": true,
36 "enable-query": false,
37 "player-idle-timeout": 0,
38 "difficulty": "easy",
39 "broadcast-rcon-to-ops": true,
40 "spawn-monsters": true,
41 "op-permission-level": 4,
42 "pvp": true,
43 "snooper-enabled": true,
44 "level-type": "default",
45 "hardcore": false,
46 "enable-command-block": false,
47 "network-compression-threshold": 256,
48 "max-players": 20,
49 "max-world-size": 29999984,
50 "resource-pack-sha1": "",
51 "function-permission-level": 2,
52 "rcon.port": 25575,
53 "server-port": 25565,
54 "debug": false,
55 "server-ip": "",
56 "spawn-npcs": true,
57 "allow-flight": false,
58 "level-name": "world",
59 "view-distance": 10,
60 "resource-pack": "",
61 "spawn-animals": true,
62 "white-list": false,
63 "rcon.password": "",
64 "generate-structures": true,
65 "online-mode": true,
66 "max-build-height": 256,
67 "level-seed": "",
68 "prevent-proxy-connections": false,
69 "use-native-transport": true,
70 "motd": "A Minecraft Server",
71 "enable-rcon": false,
72 },
73
Rafał Hirsz12ab93a2020-05-16 21:02:52 +020074 worldguardConfig:: defaultWorldguardConfig,
75
Serge Bazanski4afed982021-07-21 14:40:49 +000076 startSteps:: [
77 ] + (if server.worldedit then [
78 "mkdir -p plugins/WorldGuard",
79 "cp /home/minecraft/worldedit-*.jar plugins",
80 "cp /home/minecraft/worldguard-*.jar plugins",
81 "cp /home/minecraft/config/worldguard_config.yaml plugins/WorldGuard/config.yml",
82 ] else []),
83
Sergiusz Bazanskid1ccdcf2020-05-06 20:34:06 +020084 startsh:: |||
85 #!/usr/bin/env bash
86 cd /home/minecraft/world
87 cp /home/minecraft/config/server.properties .
Serge Bazanskibbb16232020-08-01 12:04:04 +020088 cp /home/minecraft/server.jar .
Sergiusz Bazanskid1ccdcf2020-05-06 20:34:06 +020089 echo "eula=true" > eula.txt
Serge Bazanski4afed982021-07-21 14:40:49 +000090 %s
Sergiusz Bazanskid1ccdcf2020-05-06 20:34:06 +020091
92 bash /home/minecraft/config/overviewer.sh &
Serge Bazanskibbb16232020-08-01 12:04:04 +020093 exec java -Xmx4G -Xms4G -jar server.jar
Serge Bazanski4afed982021-07-21 14:40:49 +000094 ||| % [std.join("\n", server.startSteps)],
Sergiusz Bazanskid1ccdcf2020-05-06 20:34:06 +020095
96 overviewersh:: |||
97 #!/usr/bin/env bash
98 mkdir -p overviewer/world
99 sleep 60
100 while true; do
101 echo "Rendering Overviewer map..."
102 overviewer.py -p 1 --rendermodes=normal,lighting,smooth-lighting,cave world overviewer/world
103 echo "Done."
104 sleep 900
105 done
106 |||,
107
108 secretProperties: kube.Secret(server.componentName("properties")) {
109 metadata+: server.metadata,
110 data: {
111 local properties = std.join("\n", ["%s=%s" % [k, std.toString(server.properties[k])] for k in std.objectFields(server.properties)]),
112 "server.properties": std.base64(properties),
Serge Bazanski4afed982021-07-21 14:40:49 +0000113 "start.sh": std.base64(server.startsh),
114 } + (if server.worldedit then {
Rafał Hirsz12ab93a2020-05-16 21:02:52 +0200115 local worldguardConfig = std.manifestYamlDoc(server.worldguardConfig),
116 "worldguard_config.yaml": std.base64(worldguardConfig),
Serge Bazanski4afed982021-07-21 14:40:49 +0000117 } else {} )+ (if server.overviewer then {
Sergiusz Bazanskid1ccdcf2020-05-06 20:34:06 +0200118 "overviewer.sh": std.base64(server.overviewersh),
Serge Bazanski4afed982021-07-21 14:40:49 +0000119 } else {}),
Sergiusz Bazanskid1ccdcf2020-05-06 20:34:06 +0200120 },
121
122 worldVolume: kube.PersistentVolumeClaim(server.componentName("world")) {
123 metadata+: server.metadata,
124 spec+: {
125 storageClassName: "waw-hdd-redundant-3",
126 accessModes: ["ReadWriteOnce"],
127 resources: {
128 requests: {
129 storage: "10Gi",
130 },
131 },
132 },
133 },
134
135 deploy: kube.Deployment(server.componentName("deploy")) {
136 metadata+: server.metadata,
137 spec+: {
138 template+: {
139 spec+: {
140 volumes_: {
141 config: kube.SecretVolume(server.secretProperties),
142 world: kube.PersistentVolumeClaimVolume(server.worldVolume),
143 },
144 containers_: {
145 default: kube.Container("default") {
146 image: server.image,
147 command: [
148 "bash", "/home/minecraft/config/start.sh",
149 ],
150 volumeMounts_: {
151 config: { mountPath: "/home/minecraft/config" },
152 world: { mountPath: "/home/minecraft/world" },
153 },
154 ports_: {
155 minecraft: { containerPort: 25565 },
Sergiusz Bazanski7fa92b42020-05-18 01:06:07 +0200156 grpc: { containerPort: 2137 },
Sergiusz Bazanskid1ccdcf2020-05-06 20:34:06 +0200157 },
158 resources: {
159 requests: {
160 memory: "6G",
161 cpu: "2",
162 },
163 limits: {
164 memory: "6G",
165 cpu: "4",
166 },
167 },
168 },
Serge Bazanski4afed982021-07-21 14:40:49 +0000169 bridge: kube.Container("bridge") {
170 image: "registry.k0.hswaw.net/q3k/minecraft-hscloud-bridge:20200518c",
171 command: [
172 "/personal/q3k/minecraft/plugin/hscloud/bridge/bridge",
173 "-plugin", "127.0.0.1:2137",
174 ],
175 ports_: {
176 bridge: { containerPort: 8081 },
177 },
178 },
179 } + (if server.overviewer then {
Sergiusz Bazanskid1ccdcf2020-05-06 20:34:06 +0200180 overviewer: kube.Container("overviewer") {
181 image: "halverneus/static-file-server:v1.8.0",
182 env_: {
183 FOLDER: "/home/minecraft/world/overviewer/world",
184 },
185 volumeMounts_: {
186 world: { mountPath: "/home/minecraft/world" },
187 },
188 ports_: {
189 web: { containerPort: 8080 },
190 },
191 },
Serge Bazanski4afed982021-07-21 14:40:49 +0000192 } else {}),
Sergiusz Bazanskid1ccdcf2020-05-06 20:34:06 +0200193 },
194 },
195 },
196 },
197
198 svc: kube.Service(server.componentName("svc")) {
199 metadata+: server.metadata,
200 target_pod:: server.deploy.spec.template,
201 spec+: {
202 ports: [
203 { name: "minecraft", port: 25565, targetPort: 25565, protocol: "TCP" },
204 { name: "web", port: 80, targetPort: 8080, protocol: "TCP" },
Sergiusz Bazanskif3169322020-05-18 23:47:37 +0200205 { name: "bridge", port: 8080, targetPort: 8081, protocol: "TCP" },
Sergiusz Bazanski7fa92b42020-05-18 01:06:07 +0200206 { name: "grpc", port: 2137, targetPort: 2137, protocol: "TCP" },
Sergiusz Bazanskid1ccdcf2020-05-06 20:34:06 +0200207 ],
208 type: "LoadBalancer",
209 externalTrafficPolicy: "Local",
210 },
211 },
212 },
213
214 ns: kube.Namespace("minecraft"),
215
216 q3k: {
Serge Bazanski4afed982021-07-21 14:40:49 +0000217 "nova-arcana": minecraft.server("q3k-nova-arcana", "paper-1.16.5") {
218 overviewer: false,
219 worldedit: false,
Sergiusz Bazanskid1ccdcf2020-05-06 20:34:06 +0200220 properties+: {
Serge Bazanski4afed982021-07-21 14:40:49 +0000221 motd: "Nova Arcana V1.1.4",
222 //"enforce-whitelist": true,
223 "enable-rcon": "true",
224 "rcon.password": "dupa.8",
Sergiusz Bazanskid1ccdcf2020-05-06 20:34:06 +0200225 },
Serge Bazanski4afed982021-07-21 14:40:49 +0000226 startSteps+: [
227 |||
228 if [ ! -e world/map-installed.txt ]; then
229 set -e -x
230 mkdir -p world
231 cd world
232 rm -rf *
233 wget https://object.ceph-waw3.hswaw.net/q3k-personal/f1a73ad0518a2629a5bed072a7de4e4534a3c89705d6cea2f203a05cccd01634.zip -O map.zip
234 unzip -o map.zip
235 mv Untold*/* .
236 rm -rf Untold*
237 rm map.zip
238 touch map-installed.txt
239 ls -la
240 cd ..
241 set +e +x
242 fi
243 |||
244 ],
Sergiusz Bazanskid1ccdcf2020-05-06 20:34:06 +0200245 },
246 },
247}