local kube = import "../../kube/kube.libsonnet"; { local top = self, Server(name):: { local server = self, local cfg = server.cfg, cfg:: { namespace: error "namespace must be set", storageClassName: "waw-hdd-redundant-3", image: "openrct2/openrct2-cli:0.3.5.1", save: error "save must be set", password: "", # disabled if empty. admins: { q3k: "1e44d2ac315b9120b4dad868f1635417b1522073", }, }, metadata:: { namespace: cfg.namespace, }, volumeClaim: kube.PersistentVolumeClaim(name) { metadata+: server.metadata, spec+: { storageClassName: cfg.storageClassName, accessModes: [ "ReadWriteOnce" ], resources: { requests: { storage: "5Gi", }, }, }, }, config: kube.ConfigMap(name + "-config") { metadata+: server.metadata, // admins with local server as co-admin local admins = cfg.admins + { openrct2: "", }, data: { "users.json": std.manifestJson([ { hash: admins[name], name: name, groupId: 0 } for name in std.objectFields(admins) ]), "run.sh": ||| set -ex set -o pipefail SAVES=/home/openrct2/.config/OpenRCT2/save/autosave if [ -d "$SAVES" ]; then echo "Save directory exists, checking for autosaves..." latest="$SAVES/$(ls -Art "$SAVES" | tail -n 1)" if [ -f "$latest" ]; then echo "Found new autosave: $latest" export OPENRCT2_SAVE="$latest" fi fi echo "Running save $OPENRCT2_SAVE..." if [ ! -z "$OPENRCT2_PASSWORD" ]; then echo "Running with password..." openrct2-cli host "$OPENRCT2_SAVE" --password "$OPENRCT2_PASSWORD" else echo "Running without password..." openrct2-cli host "$OPENRCT2_SAVE" fi ||| }, }, deployment: kube.Deployment(name) { metadata+: server.metadata, spec+: { template+: { spec+: { volumes_: { data: kube.PersistentVolumeClaimVolume(server.volumeClaim), config: kube.ConfigMapVolume(server.config), }, initContainers: [ kube.Container("configure-users") { image: cfg.image, command: [ "/bin/bash", "-c", "cp /config/users.json /home/openrct2/.config/OpenRCT2/users.json", ], volumeMounts_: { data: { mountPath: "/home/openrct2/.config/OpenRCT2" }, config: { mountPath: "/config" }, }, }, ], containers_: { server: kube.Container("server") { image: cfg.image, env_: { OPENRCT2_SAVE: cfg.save, OPENRCT2_PASSWORD: cfg.password, }, command: [ "/bin/bash", "/config/run.sh", ], ports_: { client: { containerPort: 11753 }, }, volumeMounts_: { data: { mountPath: "/home/openrct2/.config/OpenRCT2" }, config: { mountPath: "/config" }, }, resources: { requests: { cpu: "500m", memory: "100Mi", }, limits: { cpu: "1", memory: "1Gi", }, }, }, }, }, }, }, }, svc: kube.Service(name) { metadata+: server.metadata, target_pod:: server.deployment.spec.template, spec+: { ports: [ { name: "client", port: 11753, targetPort: 11753, protocol: "TCP" }, ], type: "LoadBalancer", externalTrafficPolicy: "Local", }, }, }, servers: { alcatraz: top.Server("openrct2-q3k-gravity-gardens") { cfg+: { namespace: "personal-q3k", save: "https://object.ceph-eu.hswaw.net/q3k-personal/53fbf23e507866ae4863f937c93a961ac666a3f588b52492a9642b9384d38324.sv6", }, }, }, }