Merge "cluster/rook: bump to 1.1.9"
diff --git a/personal/q3k/minecraft/Dockerfile-vanilla b/personal/q3k/minecraft/Dockerfile-vanilla
new file mode 100644
index 0000000..9ba7478
--- /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 0000000..a662cce
--- /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",
+            },
+        },
+    },
+}