| 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.2.4", |
| save: error "save must be set", |
| |
| password: "", # disabled if empty. |
| |
| admins: { |
| q3k: "a6a3727038eb53b35ad28ba88dc80810f94c6c3d", |
| }, |
| }, |
| |
| 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-alcatraz") { |
| cfg+: { |
| namespace: "personal-q3k", |
| save: "https://q3k.org/u/480883b2d44658523dcf6561d71d7e3eb91be13253e2bc96378f86a62b380a97.sv6", |
| }, |
| }, |
| }, |
| } |