diff --git a/personal/q3k/minecraft/Dockerfile-vanilla b/personal/q3k/minecraft/Dockerfile-vanilla new file mode 100644 index 00000000..9ba74786 --- /dev/null +++ b/personal/q3k/minecraft/Dockerfile-vanilla @@ -0,0 +1,43 @@ +FROM ubuntu:20.04 + +RUN set -e -x ;\ + export DEBIAN_FRONTEND=noninteractive ;\ + apt-get -y update ;\ + apt-get -y upgrade ;\ + apt-get -y install git openjdk-8-jre-headless wget + +RUN set -e -x ;\ + export DEBIAN_FRONTEND=noninteractive ;\ + apt-get -y install build-essential python3-dev python3-pil python3-numpy ;\ + mkdir overviewer ;\ + cd overviewer ;\ + wget --quiet https://github.com/overviewer/Minecraft-Overviewer/archive/v0.15.0.tar.gz ;\ + tar xvf *.tar.gz ;\ + cd Minecraft-Overviewer* ;\ + python3 setup.py build ;\ + python3 setup.py install ;\ + cd ../.. ;\ + rm -rf overviewer ;\ + apt-get -y purge python3-dev build-essential + + +RUN set -e -x ;\ + useradd -rm minecraft + +USER minecraft +WORKDIR /home/minecraft + +RUN set -e -x ;\ + mkdir build ;\ + cd build ;\ + wget --quiet https://hub.spigotmc.org/jenkins/job/BuildTools/112/artifact/target/BuildTools.jar ;\ + java -jar BuildTools.jar --rev 1.15.2 ;\ + cp spigot*jar .. ;\ + cd .. ;\ + rm -rf build ;\ + mv spigot*.jar spigot.jar + +RUN set -e -x ;\ + VERSION=1.15.2 ;\ + mkdir -p /home/minecraft/.minecraft/versions/${VERSION}/ ;\ + wget --quiet https://overviewer.org/textures/${VERSION} -O /home/minecraft/.minecraft/versions/${VERSION}/${VERSION}.jar diff --git a/personal/q3k/minecraft/prod.jsonnet b/personal/q3k/minecraft/prod.jsonnet new file mode 100644 index 00000000..a662cce9 --- /dev/null +++ b/personal/q3k/minecraft/prod.jsonnet @@ -0,0 +1,188 @@ +local kube = import "../../../kube/kube.libsonnet"; + +{ + local minecraft = self, + versions:: { + "spigot-1.15.2": "registry.k0.hswaw.net/q3k/minecraft:spigot-1.15.2-r2", + }, + server(name, version):: { + local server = self, + name:: name, + version:: version, + image:: minecraft.versions[server.version], + + metadata:: { + namespace: "minecraft", + }, + + componentName(component):: "%s-%s" % [server.name, component], + + properties:: { + "spawn-protection": 16, + "max-tick-time": 60000, + "query.port": 25565, + "generator-settings": "", + "force-gamemode": false, + "allow-nether": true, + "enforce-whitelist": false, + "gamemode": "survival", + "broadcast-console-to-ops": true, + "enable-query": false, + "player-idle-timeout": 0, + "difficulty": "easy", + "broadcast-rcon-to-ops": true, + "spawn-monsters": true, + "op-permission-level": 4, + "pvp": true, + "snooper-enabled": true, + "level-type": "default", + "hardcore": false, + "enable-command-block": false, + "network-compression-threshold": 256, + "max-players": 20, + "max-world-size": 29999984, + "resource-pack-sha1": "", + "function-permission-level": 2, + "rcon.port": 25575, + "server-port": 25565, + "debug": false, + "server-ip": "", + "spawn-npcs": true, + "allow-flight": false, + "level-name": "world", + "view-distance": 10, + "resource-pack": "", + "spawn-animals": true, + "white-list": false, + "rcon.password": "", + "generate-structures": true, + "online-mode": true, + "max-build-height": 256, + "level-seed": "", + "prevent-proxy-connections": false, + "use-native-transport": true, + "motd": "A Minecraft Server", + "enable-rcon": false, + }, + + startsh:: ||| + #!/usr/bin/env bash + cd /home/minecraft/world + cp /home/minecraft/config/server.properties . + cp /home/minecraft/spigot.jar . + echo "eula=true" > eula.txt + + bash /home/minecraft/config/overviewer.sh & + exec java -Xmx4G -Xms4G -jar spigot.jar + |||, + + overviewersh:: ||| + #!/usr/bin/env bash + mkdir -p overviewer/world + sleep 60 + while true; do + echo "Rendering Overviewer map..." + overviewer.py -p 1 --rendermodes=normal,lighting,smooth-lighting,cave world overviewer/world + echo "Done." + sleep 900 + done + |||, + + secretProperties: kube.Secret(server.componentName("properties")) { + metadata+: server.metadata, + data: { + local properties = std.join("\n", ["%s=%s" % [k, std.toString(server.properties[k])] for k in std.objectFields(server.properties)]), + "server.properties": std.base64(properties), + "start.sh": std.base64(server.startsh), + "overviewer.sh": std.base64(server.overviewersh), + }, + }, + + worldVolume: kube.PersistentVolumeClaim(server.componentName("world")) { + metadata+: server.metadata, + spec+: { + storageClassName: "waw-hdd-redundant-3", + accessModes: ["ReadWriteOnce"], + resources: { + requests: { + storage: "10Gi", + }, + }, + }, + }, + + deploy: kube.Deployment(server.componentName("deploy")) { + metadata+: server.metadata, + spec+: { + template+: { + spec+: { + volumes_: { + config: kube.SecretVolume(server.secretProperties), + world: kube.PersistentVolumeClaimVolume(server.worldVolume), + }, + containers_: { + default: kube.Container("default") { + image: server.image, + command: [ + "bash", "/home/minecraft/config/start.sh", + ], + volumeMounts_: { + config: { mountPath: "/home/minecraft/config" }, + world: { mountPath: "/home/minecraft/world" }, + }, + ports_: { + minecraft: { containerPort: 25565 }, + }, + resources: { + requests: { + memory: "6G", + cpu: "2", + }, + limits: { + memory: "6G", + cpu: "4", + }, + }, + }, + overviewer: kube.Container("overviewer") { + image: "halverneus/static-file-server:v1.8.0", + env_: { + FOLDER: "/home/minecraft/world/overviewer/world", + }, + volumeMounts_: { + world: { mountPath: "/home/minecraft/world" }, + }, + ports_: { + web: { containerPort: 8080 }, + }, + }, + }, + }, + }, + }, + }, + + svc: kube.Service(server.componentName("svc")) { + metadata+: server.metadata, + target_pod:: server.deploy.spec.template, + spec+: { + ports: [ + { name: "minecraft", port: 25565, targetPort: 25565, protocol: "TCP" }, + { name: "web", port: 80, targetPort: 8080, protocol: "TCP" }, + ], + type: "LoadBalancer", + externalTrafficPolicy: "Local", + }, + }, + }, + + ns: kube.Namespace("minecraft"), + + q3k: { + survival: minecraft.server("q3k-survival", "spigot-1.15.2") { + properties+: { + motd: "wypierdol z polski kropka pe el", + }, + }, + }, +}