| local kube = import "../../../kube/kube.libsonnet"; |
| local defaultWorldguardConfig = import "worldguard.libsonnet"; |
| |
| { |
| local minecraft = self, |
| versions:: { |
| "spigot-1.16.1": "registry.k0.hswaw.net/q3k/minecraft:spigot-1.16.1-r2", |
| "paper-1.16.1": "registry.k0.hswaw.net/q3k/minecraft:paper-1.16.1-r2", |
| "paper-1.16.4": "registry.k0.hswaw.net/q3k/minecraft:paper-1.16.4-r1", |
| "paper-1.16.5": "registry.k0.hswaw.net/q3k/minecraft:paper-1.16.5-r2", |
| "vanilla-1.16.5": "registry.k0.hswaw.net/enleth/minectaft:vanilla-1.16.5", |
| }, |
| server(name, version):: { |
| local server = self, |
| name:: name, |
| version:: version, |
| image:: minecraft.versions[server.version], |
| worldedit:: true, |
| overviewer:: true, |
| |
| 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, |
| }, |
| |
| worldguardConfig:: defaultWorldguardConfig, |
| |
| startSteps:: [ |
| ] + (if server.worldedit then [ |
| "mkdir -p plugins/WorldGuard", |
| "cp /home/minecraft/worldedit-*.jar plugins", |
| "cp /home/minecraft/worldguard-*.jar plugins", |
| "cp /home/minecraft/config/worldguard_config.yaml plugins/WorldGuard/config.yml", |
| ] else []), |
| |
| startsh:: ||| |
| #!/usr/bin/env bash |
| cd /home/minecraft/world |
| cp /home/minecraft/config/server.properties . |
| cp /home/minecraft/server.jar . |
| echo "eula=true" > eula.txt |
| %s |
| |
| bash /home/minecraft/config/overviewer.sh & |
| exec java -Xmx4G -Xms4G -jar server.jar |
| ||| % [std.join("\n", server.startSteps)], |
| |
| 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), |
| } + (if server.worldedit then { |
| local worldguardConfig = std.manifestYamlDoc(server.worldguardConfig), |
| "worldguard_config.yaml": std.base64(worldguardConfig), |
| } else {} )+ (if server.overviewer then { |
| "overviewer.sh": std.base64(server.overviewersh), |
| } else {}), |
| }, |
| |
| 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 }, |
| grpc: { containerPort: 2137 }, |
| }, |
| resources: { |
| requests: { |
| memory: "6G", |
| cpu: "2", |
| }, |
| limits: { |
| memory: "6G", |
| cpu: "4", |
| }, |
| }, |
| }, |
| bridge: kube.Container("bridge") { |
| image: "registry.k0.hswaw.net/q3k/minecraft-hscloud-bridge:20200518c", |
| command: [ |
| "/personal/q3k/minecraft/plugin/hscloud/bridge/bridge", |
| "-plugin", "127.0.0.1:2137", |
| ], |
| ports_: { |
| bridge: { containerPort: 8081 }, |
| }, |
| }, |
| } + (if server.overviewer then { |
| 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 }, |
| }, |
| }, |
| } else {}), |
| }, |
| }, |
| }, |
| }, |
| |
| 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" }, |
| { name: "bridge", port: 8080, targetPort: 8081, protocol: "TCP" }, |
| { name: "grpc", port: 2137, targetPort: 2137, protocol: "TCP" }, |
| ], |
| type: "LoadBalancer", |
| externalTrafficPolicy: "Local", |
| }, |
| }, |
| }, |
| |
| ns: kube.Namespace("minecraft"), |
| |
| admins: minecraft.ns.Contain(kube.RoleBinding("admins")) { |
| roleRef: { |
| apiGroup: "rbac.authorization.k8s.io", |
| kind: "ClusterRole", |
| name: "system:admin-namespace", |
| }, |
| subjects: [ |
| kube.User("enleth@hackerspace.pl"), |
| ], |
| }, |
| |
| q3k: { |
| "nova-arcana": minecraft.server("q3k-nova-arcana", "vanilla-1.16.5") { |
| overviewer: false, |
| worldedit: false, |
| properties+: { |
| motd: "Nova Arcana V1.1.4", |
| //"enforce-whitelist": true, |
| "enable-rcon": "true", |
| "rcon.password": "dupa.8", |
| "enable-command-block": true, |
| }, |
| startSteps+: [ |
| ||| |
| if [ ! -e world/map-installed.txt ]; then |
| set -e -x |
| mkdir -p world |
| cd world |
| rm -rf * |
| wget https://object.ceph-waw3.hswaw.net/q3k-personal/f1a73ad0518a2629a5bed072a7de4e4534a3c89705d6cea2f203a05cccd01634.zip -O map.zip |
| unzip -o map.zip |
| mv Untold*/* . |
| rm -rf Untold* |
| rm map.zip |
| touch map-installed.txt |
| ls -la |
| cd .. |
| set +e +x |
| fi |
| ||| |
| ], |
| }, |
| }, |
| } |