blob: c7493e031150c90980667f82be8a00124f7e6c3b [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",
Remigiusz Marcinkiewiczff79daa2021-07-21 15:51:59 +000011 "vanilla-1.16.5": "registry.k0.hswaw.net/enleth/minectaft:vanilla-1.16.5",
Sergiusz Bazanskid1ccdcf2020-05-06 20:34:06 +020012 },
13 server(name, version):: {
14 local server = self,
15 name:: name,
16 version:: version,
17 image:: minecraft.versions[server.version],
Serge Bazanski4afed982021-07-21 14:40:49 +000018 worldedit:: true,
19 overviewer:: true,
Sergiusz Bazanskid1ccdcf2020-05-06 20:34:06 +020020
21 metadata:: {
22 namespace: "minecraft",
23 },
24
25 componentName(component):: "%s-%s" % [server.name, component],
26
27 properties:: {
28 "spawn-protection": 16,
29 "max-tick-time": 60000,
30 "query.port": 25565,
31 "generator-settings": "",
32 "force-gamemode": false,
33 "allow-nether": true,
34 "enforce-whitelist": false,
35 "gamemode": "survival",
36 "broadcast-console-to-ops": true,
37 "enable-query": false,
38 "player-idle-timeout": 0,
39 "difficulty": "easy",
40 "broadcast-rcon-to-ops": true,
41 "spawn-monsters": true,
42 "op-permission-level": 4,
43 "pvp": true,
44 "snooper-enabled": true,
45 "level-type": "default",
46 "hardcore": false,
47 "enable-command-block": false,
48 "network-compression-threshold": 256,
49 "max-players": 20,
50 "max-world-size": 29999984,
51 "resource-pack-sha1": "",
52 "function-permission-level": 2,
53 "rcon.port": 25575,
54 "server-port": 25565,
55 "debug": false,
56 "server-ip": "",
57 "spawn-npcs": true,
58 "allow-flight": false,
59 "level-name": "world",
60 "view-distance": 10,
61 "resource-pack": "",
62 "spawn-animals": true,
63 "white-list": false,
64 "rcon.password": "",
65 "generate-structures": true,
66 "online-mode": true,
67 "max-build-height": 256,
68 "level-seed": "",
69 "prevent-proxy-connections": false,
70 "use-native-transport": true,
71 "motd": "A Minecraft Server",
72 "enable-rcon": false,
73 },
74
Rafał Hirsz12ab93a2020-05-16 21:02:52 +020075 worldguardConfig:: defaultWorldguardConfig,
76
Serge Bazanski4afed982021-07-21 14:40:49 +000077 startSteps:: [
78 ] + (if server.worldedit then [
79 "mkdir -p plugins/WorldGuard",
80 "cp /home/minecraft/worldedit-*.jar plugins",
81 "cp /home/minecraft/worldguard-*.jar plugins",
82 "cp /home/minecraft/config/worldguard_config.yaml plugins/WorldGuard/config.yml",
83 ] else []),
84
Sergiusz Bazanskid1ccdcf2020-05-06 20:34:06 +020085 startsh:: |||
86 #!/usr/bin/env bash
87 cd /home/minecraft/world
88 cp /home/minecraft/config/server.properties .
Serge Bazanskibbb16232020-08-01 12:04:04 +020089 cp /home/minecraft/server.jar .
Sergiusz Bazanskid1ccdcf2020-05-06 20:34:06 +020090 echo "eula=true" > eula.txt
Serge Bazanski4afed982021-07-21 14:40:49 +000091 %s
Sergiusz Bazanskid1ccdcf2020-05-06 20:34:06 +020092
93 bash /home/minecraft/config/overviewer.sh &
Serge Bazanskibbb16232020-08-01 12:04:04 +020094 exec java -Xmx4G -Xms4G -jar server.jar
Serge Bazanski4afed982021-07-21 14:40:49 +000095 ||| % [std.join("\n", server.startSteps)],
Sergiusz Bazanskid1ccdcf2020-05-06 20:34:06 +020096
97 overviewersh:: |||
98 #!/usr/bin/env bash
99 mkdir -p overviewer/world
100 sleep 60
101 while true; do
102 echo "Rendering Overviewer map..."
103 overviewer.py -p 1 --rendermodes=normal,lighting,smooth-lighting,cave world overviewer/world
104 echo "Done."
105 sleep 900
106 done
107 |||,
108
109 secretProperties: kube.Secret(server.componentName("properties")) {
110 metadata+: server.metadata,
111 data: {
112 local properties = std.join("\n", ["%s=%s" % [k, std.toString(server.properties[k])] for k in std.objectFields(server.properties)]),
113 "server.properties": std.base64(properties),
Serge Bazanski4afed982021-07-21 14:40:49 +0000114 "start.sh": std.base64(server.startsh),
115 } + (if server.worldedit then {
Rafał Hirsz12ab93a2020-05-16 21:02:52 +0200116 local worldguardConfig = std.manifestYamlDoc(server.worldguardConfig),
117 "worldguard_config.yaml": std.base64(worldguardConfig),
Serge Bazanski4afed982021-07-21 14:40:49 +0000118 } else {} )+ (if server.overviewer then {
Sergiusz Bazanskid1ccdcf2020-05-06 20:34:06 +0200119 "overviewer.sh": std.base64(server.overviewersh),
Serge Bazanski4afed982021-07-21 14:40:49 +0000120 } else {}),
Sergiusz Bazanskid1ccdcf2020-05-06 20:34:06 +0200121 },
122
123 worldVolume: kube.PersistentVolumeClaim(server.componentName("world")) {
124 metadata+: server.metadata,
125 spec+: {
126 storageClassName: "waw-hdd-redundant-3",
127 accessModes: ["ReadWriteOnce"],
128 resources: {
129 requests: {
130 storage: "10Gi",
131 },
132 },
133 },
134 },
135
136 deploy: kube.Deployment(server.componentName("deploy")) {
137 metadata+: server.metadata,
138 spec+: {
139 template+: {
140 spec+: {
141 volumes_: {
142 config: kube.SecretVolume(server.secretProperties),
143 world: kube.PersistentVolumeClaimVolume(server.worldVolume),
144 },
145 containers_: {
146 default: kube.Container("default") {
147 image: server.image,
148 command: [
149 "bash", "/home/minecraft/config/start.sh",
150 ],
151 volumeMounts_: {
152 config: { mountPath: "/home/minecraft/config" },
153 world: { mountPath: "/home/minecraft/world" },
154 },
155 ports_: {
156 minecraft: { containerPort: 25565 },
Sergiusz Bazanski7fa92b42020-05-18 01:06:07 +0200157 grpc: { containerPort: 2137 },
Sergiusz Bazanskid1ccdcf2020-05-06 20:34:06 +0200158 },
159 resources: {
160 requests: {
161 memory: "6G",
162 cpu: "2",
163 },
164 limits: {
165 memory: "6G",
166 cpu: "4",
167 },
168 },
169 },
Serge Bazanski4afed982021-07-21 14:40:49 +0000170 bridge: kube.Container("bridge") {
171 image: "registry.k0.hswaw.net/q3k/minecraft-hscloud-bridge:20200518c",
172 command: [
173 "/personal/q3k/minecraft/plugin/hscloud/bridge/bridge",
174 "-plugin", "127.0.0.1:2137",
175 ],
176 ports_: {
177 bridge: { containerPort: 8081 },
178 },
179 },
180 } + (if server.overviewer then {
Sergiusz Bazanskid1ccdcf2020-05-06 20:34:06 +0200181 overviewer: kube.Container("overviewer") {
182 image: "halverneus/static-file-server:v1.8.0",
183 env_: {
184 FOLDER: "/home/minecraft/world/overviewer/world",
185 },
186 volumeMounts_: {
187 world: { mountPath: "/home/minecraft/world" },
188 },
189 ports_: {
190 web: { containerPort: 8080 },
191 },
192 },
Serge Bazanski4afed982021-07-21 14:40:49 +0000193 } else {}),
Sergiusz Bazanskid1ccdcf2020-05-06 20:34:06 +0200194 },
195 },
196 },
197 },
198
199 svc: kube.Service(server.componentName("svc")) {
200 metadata+: server.metadata,
201 target_pod:: server.deploy.spec.template,
202 spec+: {
203 ports: [
204 { name: "minecraft", port: 25565, targetPort: 25565, protocol: "TCP" },
205 { name: "web", port: 80, targetPort: 8080, protocol: "TCP" },
Sergiusz Bazanskif3169322020-05-18 23:47:37 +0200206 { name: "bridge", port: 8080, targetPort: 8081, protocol: "TCP" },
Sergiusz Bazanski7fa92b42020-05-18 01:06:07 +0200207 { name: "grpc", port: 2137, targetPort: 2137, protocol: "TCP" },
Sergiusz Bazanskid1ccdcf2020-05-06 20:34:06 +0200208 ],
209 type: "LoadBalancer",
210 externalTrafficPolicy: "Local",
211 },
212 },
213 },
214
215 ns: kube.Namespace("minecraft"),
216
Serge Bazanskif0a38ba2021-07-21 14:56:25 +0000217 admins: minecraft.ns.Contain(kube.RoleBinding("admins")) {
218 roleRef: {
219 apiGroup: "rbac.authorization.k8s.io",
220 kind: "ClusterRole",
221 name: "system:admin-namespace",
222 },
223 subjects: [
224 kube.User("enleth@hackerspace.pl"),
225 ],
226 },
227
Sergiusz Bazanskid1ccdcf2020-05-06 20:34:06 +0200228 q3k: {
Remigiusz Marcinkiewiczff79daa2021-07-21 15:51:59 +0000229 "nova-arcana": minecraft.server("q3k-nova-arcana", "vanilla-1.16.5") {
Serge Bazanski4afed982021-07-21 14:40:49 +0000230 overviewer: false,
231 worldedit: false,
Sergiusz Bazanskid1ccdcf2020-05-06 20:34:06 +0200232 properties+: {
Serge Bazanski4afed982021-07-21 14:40:49 +0000233 motd: "Nova Arcana V1.1.4",
234 //"enforce-whitelist": true,
235 "enable-rcon": "true",
236 "rcon.password": "dupa.8",
Serge Bazanski3e5f4382021-07-21 17:21:55 +0000237 "enable-command-block": true,
Sergiusz Bazanskid1ccdcf2020-05-06 20:34:06 +0200238 },
Serge Bazanski4afed982021-07-21 14:40:49 +0000239 startSteps+: [
240 |||
241 if [ ! -e world/map-installed.txt ]; then
242 set -e -x
243 mkdir -p world
244 cd world
245 rm -rf *
246 wget https://object.ceph-waw3.hswaw.net/q3k-personal/f1a73ad0518a2629a5bed072a7de4e4534a3c89705d6cea2f203a05cccd01634.zip -O map.zip
247 unzip -o map.zip
248 mv Untold*/* .
249 rm -rf Untold*
250 rm map.zip
251 touch map-installed.txt
252 ls -la
253 cd ..
254 set +e +x
255 fi
256 |||
257 ],
Sergiusz Bazanskid1ccdcf2020-05-06 20:34:06 +0200258 },
259 },
260}