blob: e03bb523b3caaf191043e5c69643cc14d9859f04 [file] [log] [blame]
Sergiusz Bazanskid1ccdcf2020-05-06 20:34:06 +02001local kube = import "../../../kube/kube.libsonnet";
2
3{
4 local minecraft = self,
5 versions:: {
6 "spigot-1.15.2": "registry.k0.hswaw.net/q3k/minecraft:spigot-1.15.2-r2",
7 },
8 server(name, version):: {
9 local server = self,
10 name:: name,
11 version:: version,
12 image:: minecraft.versions[server.version],
13
14 metadata:: {
15 namespace: "minecraft",
16 },
17
18 componentName(component):: "%s-%s" % [server.name, component],
19
20 properties:: {
21 "spawn-protection": 16,
22 "max-tick-time": 60000,
23 "query.port": 25565,
24 "generator-settings": "",
25 "force-gamemode": false,
26 "allow-nether": true,
27 "enforce-whitelist": false,
28 "gamemode": "survival",
29 "broadcast-console-to-ops": true,
30 "enable-query": false,
31 "player-idle-timeout": 0,
32 "difficulty": "easy",
33 "broadcast-rcon-to-ops": true,
34 "spawn-monsters": true,
35 "op-permission-level": 4,
36 "pvp": true,
37 "snooper-enabled": true,
38 "level-type": "default",
39 "hardcore": false,
40 "enable-command-block": false,
41 "network-compression-threshold": 256,
42 "max-players": 20,
43 "max-world-size": 29999984,
44 "resource-pack-sha1": "",
45 "function-permission-level": 2,
46 "rcon.port": 25575,
47 "server-port": 25565,
48 "debug": false,
49 "server-ip": "",
50 "spawn-npcs": true,
51 "allow-flight": false,
52 "level-name": "world",
53 "view-distance": 10,
54 "resource-pack": "",
55 "spawn-animals": true,
56 "white-list": false,
57 "rcon.password": "",
58 "generate-structures": true,
59 "online-mode": true,
60 "max-build-height": 256,
61 "level-seed": "",
62 "prevent-proxy-connections": false,
63 "use-native-transport": true,
64 "motd": "A Minecraft Server",
65 "enable-rcon": false,
66 },
67
68 startsh:: |||
69 #!/usr/bin/env bash
70 cd /home/minecraft/world
71 cp /home/minecraft/config/server.properties .
72 cp /home/minecraft/spigot.jar .
73 echo "eula=true" > eula.txt
74
75 bash /home/minecraft/config/overviewer.sh &
76 exec java -Xmx4G -Xms4G -jar spigot.jar
77 |||,
78
79 overviewersh:: |||
80 #!/usr/bin/env bash
81 mkdir -p overviewer/world
82 sleep 60
83 while true; do
84 echo "Rendering Overviewer map..."
85 overviewer.py -p 1 --rendermodes=normal,lighting,smooth-lighting,cave world overviewer/world
86 echo "Done."
87 sleep 900
88 done
89 |||,
90
91 secretProperties: kube.Secret(server.componentName("properties")) {
92 metadata+: server.metadata,
93 data: {
94 local properties = std.join("\n", ["%s=%s" % [k, std.toString(server.properties[k])] for k in std.objectFields(server.properties)]),
95 "server.properties": std.base64(properties),
96 "start.sh": std.base64(server.startsh),
97 "overviewer.sh": std.base64(server.overviewersh),
98 },
99 },
100
101 worldVolume: kube.PersistentVolumeClaim(server.componentName("world")) {
102 metadata+: server.metadata,
103 spec+: {
104 storageClassName: "waw-hdd-redundant-3",
105 accessModes: ["ReadWriteOnce"],
106 resources: {
107 requests: {
108 storage: "10Gi",
109 },
110 },
111 },
112 },
113
114 deploy: kube.Deployment(server.componentName("deploy")) {
115 metadata+: server.metadata,
116 spec+: {
117 template+: {
118 spec+: {
119 volumes_: {
120 config: kube.SecretVolume(server.secretProperties),
121 world: kube.PersistentVolumeClaimVolume(server.worldVolume),
122 },
123 containers_: {
124 default: kube.Container("default") {
125 image: server.image,
126 command: [
127 "bash", "/home/minecraft/config/start.sh",
128 ],
129 volumeMounts_: {
130 config: { mountPath: "/home/minecraft/config" },
131 world: { mountPath: "/home/minecraft/world" },
132 },
133 ports_: {
134 minecraft: { containerPort: 25565 },
135 },
136 resources: {
137 requests: {
138 memory: "6G",
139 cpu: "2",
140 },
141 limits: {
142 memory: "6G",
143 cpu: "4",
144 },
145 },
146 },
147 overviewer: kube.Container("overviewer") {
148 image: "halverneus/static-file-server:v1.8.0",
149 env_: {
150 FOLDER: "/home/minecraft/world/overviewer/world",
151 },
152 volumeMounts_: {
153 world: { mountPath: "/home/minecraft/world" },
154 },
155 ports_: {
156 web: { containerPort: 8080 },
157 },
158 },
159 },
160 },
161 },
162 },
163 },
164
165 svc: kube.Service(server.componentName("svc")) {
166 metadata+: server.metadata,
167 target_pod:: server.deploy.spec.template,
168 spec+: {
169 ports: [
170 { name: "minecraft", port: 25565, targetPort: 25565, protocol: "TCP" },
171 { name: "web", port: 80, targetPort: 8080, protocol: "TCP" },
172 ],
173 type: "LoadBalancer",
174 externalTrafficPolicy: "Local",
175 },
176 },
177 },
178
179 ns: kube.Namespace("minecraft"),
180
181 q3k: {
182 survival: minecraft.server("q3k-survival", "spigot-1.15.2") {
183 properties+: {
184 motd: "wypierdol z polski kropka pe el",
Sergiusz Bazanski6a0b75b2020-05-16 21:05:09 +0200185 "enforce-whitelist": true,
Sergiusz Bazanskid1ccdcf2020-05-06 20:34:06 +0200186 },
187 },
188 },
189}