forked from hswaw/hscloud
261 lines
10 KiB
Plaintext
261 lines
10 KiB
Plaintext
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
|
|
|||
|
|
],
|
|
},
|
|
},
|
|
}
|