From 367d9e3900867ca072363069cc379c7bea2682ce Mon Sep 17 00:00:00 2001 From: jklein Date: Mon, 16 Mar 2026 21:21:07 +0100 Subject: [PATCH] feat(satisfactory): added chart --- satisfactory/.helmignore | 23 ++++++ satisfactory/Chart.yaml | 8 ++ .../templates/satisfactory-server.sfs.yaml | 78 +++++++++++++++++++ satisfactory/templates/satisfactory.pvc.yaml | 11 +++ .../templates/satisfactory.service.yaml | 26 +++++++ satisfactory/values.yaml | 12 +++ 6 files changed, 158 insertions(+) create mode 100644 satisfactory/.helmignore create mode 100644 satisfactory/Chart.yaml create mode 100644 satisfactory/templates/satisfactory-server.sfs.yaml create mode 100644 satisfactory/templates/satisfactory.pvc.yaml create mode 100644 satisfactory/templates/satisfactory.service.yaml create mode 100644 satisfactory/values.yaml diff --git a/satisfactory/.helmignore b/satisfactory/.helmignore new file mode 100644 index 0000000..0e8a0eb --- /dev/null +++ b/satisfactory/.helmignore @@ -0,0 +1,23 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*.orig +*~ +# Various IDEs +.project +.idea/ +*.tmproj +.vscode/ diff --git a/satisfactory/Chart.yaml b/satisfactory/Chart.yaml new file mode 100644 index 0000000..668439c --- /dev/null +++ b/satisfactory/Chart.yaml @@ -0,0 +1,8 @@ +apiVersion: v2 +name: satisfactory +description: A Helm chart to deploy a Satisfactory Gameserver on Kubernetes +type: application +version: 1.2.0+upv1.9.10 +appVersion: "v1.9.10" +maintainers: + - name: jklein \ No newline at end of file diff --git a/satisfactory/templates/satisfactory-server.sfs.yaml b/satisfactory/templates/satisfactory-server.sfs.yaml new file mode 100644 index 0000000..c5d5b62 --- /dev/null +++ b/satisfactory/templates/satisfactory-server.sfs.yaml @@ -0,0 +1,78 @@ +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: "{{ .Release.Name }}-{{ .Chart.Name }}-sf-server" +spec: + selector: + matchLabels: + app: "{{ .Release.Name }}-{{ .Chart.Name }}-sf-server" + serviceName: "{{ .Release.Name }}-{{ .Chart.Name }}-sf-service" + replicas: 1 + template: + metadata: + labels: + app: "{{ .Release.Name }}-{{ .Chart.Name }}-sf-server" + spec: + automountServiceAccountToken: false + containers: + - name: "{{ .Release.Name }}-{{ .Chart.Name }}-sf-server" + image: "ghcr.io/wolveix/satisfactory-server:{{ .Chart.AppVersion }}" + env: + - name: DEBUG + value: "{{ .Values.dev.debug }}" + - name: MAXPLAYERS + value: "{{ .Values.game.maxPlayers }}" + - name: PGID + value: "1000" + - name: PUID + value: "1000" + - name: SKIPUPDATE + value: "false" + - name: STEAMBETA + value: "{{ .Values.game.experimental }}" + - name: DISABLESEASONALEVENTS + value: "{{ .Values.game.seasonalEvents }}" + - name: SERVERGAMEPORT + value: "{{ .Values.server.gamePort }}" + - name: SERVERMESSAGINGPORT + value: "{{ .Values.server.messagingPort }}" + ports: + - name: "api" + containerPort: {{ .Values.server.gamePort }} + protocol: TCP + - name: "game" + containerPort: {{ .Values.server.gamePort }} + protocol: UDP + - name: "messaging" + containerPort: {{ .Values.server.messagingPort }} + protocol: TCP + livenessProbe: + exec: + command: + - "/bin/sh" + - "-c" + - "/home/steam/healthcheck.sh" + initialDelaySeconds: 300 + failureThreshold: 4 + successThreshold: 1 + periodSeconds: 30 + resources: + requests: + memory: "4Gi" + cpu: "1" + ephemeral-storage: "5Gi" + limits: + memory: "8Gi" + cpu: "2" + ephemeral-storage: "10Gi" + volumeMounts: + - name: satisfactory-volume + mountPath: /config + subPath: config/ + - name: satisfactory-volume + mountPath: /config/gamefiles + subPath: gameFiles/ + volumes: + - name: satisfactory-volume + persistentVolumeClaim: + claimName: {{ .Release.Name }}-{{ .Chart.Name }}-vc diff --git a/satisfactory/templates/satisfactory.pvc.yaml b/satisfactory/templates/satisfactory.pvc.yaml new file mode 100644 index 0000000..af309a7 --- /dev/null +++ b/satisfactory/templates/satisfactory.pvc.yaml @@ -0,0 +1,11 @@ +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: {{ .Release.Name }}-{{ .Chart.Name }}-vc +spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: {{ .Values.server.storage }} + storageClassName: longhorn diff --git a/satisfactory/templates/satisfactory.service.yaml b/satisfactory/templates/satisfactory.service.yaml new file mode 100644 index 0000000..928401f --- /dev/null +++ b/satisfactory/templates/satisfactory.service.yaml @@ -0,0 +1,26 @@ +apiVersion: v1 +kind: Service +metadata: + name: "{{ .Release.Name }}-{{ .Chart.Name }}-sf-service" + labels: + app: "{{ .Release.Name }}-{{ .Chart.Name }}-sf-service" +spec: + type: NodePort + ports: + - name: "api" + port: {{ .Values.server.gamePort }} + protocol: TCP + nodePort: {{ .Values.server.gamePort }} + targetPort: {{ .Values.server.gamePort }} + - name: "game" + port: {{ .Values.server.gamePort }} + protocol: UDP + nodePort: {{ .Values.server.gamePort }} + targetPort: {{ .Values.server.gamePort }} + - name: "messaging" + port: {{ .Values.server.messagingPort }} + protocol: TCP + nodePort: {{ .Values.server.messagingPort }} + targetPort: {{ .Values.server.messagingPort }} + selector: + app: "{{ .Release.Name }}-{{ .Chart.Name }}-sf-server" \ No newline at end of file diff --git a/satisfactory/values.yaml b/satisfactory/values.yaml new file mode 100644 index 0000000..a003b27 --- /dev/null +++ b/satisfactory/values.yaml @@ -0,0 +1,12 @@ +dev: + debug: false + +game: + experimental: false + maxPlayers: 4 + seasonalEvents: true + +server: + gamePort: 30777 + messagingPort: 30888 + storage: 20Gi \ No newline at end of file