From e8e53f85cf4904c64540625808c155ca34bb2192 Mon Sep 17 00:00:00 2001 From: Stavros Kois <47820033+stavros-k@users.noreply.github.com> Date: Wed, 3 May 2023 14:50:40 +0300 Subject: [PATCH] NAS-121666 / 23.10 / Add minecraft to `community` train (#1158) * Add minecraft to community train * whitespace * add mail * add metadata --- library/ix-dev/community/minecraft/Chart.lock | 6 + library/ix-dev/community/minecraft/Chart.yaml | 25 + library/ix-dev/community/minecraft/README.md | 14 + .../ix-dev/community/minecraft/app-readme.md | 14 + .../minecraft/charts/common-1.0.6.tgz | Bin 0 -> 54954 bytes .../ci/java11-j9-vanilla-values.yaml | 13 + .../ci/java11-jdk-vanilla-values.yaml | 13 + .../minecraft/ci/java11-vanilla-values.yaml | 13 + .../ci/java17-alpine-vanilla-values.yaml | 12 + .../ci/java17-gce-vanilla-values.yaml | 12 + .../ci/java17-j9-vanilla-values.yaml | 12 + .../ci/java17-jdk-vanilla-values.yaml | 12 + .../minecraft/ci/java17-vanilla-values.yaml | 12 + .../minecraft/ci/java19-vanilla-values.yaml | 12 + .../ci/java8-gce-vanilla-values.yaml | 13 + .../minecraft/ci/java8-j9-vanilla-values.yaml | 13 + .../ci/java8-jdk-vanilla-values.yaml | 13 + .../minecraft/ci/java8-vanilla-values.yaml | 13 + library/ix-dev/community/minecraft/item.yaml | 3 + .../ix-dev/community/minecraft/metadata.yaml | 18 + .../ix-dev/community/minecraft/questions.yaml | 638 ++++++++++++++++++ .../community/minecraft/templates/NOTES.txt | 1 + .../minecraft/templates/_configuration.tpl | 83 +++ .../minecraft/templates/_minecraft.tpl | 98 +++ .../community/minecraft/templates/common.yaml | 7 + .../community/minecraft/upgrade_info.json | 1 + .../community/minecraft/upgrade_strategy | 31 + .../ix-dev/community/minecraft/values.yaml | 105 +++ 28 files changed, 1207 insertions(+) create mode 100644 library/ix-dev/community/minecraft/Chart.lock create mode 100644 library/ix-dev/community/minecraft/Chart.yaml create mode 100644 library/ix-dev/community/minecraft/README.md create mode 100644 library/ix-dev/community/minecraft/app-readme.md create mode 100644 library/ix-dev/community/minecraft/charts/common-1.0.6.tgz create mode 100644 library/ix-dev/community/minecraft/ci/java11-j9-vanilla-values.yaml create mode 100644 library/ix-dev/community/minecraft/ci/java11-jdk-vanilla-values.yaml create mode 100644 library/ix-dev/community/minecraft/ci/java11-vanilla-values.yaml create mode 100644 library/ix-dev/community/minecraft/ci/java17-alpine-vanilla-values.yaml create mode 100644 library/ix-dev/community/minecraft/ci/java17-gce-vanilla-values.yaml create mode 100644 library/ix-dev/community/minecraft/ci/java17-j9-vanilla-values.yaml create mode 100644 library/ix-dev/community/minecraft/ci/java17-jdk-vanilla-values.yaml create mode 100644 library/ix-dev/community/minecraft/ci/java17-vanilla-values.yaml create mode 100644 library/ix-dev/community/minecraft/ci/java19-vanilla-values.yaml create mode 100644 library/ix-dev/community/minecraft/ci/java8-gce-vanilla-values.yaml create mode 100644 library/ix-dev/community/minecraft/ci/java8-j9-vanilla-values.yaml create mode 100644 library/ix-dev/community/minecraft/ci/java8-jdk-vanilla-values.yaml create mode 100644 library/ix-dev/community/minecraft/ci/java8-vanilla-values.yaml create mode 100644 library/ix-dev/community/minecraft/item.yaml create mode 100644 library/ix-dev/community/minecraft/metadata.yaml create mode 100644 library/ix-dev/community/minecraft/questions.yaml create mode 100644 library/ix-dev/community/minecraft/templates/NOTES.txt create mode 100644 library/ix-dev/community/minecraft/templates/_configuration.tpl create mode 100644 library/ix-dev/community/minecraft/templates/_minecraft.tpl create mode 100644 library/ix-dev/community/minecraft/templates/common.yaml create mode 100644 library/ix-dev/community/minecraft/upgrade_info.json create mode 100755 library/ix-dev/community/minecraft/upgrade_strategy create mode 100644 library/ix-dev/community/minecraft/values.yaml diff --git a/library/ix-dev/community/minecraft/Chart.lock b/library/ix-dev/community/minecraft/Chart.lock new file mode 100644 index 0000000000..087ea465af --- /dev/null +++ b/library/ix-dev/community/minecraft/Chart.lock @@ -0,0 +1,6 @@ +dependencies: +- name: common + repository: file://../../../common + version: 1.0.6 +digest: sha256:2f1f31c15fb7f92db141a66adbb8d23a8598727730050a3883a211763a4e5472 +generated: "2023-04-25T15:26:05.856456573+03:00" diff --git a/library/ix-dev/community/minecraft/Chart.yaml b/library/ix-dev/community/minecraft/Chart.yaml new file mode 100644 index 0000000000..a585563c73 --- /dev/null +++ b/library/ix-dev/community/minecraft/Chart.yaml @@ -0,0 +1,25 @@ +name: minecraft +description: Minecraft is a sandbox game +annotations: + title: Minecraft +type: application +version: 1.0.0 +apiVersion: v2 +appVersion: '2023.3.0' +kubeVersion: '>=1.16.0-0' +maintainers: + - name: truenas + url: https://www.truenas.com/ + email: dev@ixsystems.com +dependencies: + - name: common + repository: file://../../../common + version: 1.0.6 +home: https://www.minecraft.net/en-us +icon: https://www.minecraft.net/content/dam/games/minecraft/logos/logo-minecraft.svg +sources: + - https://www.minecraft.net/en-us + - https://github.com/truenas/charts/tree/master/community/minecraft + - https://github.com/itzg/docker-minecraft-server +keywords: + - minecraft diff --git a/library/ix-dev/community/minecraft/README.md b/library/ix-dev/community/minecraft/README.md new file mode 100644 index 0000000000..137bad3438 --- /dev/null +++ b/library/ix-dev/community/minecraft/README.md @@ -0,0 +1,14 @@ +# Minecraft + +[Minecraft](https://www.minecraft.net/en-us) is a sandbox game + +> Application requires to run as root. + +Depending on the `Type` of server selected, you might need to add additional +custom environment variables to the application. + +More info can be found [here](https://itzg.github.io/docker-minecraft-docs/java/server-types/bukkit-spigot/) +Select the type on the sidebar. + +Note that some values are only applicable during the world generation. +More info can be found [here](https://itzg.github.io/docker-minecraft-docs/) diff --git a/library/ix-dev/community/minecraft/app-readme.md b/library/ix-dev/community/minecraft/app-readme.md new file mode 100644 index 0000000000..137bad3438 --- /dev/null +++ b/library/ix-dev/community/minecraft/app-readme.md @@ -0,0 +1,14 @@ +# Minecraft + +[Minecraft](https://www.minecraft.net/en-us) is a sandbox game + +> Application requires to run as root. + +Depending on the `Type` of server selected, you might need to add additional +custom environment variables to the application. + +More info can be found [here](https://itzg.github.io/docker-minecraft-docs/java/server-types/bukkit-spigot/) +Select the type on the sidebar. + +Note that some values are only applicable during the world generation. +More info can be found [here](https://itzg.github.io/docker-minecraft-docs/) diff --git a/library/ix-dev/community/minecraft/charts/common-1.0.6.tgz b/library/ix-dev/community/minecraft/charts/common-1.0.6.tgz new file mode 100644 index 0000000000000000000000000000000000000000..afbd26023c7c4c18b6d3a61a9db9c051c1ee49d6 GIT binary patch literal 54954 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 + Depending on the image you select, you might + need to adjust the Version and Type fields. + schema: + type: string + default: "j17Image" + required: true + enum: + - value: j8Image + description: Java 8 HotSpot (Alpine) + - value: j8j9Image + description: Java 8 OpenJ9 (Debian) + - value: j8jdkImage + description: Java 8 HotSpot+JDK (Ubuntu) + - value: j8gceImage + description: Java 8 GraalVM CE (Oracle) + - value: j11Image + description: Java 11 HotSpot (Ubuntu) + - value: j11j9Image + description: Java 11 OpenJ9 (Debian) + - value: j11jdkImage + description: Java 11 HotSpot+JDK (Ubuntu) + - value: j17Image + description: Java 17 HotSpot (Ubuntu) + - value: j17j9Image + description: Java 17 OpenJ9 (Debian) + - value: j17jdkImage + description: Java 17 HotSpot+JDK (Ubuntu) + - value: j17gceImage + description: Java 17 GraalVM CE (Oracle) + - value: j17alpineImage + description: Java 17 HotSpot (Alpine) + - value: j19Image + description: Java 19 HotSpot (Ubuntu) + - variable: type + label: Type + description: | + The type of Minecraft server to run.
+ Depending on the type you select, you might need + to add additional environment variables.
+ https://itzg.github.io/docker-minecraft-docs/java/server-types/bukkit-spigot + schema: + type: string + default: "VANILLA" + required: true + enum: + - value: VANILLA + description: Vanilla + - value: SPIGOT + description: Spigot + - value: BUKKIT + description: Bukkit + - value: FORGE + description: Forge + - value: CATSERVER + description: CatServer + - value: CRUCIBLE + description: Crucible + - value: AUTO_CURSEFORGE + description: Auto CurseForge + - value: CUSTOM + description: Custom + - value: FABRIC + description: Fabric + - value: FTBA + description: Feed The Beast + - value: FORGE + description: Forge + - value: LOLISERVER + description: LoliServer + - value: LIMBO + description: Limbo + - value: MAGMA + description: Magma + - value: MOHIST + description: Mohist + - value: FABRIC + description: Fabric + - value: PAPER + description: Paper + - value: PUFFERFISH + description: Pufferfish + - value: PURPUR + description: Purpur + - value: QUILT + description: Quilt + - value: SPONGEVANILLA + description: SpongeVanilla + - variable: version + label: Version + description: | + The minecraft version.
+ https://itzg.github.io/docker-minecraft-docs/java/versions/minecraft + schema: + type: string + default: "LATEST" + required: true + - variable: serverName + label: Server Name + description: | + The name of the Minecraft server.
+ https://itzg.github.io/docker-minecraft-docs/java/configuration/servername + schema: + type: string + default: "Minecraft Server" + required: true + - variable: difficulty + label: Difficulty + description: | + The difficulty of the Minecraft server.
+ https://itzg.github.io/docker-minecraft-docs/java/configuration/difficulty + schema: + type: string + default: "easy" + required: true + enum: + - value: peaceful + description: Peaceful + - value: easy + description: Easy + - value: normal + description: Normal + - value: hard + description: Hard + - variable: seed + label: Seed + description: | + The seed for the Minecraft server.
+ https://itzg.github.io/docker-minecraft-docs/java/configuration/seed
+ (Quotes is handled by the field automatically) + schema: + type: string + default: "" + - variable: mode + label: Game Mode + description: | + The game mode of the Minecraft server.
+ https://itzg.github.io/docker-minecraft-docs/java/configuration/gamemode + schema: + type: string + default: "survival" + required: true + enum: + - value: survival + description: Survival + - value: creative + description: Creative + - value: adventure + description: Adventure + - value: spectator + description: Spectator + - variable: levelType + label: Level Type + description: | + The level type of the Minecraft server.
+ https://itzg.github.io/docker-minecraft-docs/java/configuration/#level-type-and-generator-settings + schema: + type: string + default: "minecraft:default" + required: true + enum: + - value: minecraft:default + description: Default + - value: minecraft:flat + description: Flat + - value: minecraft:large_biomes + description: Large Biomes + - value: minecraft:amplified + description: Amplified + - value: minecraft:single_biome_surface + description: Single Biome Surface + - value: buffet + description: Buffet + - value: customized + description: Customized + - variable: motd + label: Message of the Day + description: | + The message of the day for the Minecraft server.
+ https://itzg.github.io/docker-minecraft-docs/java/configuration/motd + schema: + type: string + default: "Welcome to Minecraft on TrueNAS!" + required: true + - variable: enableRcon + label: Enable RCON + description: | + Enable RCON for the Minecraft server.
+ It is recommended to keep this enabled, as it helps to + shut down the minecraft server gracefully.
+ https://itzg.github.io/docker-minecraft-docs/java/rcon + schema: + type: boolean + default: true + - variable: rconPassword + label: RCON Password + description: The RCON password for the Minecraft server. + schema: + type: string + default: "" + show_if: [["enableRcon", "=", true]] + private: true + required: true + - variable: maxPlayers + label: Max Players + description: | + The maximum number of players that can join the server.
+ https://itzg.github.io/docker-minecraft-docs/java/configuration/maxplayers + schema: + type: int + default: 20 + min: 1 + required: true + - variable: maxWorldSize + label: Max World Size + description: | + The maximum possible size in blocks, expressed as a radius.
+ https://itzg.github.io/docker-minecraft-docs/java/configuration/maxworldsize + schema: + type: int + default: 10000 + min: 1 + required: true + - variable: maxBuildHeight + label: Max Build Height + description: | + The maximum height in which building is allowed. + Terrain may still naturally generate above a low height limit.
+ https://itzg.github.io/docker-minecraft-docs/java/configuration/maxbuildheight + schema: + type: int + default: 256 + min: 1 + required: true + - variable: allowNether + label: Allow Nether + description: | + Allows players to travel to the Nether.
+ https://itzg.github.io/docker-minecraft-docs/java/configuration/allownether + schema: + type: boolean + default: true + - variable: announcePlayerAchievements + label: Announce Player Achievements + description: | + Allows server to announce when a player gets an achievement.
+ https://itzg.github.io/docker-minecraft-docs/java/configuration/announceachievements + schema: + type: boolean + default: true + - variable: enableCommandBlock + label: Enable Command Block + description: | + Enables the command blocks.
+ https://itzg.github.io/docker-minecraft-docs/java/configuration/enablecommandblock + schema: + type: boolean + default: false + - variable: forceGameMode + label: Force Game Mode + description: | + Force players to join in the default game mode.
+ https://itzg.github.io/docker-minecraft-docs/java/configuration/forcegamemode + schema: + type: boolean + default: false + - variable: generateStructures + label: Generate Structures + description: | + Defines whether structures (such as villages) will be generated.
+ https://itzg.github.io/docker-minecraft-docs/java/configuration/generatestructures + schema: + type: boolean + default: true + - variable: hardcore + label: Hardcore + description: | + If set to true, players will be set to spectator mode if they die.
+ https://itzg.github.io/docker-minecraft-docs/java/configuration/hardcore + schema: + type: boolean + default: false + - variable: spawnAnimals + label: Spawn Animals + description: | + Determines if animals will be able to spawn.
+ https://itzg.github.io/docker-minecraft-docs/java/configuration/spawnanimals + schema: + type: boolean + default: true + - variable: spawnNpcs + label: Spawn NPCs + description: | + Determines if villagers will be spawned.
+ https://itzg.github.io/docker-minecraft-docs/java/configuration/spawnnpcs + schema: + type: boolean + default: true + - variable: spawnMonsters + label: Spawn Monsters + description: | + Determines if monsters will be spawned.
+ https://itzg.github.io/docker-minecraft-docs/java/configuration/spawnmonsters + schema: + type: boolean + default: true + - variable: spawnProtection + label: Spawn Protection + description: | + The radius of the spawn protection.
+ https://itzg.github.io/docker-minecraft-docs/java/configuration/spawnprotection + schema: + type: int + default: 16 + min: 0 + required: true + - variable: pvp + label: PVP + description: | + Determines if PVP will be enabled.
+ https://itzg.github.io/docker-minecraft-docs/java/configuration/pvp + schema: + type: boolean + default: true + - variable: allowFlight + label: Allow Flight + description: | + Allows users to use flight on your server while in Survival mode, + if they have a mod that provides flight installed.
+ https://itzg.github.io/docker-minecraft-docs/java/configuration/allowflight + schema: + type: boolean + default: false + - variable: viewDistance + label: View Distance + description: | + Sets the amount of world data the server sends the client, + measured in chunks in each direction of the player (radius, not diameter). + It determines the server-side viewing distance.
+ https://itzg.github.io/docker-minecraft-docs/java/configuration/viewdistance + schema: + type: int + default: 10 + min: 3 + max: 32 + required: true + - variable: onlineMode + label: Online Mode + description: | + If set to true, the server will attempt to authenticate clients + connecting to it with the Minecraft account database.
+ https://itzg.github.io/docker-minecraft-docs/java/configuration/onlinemode + schema: + type: boolean + default: true + - variable: maxTickTime + label: Max Tick Time + description: | + The maximum number of milliseconds a single tick may take + before the server watchdog stops the server with the message, + A single server tick took 60.00 seconds (should be max 0.05); + Considering it to be crashed, server will forcibly shutdown.
+ https://itzg.github.io/docker-minecraft-docs/java/configuration/maxticktime + schema: + type: int + default: 60000 + min: 0 + required: true + - variable: ops + label: Operators / Administrators + description: | + A list of player names who should be considered operators.
+ https://itzg.github.io/docker-minecraft-docs/java/configuration/ops + schema: + type: list + default: [] + items: + - variable: opPlayer + label: OP Player + schema: + type: string + default: "" + required: true + - variable: whitelist + label: Whitelist + description: | + A list of player names who are allowed to play on the server.
+ https://itzg.github.io/docker-minecraft-docs/java/configuration/whitelist + schema: + type: list + default: [] + items: + - variable: whitePlayer + label: Whitelisted Player + schema: + type: string + default: "" + required: true + - variable: additionalEnvs + label: Additional Environment Variables + description: Configure additional environment variables for Minecraft. + schema: + type: list + default: [] + items: + - variable: env + label: Environment Variable + schema: + type: dict + attrs: + - variable: name + label: Name + schema: + type: string + required: true + - variable: value + label: Value + schema: + type: string + required: true + - variable: mcID + label: "" + group: User and Group Configuration + schema: + type: dict + attrs: + - variable: user + label: User ID + description: The user id that Minecraft files will be owned by. + schema: + type: int + min: 568 + default: 568 + required: true + - variable: group + label: Group ID + description: The group id that Minecraft files will be owned by. + schema: + type: int + min: 568 + default: 568 + required: true + + - variable: mcNetwork + label: "" + group: Network Configuration + schema: + type: dict + attrs: + - variable: hostNetwork + label: Host Network + description: | + Bind to the host network. It's recommended to keep this disabled.
+ schema: + type: boolean + default: false + - variable: serverPort + label: Server Port + description: | + The port for the Minecraft Server.
+ This will apply to both external and internal ports. + schema: + type: int + default: 25535 + min: 9000 + max: 65535 + required: true + - variable: rconPort + label: RCON Port + description: | + The RCON port for the Minecraft.
+ This will apply to both external and internal ports. + schema: + type: int + default: 25575 + min: 9000 + max: 65535 + required: true + + - variable: mcStorage + label: "" + group: Storage Configuration + schema: + type: dict + attrs: + - variable: data + label: Minecraft Data Storage + description: The path to store Minecraft Data. + schema: + type: dict + attrs: + - variable: type + label: Type + description: | + ixVolume: Is dataset created automatically by the system.
+ Host Path: Is a path that already exists on the system. + schema: + type: string + required: true + default: "ixVolume" + enum: + - value: "hostPath" + description: Host Path (Path that already exists on the system) + - value: "ixVolume" + description: ixVolume (Dataset created automatically by the system) + - variable: datasetName + label: Dataset Name + schema: + type: string + show_if: [["type", "=", "ixVolume"]] + required: true + hidden: true + immutable: true + default: "data" + $ref: + - "normalize/ixVolume" + - variable: hostPath + label: Host Path + schema: + type: hostpath + show_if: [["type", "=", "hostPath"]] + immutable: true + required: true + - variable: additionalStorages + label: Additional Storage + description: Additional storage for Minecraft. + schema: + type: list + default: [] + items: + - variable: storageEntry + label: Storage Entry + schema: + type: dict + attrs: + - variable: type + label: Type + description: | + ixVolume: Is dataset created automatically by the system.
+ Host Path: Is a path that already exists on the system. + schema: + type: string + required: true + default: "ixVolume" + enum: + - value: "hostPath" + description: Host Path (Path that already exists on the system) + - value: "ixVolume" + description: ixVolume (Dataset created automatically by the system) + - variable: mountPath + label: Mount Path + description: The path inside the container to mount the storage. + schema: + type: path + required: true + - variable: hostPath + label: Host Path + description: The host path to use for storage. + schema: + type: hostpath + show_if: [["type", "=", "hostPath"]] + required: true + - variable: datasetName + label: Dataset Name + description: The name of the dataset to use for storage. + schema: + type: string + show_if: [["type", "=", "ixVolume"]] + required: true + immutable: true + default: "storage_entry" + $ref: + - "normalize/ixVolume" + + - variable: resources + group: Resources Configuration + label: "" + schema: + type: dict + attrs: + - variable: limits + label: Limits + schema: + type: dict + attrs: + - variable: cpu + label: CPU + description: CPU limit for Minecraft. + schema: + type: string + default: "4000m" + required: true + - variable: memory + label: Memory + description: Memory limit for Minecraft. + schema: + type: string + default: "8Gi" + required: true diff --git a/library/ix-dev/community/minecraft/templates/NOTES.txt b/library/ix-dev/community/minecraft/templates/NOTES.txt new file mode 100644 index 0000000000..ba4e01146c --- /dev/null +++ b/library/ix-dev/community/minecraft/templates/NOTES.txt @@ -0,0 +1 @@ +{{ include "ix.v1.common.lib.chart.notes" $ }} diff --git a/library/ix-dev/community/minecraft/templates/_configuration.tpl b/library/ix-dev/community/minecraft/templates/_configuration.tpl new file mode 100644 index 0000000000..b2b020b64e --- /dev/null +++ b/library/ix-dev/community/minecraft/templates/_configuration.tpl @@ -0,0 +1,83 @@ +{{- define "minecraft.configuration" -}} +{{- include "minecraft.validation" $ }} +configmap: + minecraft-config: + enabled: true + data: + {{/* + There is no GUI in the container, + but some old versions think that there is + */}} + GUI: "FALSE" + EULA: {{ .Values.mcConfig.eula | quote | upper }} + ENABLE_RCON: {{ .Values.mcConfig.enableRcon | quote | upper }} + SERVER_PORT: {{ .Values.mcNetwork.serverPort | quote }} + {{ if .Values.mcConfig.enableRcon }} + RCON_PORT: {{ .Values.mcNetwork.rconPort | quote }} + RCON_PASSWORD: {{ .Values.mcConfig.rconPassword | quote }} + {{ end }} + VERSION: {{ .Values.mcConfig.version | quote }} + TYPE: {{ .Values.mcConfig.type | quote }} + {{ with .Values.mcConfig.seed }} + SEED: {{ . | quote }} + {{ end }} + MOTD: {{ .Values.mcConfig.motd | quote }} + DIFFICULTY: {{ .Values.mcConfig.difficulty | quote }} + SERVER_NAME: {{ .Values.mcConfig.serverName | quote }} + MAX_PLAYERS: {{ .Values.mcConfig.maxPlayers | quote }} + MAX_WORLD_SIZE: {{ .Values.mcConfig.maxWorldSize | quote }} + ALLOW_NETHER: {{ .Values.mcConfig.allowNether | quote | upper }} + ANNOUNCE_PLAYER_ACHIEVEMENTS: {{ .Values.mcConfig.announcePlayerAchievements | quote | upper }} + ENABLE_COMMAND_BLOCK: {{ .Values.mcConfig.enableCommandBlock | quote | upper }} + FORCE_GAMEMODE: {{ .Values.mcConfig.forceGameMode | quote | upper }} + GENERATE_STRUCTURES: {{ .Values.mcConfig.generateStructures | quote | upper }} + HARDCORE: {{ .Values.mcConfig.hardcore | quote | upper }} + MAX_BUILD_HEIGHT: {{ .Values.mcConfig.maxBuildHeight | quote }} + SPAWN_ANIMALS: {{ .Values.mcConfig.spawnAnimals | quote | upper }} + SPAWN_MONSTERS: {{ .Values.mcConfig.spawnMonsters | quote | upper }} + SPAWN_NPCS: {{ .Values.mcConfig.spawnNpcs | quote | upper }} + SPAWN_PROTECTION: {{ .Values.mcConfig.spawnProtection | quote }} + VIEW_DISTANCE: {{ .Values.mcConfig.viewDistance | quote }} + PVP: {{ .Values.mcConfig.pvp | quote | upper }} + LEVEL_TYPE: {{ .Values.mcConfig.levelType | quote }} + ALLOW_FLIGHT: {{ .Values.mcConfig.allowFlight | quote | upper }} + ONLINE_MODE: {{ .Values.mcConfig.onlineMode | quote | upper }} + MAX_TICK_TIME: {{ .Values.mcConfig.maxTickTime | quote }} + {{ with .Values.mcConfig.ops }} + OPS: {{ join "," . | quote }} + {{ end }} + {{ with .Values.mcConfig.whitelist }} + WHITELIST: {{ join "," . | quote }} + {{ end }} +{{- end -}} + +{{- define "minecraft.validation" -}} + {{- if not .Values.mcConfig.eula -}} + {{- fail "Minecraft - You have to accept EULA" -}} + {{- end -}} + + {{- $types := (list "VANILLA" "SPIGOT" "BUKKIT" "CATSERVER" "CRUCIBLE" + "AUTO_CURSEFORGE" "CUSTOM" "FABRIC" "FTBA" "FORGE" + "LOLISERVER" "LIMBO" "MAGMA" "MOHIST" "FABRIC" "PAPER" + "PUFFERFISH" "PURPUR" "QUILT") -}} + {{- if not (mustHas .Values.mcConfig.type $types) -}} + {{- fail (printf "Minecraft - Expected [Type] to be one of [%s], but got [%s]" (join ", " $types) .Values.mcConfig.type) -}} + {{- end -}} + + {{- $difficulties := (list "peaceful" "easy" "normal" "hard") -}} + {{- if not (mustHas .Values.mcConfig.difficulty $difficulties) -}} + {{- fail (printf "Minecraft - Expected [Difficulty] to be one of [%s], but got [%s]" (join ", " $difficulties) .Values.mcConfig.difficulty) -}} + {{- end -}} + + {{- $modes := (list "creative" "survival" "adventure" "spectator") -}} + {{- if not (mustHas .Values.mcConfig.mode $modes) -}} + {{- fail (printf "Minecraft - Expected [Mode] to be one of [%s], but got [%s]" (join ", " $modes) .Values.mcConfig.mode) -}} + {{- end -}} + + {{- $lvlTypes := (list "minecraft:default" "minecraft:flat" "minecraft:large_biomes" + "minecraft:amplified" "minecraft:single_biome_surface" "buffet" "customized") -}} + {{- if not (mustHas .Values.mcConfig.levelType $lvlTypes) -}} + {{- fail (printf "Minecraft - Expected [Level Type] to be one of [%s], but got [%s]" (join ", " $lvlTypes) .Values.mcConfig.levelType) -}} + {{- end -}} + +{{- end -}} diff --git a/library/ix-dev/community/minecraft/templates/_minecraft.tpl b/library/ix-dev/community/minecraft/templates/_minecraft.tpl new file mode 100644 index 0000000000..6d50a6ce5d --- /dev/null +++ b/library/ix-dev/community/minecraft/templates/_minecraft.tpl @@ -0,0 +1,98 @@ +{{- define "minecraft.workload" -}} +workload: + minecraft: + enabled: true + primary: true + type: Deployment + podSpec: + hostNetwork: {{ .Values.mcNetwork.hostNetwork }} + securityContext: + fsGroup: {{ .Values.mcID.group }} + containers: + minecraft: + enabled: true + primary: true + tty: true + stdin: true + imageSelector: {{ .Values.mcConfig.imageSelector }} + securityContext: + runAsUser: 0 + runAsGroup: 0 + readOnlyRootFilesystem: false + runAsNonRoot: false + capabilities: + add: + - CHOWN + - DAC_OVERRIDE + - FOWNER + - SETUID + - SETGID + fixedEnv: + PUID: {{ .Values.mcID.user }} + envFrom: + - configMapRef: + name: minecraft-config + {{ with .Values.mcConfig.additionalEnvs }} + envList: + {{ range $env := . }} + - name: {{ $env.name }} + value: {{ $env.value }} + {{ end }} + {{ end }} + probes: + liveness: + enabled: true + type: exec + command: mc-health + readiness: + enabled: true + type: exec + command: mc-health + startup: + enabled: true + type: exec + command: mc-health + initialDelaySeconds: 120 +{{/* Service */}} +service: + minecraft: + enabled: true + primary: true + type: NodePort + targetSelector: minecraft + ports: + server: + enabled: true + primary: true + port: {{ .Values.mcNetwork.serverPort }} + nodePort: {{ .Values.mcNetwork.serverPort }} + targetSelector: minecraft + rcon: + enabled: {{ .Values.mcConfig.enableRcon }} + port: {{ .Values.mcNetwork.rconPort }} + nodePort: {{ .Values.mcNetwork.rconPort }} + targetSelector: minecraft + +{{/* Persistence */}} +persistence: + data: + enabled: true + type: {{ .Values.mcStorage.data.type }} + datasetName: {{ .Values.mcStorage.data.datasetName | default "" }} + hostPath: {{ .Values.mcStorage.data.hostPath | default "" }} + targetSelector: + minecraft: + minecraft: + mountPath: /data + {{- range $idx, $storage := .Values.mcStorage.additionalStorages }} + {{ printf "mc-%v" (int $idx) }}: + enabled: true + type: {{ $storage.type }} + datasetName: {{ $storage.datasetName | default "" }} + hostPath: {{ $storage.hostPath | default "" }} + targetSelector: + minecraft: + minecraft: + mountPath: {{ $storage.mountPath }} + {{- end }} +{{- end -}} diff --git a/library/ix-dev/community/minecraft/templates/common.yaml b/library/ix-dev/community/minecraft/templates/common.yaml new file mode 100644 index 0000000000..bcda9c575c --- /dev/null +++ b/library/ix-dev/community/minecraft/templates/common.yaml @@ -0,0 +1,7 @@ +{{- include "ix.v1.common.loader.init" . -}} + +{{/* Merge the templates with Values */}} +{{- $_ := mustMergeOverwrite .Values (include "minecraft.configuration" $ | fromYaml) -}} +{{- $_ := mustMergeOverwrite .Values (include "minecraft.workload" $ | fromYaml) -}} + +{{- include "ix.v1.common.loader.apply" . -}} diff --git a/library/ix-dev/community/minecraft/upgrade_info.json b/library/ix-dev/community/minecraft/upgrade_info.json new file mode 100644 index 0000000000..767388094a --- /dev/null +++ b/library/ix-dev/community/minecraft/upgrade_info.json @@ -0,0 +1 @@ +{"filename": "values.yaml", "keys": ["image"]} diff --git a/library/ix-dev/community/minecraft/upgrade_strategy b/library/ix-dev/community/minecraft/upgrade_strategy new file mode 100755 index 0000000000..41e9448b21 --- /dev/null +++ b/library/ix-dev/community/minecraft/upgrade_strategy @@ -0,0 +1,31 @@ +#!/usr/bin/python3 +import json +import re +import sys + +from catalog_update.upgrade_strategy import semantic_versioning + + +RE_STABLE_VERSION = re.compile(r'[0-9]+\.[0-9]+\.[0-9]+') + + +def newer_mapping(image_tags): + key = list(image_tags.keys())[0] + tags = {t: t for t in image_tags[key] if RE_STABLE_VERSION.fullmatch(t)} + version = semantic_versioning(list(tags)) + if not version: + return {} + + return { + 'tags': {key: tags[version]}, + 'app_version': version, + } + + +if __name__ == '__main__': + try: + versions_json = json.loads(sys.stdin.read()) + except ValueError: + raise ValueError('Invalid json specified') + + print(json.dumps(newer_mapping(versions_json))) diff --git a/library/ix-dev/community/minecraft/values.yaml b/library/ix-dev/community/minecraft/values.yaml new file mode 100644 index 0000000000..54d8e2fdd2 --- /dev/null +++ b/library/ix-dev/community/minecraft/values.yaml @@ -0,0 +1,105 @@ +j8Image: + repository: itzg/minecraft-server + pullPolicy: IfNotPresent + tag: '2023.3.0-java8' +j8gceImage: + repository: itzg/minecraft-server + pullPolicy: IfNotPresent + tag: '2023.3.0-java8-graalvm-ce' +j8j9Image: + repository: itzg/minecraft-server + pullPolicy: IfNotPresent + tag: '2023.3.0-java8-openj9' +j8jdkImage: + repository: itzg/minecraft-server + pullPolicy: IfNotPresent + tag: '2023.3.0-java8-jdk' +j11Image: + repository: itzg/minecraft-server + pullPolicy: IfNotPresent + tag: '2023.3.0-java11' +j11j9Image: + repository: itzg/minecraft-server + pullPolicy: IfNotPresent + tag: '2023.3.0-java11-openj9' +j11jdkImage: + repository: itzg/minecraft-server + pullPolicy: IfNotPresent + tag: '2023.3.0-java11-jdk' +j17Image: + repository: itzg/minecraft-server + pullPolicy: IfNotPresent + tag: '2023.3.0-java17' +j17j9Image: + repository: itzg/minecraft-server + pullPolicy: IfNotPresent + tag: '2023.3.0-java17-openj9' +j17jdkImage: + repository: itzg/minecraft-server + pullPolicy: IfNotPresent + tag: '2023.3.0-java17-jdk' +j17gceImage: + repository: itzg/minecraft-server + pullPolicy: IfNotPresent + tag: '2023.3.0-java17-graalvm-ce' +j17alpineImage: + repository: itzg/minecraft-server + pullPolicy: IfNotPresent + tag: '2023.3.0-java17-alpine' +j19Image: + repository: itzg/minecraft-server + pullPolicy: IfNotPresent + tag: '2023.3.0-java19' + +resources: + limits: + cpu: 4000m + memory: 8Gi + +mcConfig: + eula: false + imageSelector: j17Image + version: LATEST + type: VANILLA + serverName: Minecraft Server + seed: '' + mode: survival + levelType: minecraft:default + difficulty: easy + pvp: true + motd: Welcome to Minecraft on TrueNAS! + enableRcon: false + rconPassword: '' + maxPlayers: 20 + maxWorldSize: 10000 + allowNether: true + announcePlayerAchievements: true + enableCommandBlock: false + forceGameMode: false + generateStructures: true + hardcore: false + maxBuildHeight: 256 + spawnAnimals: true + spawnMonsters: true + spawnNpcs: true + spawnProtection: 16 + viewDistance: 10 + allowFlight: false + onlineMode: true + maxTickTime: 60000 + ops: [] + whitelist: [] + additionalEnvs: [] +mcID: + user: 568 + group: 568 +mcNetwork: + hostNetwork: false + serverPort: 25565 + rconPort: 25575 +mcStorage: + data: + type: ixVolume + hostPath: '' + datasetName: data + additionalStorages: []