From d229701c1eaace359f4f6b0c3960e9b9a611f713 Mon Sep 17 00:00:00 2001 From: Kjeld Schouten Date: Mon, 5 May 2025 19:46:08 +0200 Subject: [PATCH] Ark chart rework (#35075) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit **Description** This updates the Ark Survival evolved chart to comply to our current quality guidelines and use a container thats more suited towards ark-specifically. The new container includes ark-server-manager, which allows for automatic management of mods as well. **โš™๏ธ Type of change** - [x] โš™๏ธ Feature/App addition - [ ] ๐Ÿช› Bugfix - [x] โš ๏ธ Breaking change (fix or feature that would cause existing functionality to not work as expected) - [x] ๐Ÿ”ƒ Refactor of current code - [ ] ๐Ÿ“œ Documentation Changes **๐Ÿงช How Has This Been Tested?** **๐Ÿ“ƒ Notes:** Also adds ark server as a hosted service... **โœ”๏ธ Checklist:** - [ ] โš–๏ธ My code follows the style guidelines of this project - [ ] ๐Ÿ‘€ I have performed a self-review of my own code - [ ] #๏ธโƒฃ I have commented my code, particularly in hard-to-understand areas - [ ] ๐Ÿ“„ I have made changes to the documentation - [ ] ๐Ÿงช I have added tests to this description that prove my fix is effective or that my feature works - [ ] โฌ†๏ธ I increased versions for any altered app according to semantic versioning - [ ] I made sure the title starts with `feat(chart-name):`, `fix(chart-name):`, `chore(chart-name):`, `docs(chart-name):` or `fix(docs):` **โž• App addition** If this PR is an app addition please make sure you have done the following. - [ ] ๐Ÿ–ผ๏ธ I have added an icon in the Chart's root directory called `icon.png` --- _Please don't blindly check all the boxes. Read them and only check those that apply. Those checkboxes are there for the reviewer to see what is this all about and the status of this PR with a quick glance._ --- charts/stable/arksurvivalevolved/Chart.yaml | 7 +- .../docs/community_guide.md | 2 + .../arksurvivalevolved/templates/_secrets.tpl | 43 ---- .../arksurvivalevolved/templates/common.yaml | 10 - charts/stable/arksurvivalevolved/values.yaml | 203 +++++++++++++++--- .../kubernetes/apps/ark/app/helm-release.yaml | 127 +++++++++++ .../apps/ark/app/kustomization.yaml | 6 + .../kubernetes/apps/ark/app/namespace.yaml | 4 + clusters/main/kubernetes/apps/ark/ks.yaml | 12 ++ .../main/kubernetes/apps/kustomization.yaml | 1 + 10 files changed, 323 insertions(+), 92 deletions(-) delete mode 100644 charts/stable/arksurvivalevolved/templates/_secrets.tpl create mode 100644 clusters/main/kubernetes/apps/ark/app/helm-release.yaml create mode 100644 clusters/main/kubernetes/apps/ark/app/kustomization.yaml create mode 100644 clusters/main/kubernetes/apps/ark/app/namespace.yaml create mode 100644 clusters/main/kubernetes/apps/ark/ks.yaml diff --git a/charts/stable/arksurvivalevolved/Chart.yaml b/charts/stable/arksurvivalevolved/Chart.yaml index 8b0136415a7..f2ef27f9d13 100644 --- a/charts/stable/arksurvivalevolved/Chart.yaml +++ b/charts/stable/arksurvivalevolved/Chart.yaml @@ -19,7 +19,7 @@ dependencies: tags: [] import-values: [] deprecated: false -description: A custom SteamCMD chart that runs ArkSE. +description: Runs Ark Survival Evolvedand Ark-Server-Manager home: https://truecharts.org/charts/stable/arksurvivalevolved icon: https://truecharts.org/img/hotlink-ok/chart-icons/arksurvivalevolved.webp keywords: @@ -33,9 +33,6 @@ maintainers: url: https://truecharts.org name: arksurvivalevolved sources: - - https://ghcr.io/ich777/steamcmd - - https://github.com/ich777/docker-steamcmd-server/tree/arkse - https://github.com/truecharts/charts/tree/master/charts/stable/arksurvivalevolved type: application -version: 9.5.1 - +version: 10.0.0 diff --git a/charts/stable/arksurvivalevolved/docs/community_guide.md b/charts/stable/arksurvivalevolved/docs/community_guide.md index c3af87bcd49..95ab98ba51a 100644 --- a/charts/stable/arksurvivalevolved/docs/community_guide.md +++ b/charts/stable/arksurvivalevolved/docs/community_guide.md @@ -2,6 +2,8 @@ title: Community Guide --- +TBD: Needs redoing + ## Credentials `Username` and `Password` is optional but recommended. You **_will_** need to disable Steam Guard. diff --git a/charts/stable/arksurvivalevolved/templates/_secrets.tpl b/charts/stable/arksurvivalevolved/templates/_secrets.tpl deleted file mode 100644 index 252bf2be3a8..00000000000 --- a/charts/stable/arksurvivalevolved/templates/_secrets.tpl +++ /dev/null @@ -1,43 +0,0 @@ -{{/* Define the secrets */}} -{{- define "ark.secrets" -}} - -{{- $secretName := (printf "%s-ark-secrets" (include "tc.v1.common.lib.chart.names.fullname" $)) -}} - -{{- $params := list }} -{{- $params = append $params (printf "?Port=%v" .Values.service.main.ports.main.port) -}} -{{- $params = append $params (printf "?QueryPort=%v" .Values.service.query.ports.query.port) -}} -{{- $params = append $params (printf "?RCONPort=%v" .Values.service.rcon.ports.rcon.port) -}} - -{{- $gameExtraParams := list -}} -{{- range $key, $value := .Values.ark.easy_game_extra_params -}} - {{- if $value -}} - {{ $gameExtraParams = mustAppend $gameExtraParams (printf "-%s" $key) }} - {{- end -}} -{{- end -}} - -{{- if .Values.ark.rcon_enabled -}} - {{- $params = append $params (print "?RCONEnabled=True") -}} -{{- end }} -enabled: true -data: - GAME_ID: {{ .Values.ark.game_id | quote }} - GAME_PARAMS: {{ printf "%s%s" (join "" $params) (join "" .Values.ark.game_params) | quote }} - GAME_PARAMS_EXTRA: {{ (join " " (concat $gameExtraParams .Values.ark.game_params_extra)) | quote }} - {{- with .Values.ark.custom_map }} - MAP: {{ . | quote }} - {{- else }} - MAP: {{ .Values.ark.map | quote }} - {{- end }} - {{- with .Values.ark.server_name }} - SERVER_NAME: {{ . | quote }} - {{- end }} - VALIDATE: {{ default false .Values.ark.validate | quote }} - SRV_ADMIN_PWD: {{ .Values.ark.srv_admin_pass | quote }} - SRV_PWD: {{ .Values.ark.srv_password | quote }} - {{- with .Values.ark.username }} - USERNAME: {{ . | quote }} - {{- end }} - {{- with .Values.ark.password }} - PASSWRD: {{ . | quote }} - {{- end }} -{{- end -}} diff --git a/charts/stable/arksurvivalevolved/templates/common.yaml b/charts/stable/arksurvivalevolved/templates/common.yaml index 881082bc6af..0536d142989 100644 --- a/charts/stable/arksurvivalevolved/templates/common.yaml +++ b/charts/stable/arksurvivalevolved/templates/common.yaml @@ -5,15 +5,5 @@ {{- fail (printf "In the service game, the port for game must be greater by 1 than the main service's port. You have to set it to <%s>." (add1 .Values.service.main.ports.main.port)) }} {{- end -}} -{{- if and (ge (int .Values.service.query.ports.query.port) 27020) (le (int .Values.service.query.ports.query.port) 27050) -}} - {{- fail "Query Steam Service port cannot be between 27020 and 27050." -}} -{{- end }} - -{{/* Render secrets for ark */}} -{{- $secrets := include "ark.secrets" . | fromYaml -}} -{{- if $secrets -}} - {{- $_ := set .Values.secret "ark-secrets" $secrets -}} -{{- end -}} - {{/* Render the templates */}} {{ include "tc.v1.common.loader.apply" . }} diff --git a/charts/stable/arksurvivalevolved/values.yaml b/charts/stable/arksurvivalevolved/values.yaml index 2ecf2250d97..3818e452871 100644 --- a/charts/stable/arksurvivalevolved/values.yaml +++ b/charts/stable/arksurvivalevolved/values.yaml @@ -1,13 +1,12 @@ image: - pullPolicy: IfNotPresent - repository: ghcr.io/ich777/steamcmd - tag: arkse@sha256:ed49b692950ce7eb7cf8c1f3cf032aed22da7085b982d175e3ccd18b761d6ad1 -securityContext: - container: - runAsNonRoot: false - readOnlyRootFilesystem: false - runAsUser: 0 - runAsGroup: 0 + repository: docker.io/drpsychick/arkserver + tag: latest-v1.6.62 +# securityContext: +# container: +# runAsNonRoot: true +# readOnlyRootFilesystem: false +# runAsUser: 0 +# runAsGroup: 0 service: main: enabled: true @@ -36,29 +35,37 @@ service: protocol: tcp port: 27020 ark: - # setting pass for rcon - srv_admin_pass: "123456789" - srv_password: "" - username: "" - password: "" - game_id: "376030" - rcon_enabled: true - game_params: [] - game_params_extra: [] - easy_game_extra_params: - server: true - log: true - crossplay: true - map: TheIsland - # Used only for SCALE GUI - custom_map: "" - server_name: "" - validate: false + mods: [] + workload: main: podSpec: containers: main: + env: + ## DOnt touch + # arkmanager subtracts 1 from port by default + am_arkNoPortDecrement: "true" + am_arkGameIniFile: /arkconfig/Game.ini + am_arkGameUserSettingsIniFile: /arkconfig/GameUserSettings.ini + ARKSERVER_SHARED: "{{ $.Values.persistence.game.mountPath | quote }}" + am_ark_QueryPort: "{{ .Values.service.query.ports.query.port }}" + am_ark_Port: "{{ .Values.service.main.ports.main.port }}" + am_ark_RCONPort: "{{ .Values.service.rcon.ports.rcon.port }}" + am_ark_GameModIds: '{{ join "," .Values.ark.mods | quote }}' + + ## Free RealEstate + ARKCLUSTER: "true" + am_arkopt_clusterid: "arkserver" + am_arkStagingDir: "" + am_arkAutoUpdateOnStart: false + am_ark_SessionName: "arkserver" + am_serverMap: "TheIsland" + am_ark_MaxPlayers: "10" + am_ark_ServerPassword: "password" + am_ark_RCONEnabled: "True" + am_ark_ServerAdminPassword: "123456789" + probes: liveness: type: tcp @@ -69,13 +76,141 @@ workload: startup: type: tcp port: "{{ .Values.service.rcon.ports.rcon.port }}" - envFrom: - - secretRef: - name: "ark-secrets" + persistence: - steamcmd: + game: enabled: true - mountPath: /serverdata/steamcmd - serverfiles: + mountPath: /arkserver + cluster: enabled: true - mountPath: /serverdata/serverfiles + mountPath: /arkserver/ShooterGame/Saved/clusters + save: + enabled: true + mountPath: /arkserver/ShooterGame/Saved + gameinis: + enabled: true + type: configmap + objectName: gameinis + mountPath: /arkconfig + crontab: + enabled: true + type: configmap + objectName: gameinis + mountPath: /ark/config/crontab + items: + - key: "crontab" + path: "crontab" + +configmap: + gameinis: + enabled: true + data: + Engine.ini: | + # Engine.ini + Game.ini: | + [/Script/ShooterGame.ShooterGameMode] + bDisableStructurePlacementCollision=True + ## index: + ## 0: Health, + ## 1: Stamina, + ## 2: Torpidity, + ## 3: Oxygen, + ## 4: Food, + ## 5: Water, + ## 6: Temperature, + ## 7: Weight, + ## 8: MeleeDamageMultiplier, + ## 9: SpeedMultiplier, + ## 10: TemperatureFortitude, + ## 11: CraftingSpeedMultiplier + # PerLevelStatsMultiplier_Player[0]=2.0 + # PerLevelStatsMultiplier_Player[4]=2.0 + # PerLevelStatsMultiplier_Player[5]=2.0 + # PerLevelStatsMultiplier_Player[7]=2.0 + # PerLevelStatsMultiplier_DinoTamed[7]=2.0 + # PerLevelStatsMultiplier_DinoWild[7]=1 + ## https://board.nitrado.net/support-de-german-only/support-gameserver/ark-survival-evolved/103586/butgeschwindigkeit-wachstumsgeschwindigkeit/?s=6270aee8447cd08b702a7315fe1e47efe64afb1b#post681499 + ## https://survivetheark.com/index.php?/forums/topic/200763-help-with-breedingimprinting-settings/ + # MatingIntervalMultiplier=0.1 + # BabyMatureSpeedMultiplier=25.0 + # EggHatchSpeedMultiplier=15.0 + # BabyCuddleIntervalMultiplier=0.1 + GameUserSettings.ini: | + [/Script/ShooterGame.ShooterGameUserSettings] + Version=5 + [ServerSettings] + AllowFlyerCarryPvE=True + AllowThirdPersonPlayer=True + AlwaysNotifyPlayerLeft=False + AutoSavePeriodMinutes=15.000000 + ClampResourceHarvestDamage=False + DifficultyOffset=1.000000 + OverrideOfficialDifficulty=5.000000 + DisableStructureDecayPvE=False + DontAlwaysNotifyPlayerJoined=False + EnablePvPGamma=False + GlobalVoiceChat=False + KickIdlePlayersPeriod=2400.000000 + NoTributeDownloads=False + ProximityChat=False + ProximityVoiceChat=False + PvEStructureDecayDestructionPeriod=0.000000 + ServerCrosshair=True + ServerForceNoHUD=False + ServerHardcore=False + ServerPassword=password + ServerPVE=True + ShowMapPlayerLocation=True + TamedDinoDamageMultiplier=1.000000 + TamedDinoResistanceMultiplier=1.000000 + StructurePreventResourceRadiusMultiplier=1.000000 + RaidDinoCharacterFoodDrainMultiplier=1.000000 + PvEDinoDecayPeriodMultiplier=1.000000 + PerPlatformMaxStructuresMultiplier=1.000000 + ListenServerTetherDistanceMultiplier=1.000000 + MaxTamedDinos=5000.000000 + RCONServerGameLogBuffer=600.000000 + AllowHitMarkers=True + TamingSpeedMultiplier=3.000000 + AllowCaveBuildingPvE=True + AllowAnyoneBabyImprintCuddle=True + ShowFloatingDamageText=True + NonPermanentDiseases=True + HarvestAmountMultiplier=1.900000 + PreventDownloadSurvivors=False + PreventDownloadItems=False + PreventDownloadDinos=False + PreventUploadSurvivors=False + PreventUploadItems=False + PreventUploadDinos=False + TribeLogDestroyedEnemyStructures=True + TheMaxStructuresInRange=10500.000000 + XPMultiplier=1 + ActiveMods= + + [SessionSettings] + SessionName=ArkServer + + [/Script/Engine.GameSession] + + [MessageOfTheDay] + Message=Welcome on ARK + Duration=5 + + [/Game/PrimalEarth/CoreBlueprints/TestGameMode.TestGameMode_C] + bServerGameLogEnabled=True + + crontab: | + ## Example of job definition: + ## .---------------- minute (0 - 59) + ## | .------------- hour (0 - 23) + ## | | .---------- day of month (1 - 31) + ## | | | .------- month (1 - 12) OR jan,feb,mar,apr ... + ## | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat + ## | | | | | + ## * * * * * user-name command to be executed + + ## Examples for arkmanager: + # 0 * * * * arkmanager update --update-mods --warn --saveworld # check for updates every hour + # */15 * * * * arkmanager saveworld && arkmanager backup # backup every 15min + # 0 0 * * * arkmanager restart --warn --saveworld # restart every day at midnight diff --git a/clusters/main/kubernetes/apps/ark/app/helm-release.yaml b/clusters/main/kubernetes/apps/ark/app/helm-release.yaml new file mode 100644 index 00000000000..ee873aec92d --- /dev/null +++ b/clusters/main/kubernetes/apps/ark/app/helm-release.yaml @@ -0,0 +1,127 @@ +--- +# yaml-language-server: $schema=https://kubernetes-schemas.pages.dev/helm.toolkit.fluxcd.io/helmrelease_v2.json +apiVersion: helm.toolkit.fluxcd.io/v2 +kind: HelmRelease +metadata: + name: ark + namespace: ark +spec: + interval: 10m + chart: + spec: + chart: arksurvivalevolved + version: 10.0.0 + sourceRef: + kind: HelmRepository + name: truecharts + namespace: flux-system + interval: 15m + timeout: 20m + maxHistory: 3 + install: + createNamespace: true + remediation: + retries: 3 + upgrade: + cleanupOnFail: true + remediation: + retries: 3 + uninstall: + keepHistory: false + values: + credentials: + s3: + type: s3 + url: "${S3URL}" + bucket: "${S3PREFIX_TC}-ark" + accessKey: "${S3ID_TC}" + secretKey: "${S3KEY_TC}" + encrKey: "${S3KEY_TC}" + + service: + main: + enabled: true + loadBalancerIP: ${ARK_IP} + type: LoadBalancer + # externalTrafficPolicy: Local + ports: + main: + enabled: true + port: 7777 + protocol: udp + game: + enabled: true + port: 7778 + # This should always be main +1 + protocol: udp + query: + enabled: true + # loadBalancerIP: $ARK_IP} + # type: LoadBalancer + ports: + query: + enabled: true + protocol: udp + port: 27015 + rcon: + enabled: true + # loadBalancerIP: ${ARK_IP} + # type: LoadBalancer + ports: + rcon: + enabled: true + protocol: tcp + port: 27020 + + workload: + main: + podSpec: + containers: + main: + env: + ## Free RealEstate + am_arkopt_clusterid: "TrueCharts-Ark" + am_arkStagingDir: "" + am_arkAutoUpdateOnStart: false + am_ark_SessionName: "TrueCharts" + am_serverMap: "Fjordur" + am_ark_MaxPlayers: "10" + am_ark_ServerPassword: ${ARK_PASSWORD} + am_ark_RCONEnabled: "True" + am_ark_ServerAdminPassword: ${ARK_RCONPASS} + + + persistence: + cluster: + volsync: + - name: b2 + type: restic + credentials: s3 + dest: + accessModes: + - ReadWriteOnce + enabled: true + src: + enabled: true + save: + volsync: + - name: b2 + type: restic + credentials: s3 + dest: + accessModes: + - ReadWriteOnce + enabled: true + src: + enabled: true + + ark: + mods: [] + + resources: + limits: + cpu: 8000m + memory: 25Gi + requests: + cpu: 1000m + memory: 8Gi diff --git a/clusters/main/kubernetes/apps/ark/app/kustomization.yaml b/clusters/main/kubernetes/apps/ark/app/kustomization.yaml new file mode 100644 index 00000000000..1b2b2dc29f5 --- /dev/null +++ b/clusters/main/kubernetes/apps/ark/app/kustomization.yaml @@ -0,0 +1,6 @@ +--- +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization +resources: + - namespace.yaml + - helm-release.yaml diff --git a/clusters/main/kubernetes/apps/ark/app/namespace.yaml b/clusters/main/kubernetes/apps/ark/app/namespace.yaml new file mode 100644 index 00000000000..ef86a922b9d --- /dev/null +++ b/clusters/main/kubernetes/apps/ark/app/namespace.yaml @@ -0,0 +1,4 @@ +apiVersion: v1 +kind: Namespace +metadata: + name: ark diff --git a/clusters/main/kubernetes/apps/ark/ks.yaml b/clusters/main/kubernetes/apps/ark/ks.yaml new file mode 100644 index 00000000000..66459fb5769 --- /dev/null +++ b/clusters/main/kubernetes/apps/ark/ks.yaml @@ -0,0 +1,12 @@ +apiVersion: kustomize.toolkit.fluxcd.io/v1 +kind: Kustomization +metadata: + name: ark + namespace: flux-system +spec: + interval: 10m + path: clusters/main/kubernetes/apps/ark/app + prune: true + sourceRef: + kind: GitRepository + name: truecharts diff --git a/clusters/main/kubernetes/apps/kustomization.yaml b/clusters/main/kubernetes/apps/kustomization.yaml index c6c3875d448..b4d95e164a7 100644 --- a/clusters/main/kubernetes/apps/kustomization.yaml +++ b/clusters/main/kubernetes/apps/kustomization.yaml @@ -3,5 +3,6 @@ kind: Kustomization resources: - renovate/ks.yaml - minecraft/ks.yaml + - ark/ks.yaml - jackett/ks.yaml - bitmagnet/ks.yaml